--- a/bintools/evalid/EvalidCompare.pm Mon Sep 20 10:55:43 2010 +0100
+++ b/bintools/evalid/EvalidCompare.pm Mon Oct 18 10:23:52 2010 +0100
@@ -240,7 +240,7 @@
open (FILE, $file) or die "Error: Couldn't open \"$file\" for reading: $!\n";
binmode (FILE);
- while ($typeBuf =~ /^.{48}([0-9 ]{9})\x60\x0A(......)/s) {
+ while ($typeBuf =~ /^.{48}([0-9 ]{9}).\x60\x0A(......)/s) {
# $1 is the size of the archive member, $2 is first 6 bytes of the file
# There may be several different sorts of file in the archive, and we
# need to scan through until we find a type we recognize:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/EvalidCompare.pm.bak Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1068 @@
+#
+# Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+package EvalidCompare;
+
+use strict;
+our $VERSION = '1.00';
+use IO::Handle;
+use IO::File;
+use Cwd;
+
+use File::Temp qw/ tempfile tempdir /;
+use File::Find;
+use File::Path;
+use File::Basename;
+use File::Copy;
+
+#
+# Constants.
+#
+
+my %typeLookup = (
+ 'ARM PE-COFF executable' => 'ignore',
+ 'E32 EXE' => 'e32',
+ 'E32 DLL' => 'e32',
+ 'Uncompressed E32 EXE' => 'e32',
+ 'Uncompressed E32 DLL' => 'e32',
+ 'Compressed E32 EXE' => 'e32',
+ 'Compressed E32 DLL' => 'e32',
+ 'Intel DLL' => 'intel_pe',
+ 'Intel EXE' => 'intel_pe',
+ 'MSDOS EXE' => 'intel_pe',
+ 'Intel object' => 'intel',
+ 'Intel library' => 'intel',
+ 'ELF library' => 'elf',
+ 'ARM object' => 'arm',
+ 'ARM library' => 'arm',
+ 'unknown format' => 'identical',
+ 'Java class' => 'identical',
+ 'ZIP file' => 'zip',
+ 'Permanent File Store' => 'permanent_file_store',
+ 'SIS file' => 'identical',
+ 'MSVC database' => 'ignore',
+ 'MAP file' => 'map',
+ 'SGML file' => 'sgml',
+ 'Preprocessed text' => 'preprocessed_text',
+ 'ELF file' => 'elf',
+ 'Unknown COFF object' => 'identical',
+ 'Unknown library' => 'identical',
+ 'chm file' => 'chm_file',
+ 'Header file' => 'header',
+ 'Distribution Policy' => 'distpol'
+ );
+
+
+# %TEMPDIR% and %FILE% are magic words for the expandor
+# they will be replaced with suitable values when used
+# they also enabled an order of expandor arguments where the filename is not last
+my %typeHandler = (
+ e32 => {reader => 'elf2e32 --dump --e32input=', filter => \&Elf2E32Filter},
+ arm => {reader => 'nm --no-sort', filter => \&NmFilter, retry => 1, relative_paths => 1},
+ elf => {reader => 'elfdump -i', filter => \&ElfDumpFilter, rawretry => 1},
+ intel => {reader => '%EPOCROOT%epoc32\gcc_mingw\bin\nm --no-sort', filter => \&NmFilter, rawretry => 1, relative_paths => 1, skipstderr => 1},
+ intel_pe => {reader => 'pe_dump', filter => \&FilterNone, rawretry => 1},
+ zip => {reader => '"'.$FindBin::Bin.'/unzip" -l -v', filter => \&UnzipFilter, rawretry => 1},
+ map => {filter => \&MapFilter, skipblanks => 1},
+ sgml => {filter => \&SgmlFilter},
+ preprocessed_text => {filter => \&PreprocessedTextFilter},
+ permanent_file_store => {reader => 'pfsdump -c -v', filter => \&PermanentFileStoreFilter, rawretry => 1, relative_paths => 1},
+ ignore => {filter => \&FilterAll},
+ chm_file => {expandor => 'hh -decompile %TEMPDIR% %FILE%', rawretry => 1},
+ header => {filter => \&FilterCVSTags},
+ distpol => {filter => \&DistributionPolicyFilter}
+ );
+
+
+#
+# Globals.
+#
+
+my $log;
+my $verbose;
+my $toRoot;
+my $dumpDir;
+
+undef $dumpDir;
+
+
+#
+# Public.
+#
+
+sub CompareFiles {
+ my $file1 = shift;
+ my $file2 = shift;
+ $verbose = defined($_[0]) ? shift : 0;
+ $log = defined($_[0]) ? shift : *STDOUT;
+ # Try binary compare first (to keep semantics the same as evalid)...
+ if (DoCompareFiles($file1, $file2, 'unknown format')) {
+ return 1,'identical';
+ }
+ my $type = IdentifyFileType($file1);
+ if ($typeLookup{$type} eq 'identical') {
+ return 0,$type; # We already know a binary compare is going to return false.
+ }
+ return DoCompareFiles($file1, $file2, $type),$type;
+}
+
+sub GenerateSignature {
+ my $file = shift;
+ $dumpDir = shift;
+ $verbose = defined($_[0]) ? shift : 0;
+ $log = defined($_[0]) ? shift : *STDOUT;
+ my $md5;
+
+ if (eval "require Digest::MD5") { # Prefer Digest::MD5, if available.
+ $md5 = Digest::MD5->new();
+ } elsif (eval "require MD5") { # Try old version of MD5, if available.
+ $md5 = new MD5;
+ } elsif (eval "require Digest::Perl::MD5") { # Try Perl (Slow) version of MD5, if available.
+ $md5 = Digest::Perl::MD5->new();
+ } else {
+ die "Error: Cannot load any MD5 Modules";
+ }
+
+ my $type = IdentifyFileType($file);
+ WriteFilteredData($file, $type, $md5);
+ return $md5->hexdigest(), $type;
+}
+
+
+#
+# Private.
+#
+
+sub IdentifyFileType {
+ my $file = shift;
+ open (FILE, $file) or die "Error: Couldn't open \"$file\" for reading: $!\n";
+ binmode (FILE);
+ my $typeBuf;
+ read (FILE, $typeBuf, 512);
+ close (FILE);
+ my ($uid1, $uid2, $uid3, $checksum) = unpack "V4", $typeBuf;
+
+ # NB. Need to use the s modifier so that '.' will match \x0A
+
+ if ($typeBuf =~ /^.\x00\x00\x10.{12}EPOC.{8}(....).{12}(.)..(.)/s) {
+ # E32 Image file with a 0x100000?? UID1
+ # $2 is the flag field indicating an EXE or a DLL
+ # $3 is the flag byte indicating compressable executables
+ # $1 is the format field indicating compression type
+ # See e32tools\inc\e32image.h
+ #
+ my $typename = "E32 EXE";
+ if ((ord $2) & 0x1) {
+ $typename = "E32 DLL";
+ }
+ if ((ord $3) >= 0x1) {
+ if ((ord $1) != 0) {
+ $typename = "Compressed $typename";
+ }
+ else {
+ $typename = "Uncompressed $typename";
+ }
+ }
+ return $typename;
+ }
+
+ if ($typeBuf =~ /^\x4D\x5A.{38}\x00{20}(....)/s) {
+ # A standard 64-byte MS-DOS header with e_magic == IMAGE_DOS_SIGNATURE
+ # $1 is e_lfanew, which we expect to point to a COFF header
+
+ my $offset = unpack "V",$1;
+ if ($offset + 24 <= length $typeBuf) {
+ $typeBuf = substr $typeBuf, $offset;
+ }
+ else {
+ open FILE, $file or die "Error: Couldn't open \"$file\" for reading: $!\n";
+ binmode FILE;
+ seek FILE, $offset, 0;
+ read FILE, $typeBuf, 512;
+ close FILE;
+ }
+
+ if ($typeBuf =~ /^PE\0\0\x4c\x01.{16}(..)/s) {
+ # A PE signature "PE\0\0" followed by a COFF header with
+ # machine type IMAGE_FILE_MACHINE_I386
+ # $1 is the characteristics field
+ #
+ if ((unpack "v",$1) & 0x2000) {
+ return "Intel DLL";
+ }
+ else {
+ return "Intel EXE";
+ }
+ }
+ elsif($typeBuf =~ /^PE\0\0\0\x0a/) {
+ # A PE signature "PE\0\0" followed by ARM COFF file magic value 0xA00
+ return "ARM PE-COFF executable";
+ }
+ else {
+ return "MSDOS EXE";
+ }
+ }
+
+ if ($typeBuf =~ /^(\x4c\x01|\x00\x0A).(\x00|\x01).{4}...\x00/s) {
+ # COFF header with less than 512 sections and a symbol table
+ # at an offset no greater than 0x00ffffff
+
+ if ($1 eq "\x4c\x01") {
+ return "Intel object";
+ }
+ elsif ($1 eq "\x00\x0A") {
+ return "ARM object";
+ }
+ else {
+ return "Unknown COFF object";
+ }
+ }
+
+ if ($typeBuf =~ /^!<arch>\x0A(.{48}([0-9 ]{9})\x60\x0A(......))/s) {
+ # library - could be MARM or WINS
+
+ $typeBuf = $1;
+ my $member_start = 8;
+
+ open (FILE, $file) or die "Error: Couldn't open \"$file\" for reading: $!\n";
+ binmode (FILE);
+
+ while ($typeBuf =~ /^.{48}([0-9 ]{9})\x60\x0A(......)/s) {
+ # $1 is the size of the archive member, $2 is first 6 bytes of the file
+ # There may be several different sorts of file in the archive, and we
+ # need to scan through until we find a type we recognize:
+ # $2 == 0x0A00 would be ARM COFF, 0x014C would be Intel COFF
+ if ($2 =~ /^\x00\x0A/) {
+ close FILE;
+ return "ARM library";
+ }
+ if ($2 =~ /^\x4C\x01/) {
+ close FILE;
+ return "Intel library";
+ }
+ my $elfBuf = $2;
+ if ($2 =~ /^\x7F\x45\x4C\x46/) {
+ close FILE;
+ my $dataEncodingLib = substr($elfBuf, 5, 6);
+ if ( $dataEncodingLib =~ /^\x02/) {
+ # e_ident[EI_DATA] == 2 (Data Encoding ELFDATA2MSB - big endian)
+ # this is not supported by Elfdump hence it is treated as 'unknown format'
+ return 'unknown library';
+ }
+ else {
+ return "ELF library";
+ }
+ }
+
+ $member_start += 60 + $1;
+ if ($member_start & 0x1) {
+ $member_start += 1; # align to multiple of 2 bytes
+ }
+ seek FILE, $member_start, 0;
+ read FILE, $typeBuf, 512;
+ }
+ close FILE;
+ return "Unknown library";
+ }
+
+ if ($typeBuf =~ /^\xCA\xFE\xBA\xBE/) {
+ # Java class file - should have match as a straight binary comparison
+ return "Java class";
+ }
+
+ if ($typeBuf =~ /^PK\x03\x04/) {
+ # ZIP file
+ return "ZIP file";
+ }
+
+ if ($uid1 && $uid1==0x10000050) {
+ # Permanent File Store
+ return "Permanent File Store";
+ }
+
+ if ($uid1 && $uid2 && $uid3 && $checksum && $uid3==0x10000419) {
+ if (($uid1==0x100002c3 && $uid2==0x1000006d && $checksum==0x128ca96f) # narrow
+ || ($uid1==0x10003b0b && $uid2==0x1000006d && $checksum==0x75e21a1d) # unicode
+ || ($uid1==0x10009205 && $uid2==0x10003a12 && $checksum==0x986a0c25)) # new format
+ {
+ # SIS file
+ return "SIS file";
+ }
+ }
+
+ if ($typeBuf =~ /^Microsoft [^\x0A]+ [Dd]atabase/s) {
+ return "MSVC database";
+ }
+
+ if ($typeBuf =~ /^\S.+ needed due to / || $typeBuf =~ /^Archive member included.*because of file/) {
+ # GCC MAP file
+ return "MAP file";
+ }
+
+ if ($typeBuf =~ /Preferred load address is/) {
+ # Developer Studio MAP file
+ return "MAP file";
+ }
+
+ if ($typeBuf =~ /^Address\s+Size\s+Name\s+Subname\s+Module/) {
+ # CodeWarrior MAP file
+ return "MAP file";
+ }
+
+ if ($typeBuf =~ /^ARM Linker,/) {
+ # RVCT MAP file
+ return "MAP file";
+ }
+
+ if ($typeBuf =~ /<!DOCTYPE/i) {
+ # XML or HTML file - need to ignore javadoc generation dates
+ return "SGML file";
+ }
+
+ if ($typeBuf =~ /^# 1 ".*"(\x0D|\x0A)/s) {
+ # Output of CPP
+ return "Preprocessed text";
+ }
+
+ if ($typeBuf =~ /^\x7F\x45\x4C\x46/) {
+ my $dataEncoding = substr($typeBuf, 5, 6);
+ if ( $dataEncoding =~ /^\x02/) {
+ # e_ident[EI_DATA] == 2 (Data Encoding ELFDATA2MSB - big endian)
+ # this is not supported by Elfdump hence it is treated as 'unknown format'
+ return 'unknown format';
+ }
+ else {
+ return "ELF file";;
+ }
+ }
+
+ if ($typeBuf =~/^ITSF/) {
+ # chm file
+ return "chm file";
+ }
+
+ if ($file =~ m/\.(iby|h|hby|hrh|oby|rsg|cpp)$/i) {
+ return "Header file";
+ }
+
+ if ($file =~ /distribution\.policy$/i) {
+ return "Distribution Policy"
+ }
+
+ return 'unknown format';
+}
+
+sub WriteFilteredData {
+ my $file = shift;
+ my $type = shift;
+ my $md5 = shift;
+ my $dumpDirExpandedFile = shift;
+
+ my (@dumpDirBuffer);
+
+ unless (exists $typeLookup{$type}) {
+ die "Invalid file type \"$type\"";
+ }
+ $type = $typeLookup{$type};
+
+ # Check to see if this file type requires expanding first
+ if (exists $typeHandler{$type}->{expandor})
+ {
+ my $expandor = $typeHandler{$type}->{expandor};
+ # Create two temporary directories
+ my $tempdir = tempdir ( "EvalidExpand_XXXXXX", DIR => File::Spec->tmpdir, CLEANUP => 1);
+
+ # Build the Expandor commandline
+ $expandor =~ s/%TEMPDIR%/$tempdir/g;
+ $expandor =~ s/%FILE%/$file/g;
+
+ # Expand files
+ my $output = `$expandor 2>&1`;
+ print($log "Expanding using $expandor output was:-\n$output") if ($verbose);
+ if ($? > 0)
+ {
+ print ($log "$expandor exited with $?") if ($verbose);
+ # set type to be identical for retry if raw
+ if ($typeHandler{$type}->{rawretry} == 1)
+ {
+ $type = 'identical';
+ } else {
+ print "ERROR: failed to start $expandor (" .($?). ") - reporting failure\n";
+ }
+ } else {
+ # Process all files in $tempdir
+ my @FileList;
+ find(sub { push @FileList, $File::Find::name if (! -d);}, $tempdir);
+ foreach my $expandfile (@FileList)
+ {
+ my $dumpDirExpandedFilename = "";
+
+ if ($dumpDir)
+ {
+ $dumpDirExpandedFilename = $expandfile;
+ $dumpDirExpandedFilename =~ s/^.*EvalidExpand_\w+//;
+ $dumpDirExpandedFilename = $file.$dumpDirExpandedFilename;
+ }
+
+ my $type = IdentifyFileType($expandfile);
+
+ &WriteFilteredData($expandfile, $type, $md5, $dumpDirExpandedFilename);
+ }
+ }
+ } elsif ($type ne 'identical') {
+ unless (exists $typeHandler{$type}) {
+ die "Invalid comparison type \"$type\"";
+ }
+ my $reader = $typeHandler{$type}->{reader};
+ my $filter = $typeHandler{$type}->{filter};
+ my $retry = $typeHandler{$type}->{retry} || 0;
+ my $rawretry = $typeHandler{$type}->{rawretry} || 0;
+ my $skipblanks = $typeHandler{$type}->{skipblanks} || 0;
+ my $relativePaths = $typeHandler{$type}->{relative_paths} || 0;
+ my $dosPaths = $typeHandler{$type}->{dos_paths} || 0;
+
+ my $skipstderr = $typeHandler{$type}->{skipstderr} || 0;
+ my $redirectstd = "2>&1";
+
+ if ($skipstderr) {
+ $redirectstd = "2>NUL";
+ }
+
+ if ($relativePaths) {
+ $file = RelativePath($file);
+ }
+ if ($dosPaths) {
+ $file =~ s/\//\\/g; # convert to DOS-style backslash separators
+ }
+
+ my $raw;
+ if ($reader) {
+ $raw = IO::File->new("$reader \"$file\" $redirectstd |") or die "Error: Couldn't run \"$reader $file\": $!\n";
+ }
+ else {
+ $raw = IO::File->new("$file") or die "Error: Couldn't open \"$file\": $!\n";
+ }
+ while (my $line = <$raw>) {
+ &$filter(\$line);
+ next if $skipblanks and $line =~ /^\s*$/;
+ $md5->add($line);
+ push @dumpDirBuffer, $line if ($dumpDir);
+ }
+ Drain($raw);
+ $raw->close();
+
+ # Retry once if reader failed and reader has retry specified
+ if ((($?>>8) != 0) && ($retry == 1))
+ {
+ print "Warning: $reader failed (" .($?>>8). ") on $file - retrying\n";
+ # Reset MD5
+ $md5->reset;
+ undef @dumpDirBuffer if ($dumpDir);
+ $raw = IO::File->new("$reader \"$file\" $redirectstd |") or die "Error: Couldn't run \"$reader $file\": $!\n";
+ while (my $line = <$raw>)
+ {
+ &$filter(\$line);
+ next if $skipblanks and $line =~ /^\s*$/;
+ $md5->add($line);
+ push @dumpDirBuffer, $line if ($dumpDir);
+ }
+ Drain($raw);
+ $raw->close();
+ if (($?>>8) != 0)
+ {
+ print "Error: $reader failed again (" .($?>>8) .") on $file - reporting failure\n";
+ }
+ }
+
+ # Retry as raw if specified
+ if (($?>>8) != 0) {
+ if ($rawretry)
+ {
+ if ($reader =~ /^pfsdump/) {
+ print "Warning: $reader failed (". ($?>>8) .") on file $file - retrying as raw binary\n";
+ }
+ else {
+ print "Info: something wrong to execute $reader (". ($?>>8) .") on file $file - retrying as raw binary\n";
+ }
+ # Set type to be identical so it will try it as a raw binary stream
+ $type = 'identical';
+ } else {
+ print "Error: $reader failed (". ($?>>8) .") on file $file - not retrying as raw binary\n";
+ }
+ }
+ }
+ if ($type eq 'identical') {
+ # Reset md5 as it might have been used in reader section
+ $md5->reset;
+ undef @dumpDirBuffer if ($dumpDir);
+ # Treat 'identical' as a special case - no filtering, just write raw binary stream.
+ my $raw = IO::File->new($file) or die "Error: Couldn't open \"$file\" for reading: $!\n";
+ binmode($raw);
+ my $buf;
+ while ($raw->read($buf, 4096)) {
+ $md5->add($buf);
+ }
+ $raw->close();
+ }
+
+ my $dumpDirFilename = $file;
+ $dumpDirFilename = $dumpDirExpandedFile if ($dumpDirExpandedFile);
+ dumpDescriptiveOutput ($file, $dumpDirFilename, @dumpDirBuffer) if ($dumpDir);
+
+ # Make sure the $? is reset for the next file otherwise it will report errors
+ $? = 0;
+}
+
+sub DoCompareFiles {
+ my $file1 = shift;
+ my $file2 = shift;
+ my $type = shift;
+ my $same = 0;
+ unless (exists $typeLookup{$type}) {
+ die "Invalid file type \"$type\"";
+ }
+
+ $type = $typeLookup{$type};
+
+ # Check to see if this file type requires expanding first
+ if (exists $typeHandler{$type}->{expandor})
+ {
+ $same = &ExpandAndCompareFiles($file1, $file2, $typeHandler{$type}->{expandor});
+ # Check for Expanding error
+ if ($same == -1)
+ {
+ if ($typeHandler{$type}->{rawretry} == 1)
+ {
+ # Set type to be identical if rawrety is set
+ $type = 'identical';
+ print($log "Warning: Expandor $typeHandler{$type}->{expandor} failed for $file1 or $file2 : retrying as raw\n") if ($verbose);
+ } else {
+ die "Error: Expandor $typeHandler{$type}->{expandor} failed for $file1 or $file2\n";
+ }
+ } else {
+ return $same;
+ }
+ }
+
+ if ($type ne 'identical')
+ {
+ unless (exists $typeHandler{$type}) {
+ die "Invalid comparison type \"$type\"";
+ }
+
+ my $reader = $typeHandler{$type}->{reader};
+ my $filter = $typeHandler{$type}->{filter};
+ my $retry = $typeHandler{$type}->{retry} || 0;
+ my $skipblanks= $typeHandler{$type}->{skipblanks} || 0;
+ my $rawretry = $typeHandler{$type}->{rawretry} || 0;
+ my $relativePaths = $typeHandler{$type}->{relative_paths} || 0;
+ my $skipstderr = $typeHandler{$type}->{skipstderr} || 0;
+ my $redirectstd = "2>&1";
+
+ if ($skipstderr) {
+ $redirectstd = "2>NUL";
+ }
+
+ if ($relativePaths) {
+ $file1 = RelativePath($file1);
+ $file2 = RelativePath($file2);
+ }
+ my $fileHandle1;
+ my $fileHandle2;
+ if ($reader) {
+ $fileHandle1 = IO::File->new("$reader \"$file1\" $redirectstd |") or die "Error: Couldn't run \"$reader $file1\": $!\n";
+ $fileHandle2 = IO::File->new("$reader \"$file2\" $redirectstd |") or die "Error: Couldn't run \"$reader $file2\": $!\n";
+ }
+ else {
+ $fileHandle1 = IO::File->new("$file1") or die "Error: Couldn't open \"$file1\": $!\n";
+ $fileHandle2 = IO::File->new("$file2") or die "Error: Couldn't open \"$file2\": $!\n";
+ }
+ $same = CompareTexts($fileHandle1, $fileHandle2, $filter, $file1, $skipblanks);
+ Drain($fileHandle1, $fileHandle2);
+
+ $fileHandle1->close();
+ my $status1 = $?>>8;
+ $fileHandle2->close();
+ my $status2 = $?>>8;
+ if (($retry) && ($status1 != 0 or $status2 != 0))
+ {
+ print ($log "Warning: $reader failed ($status1, $status2) - retrying\n");
+
+ # Repeat previous code by hand, rather than calling DoCompareFiles
+ # again: if it's a systematic failure that would be a never ending loop...
+
+ $fileHandle1 = IO::File->new("$reader \"$file1\" $redirectstd |") or die "Error: Couldn't run \"$reader $file1\": $!\n";
+ $fileHandle2 = IO::File->new("$reader \"$file2\" $redirectstd |") or die "Error: Couldn't run \"$reader $file2\": $!\n";
+ $same = CompareTexts($fileHandle1, $fileHandle2, $filter, $file1, $skipblanks);
+ Drain($fileHandle1, $fileHandle2);
+ $fileHandle1->close();
+ $status1 = $?>>8;
+ $fileHandle2->close();
+ $status2 = $?>>8;
+ if ($status1 != 0 or $status2 != 0)
+ {
+ print ($log "Warning: $reader failed again ($status1, $status2) - reporting failure\n");
+ $same = 0;
+ }
+ }
+
+ # Retry as raw if specified
+ if (($rawretry)&& ($status1 != 0 or $status2 != 0))
+ {
+ if ($rawretry)
+ {
+ print ($log "Warning: $reader failed (" .($?>>8). ") on a file retrying as raw binary\n");
+ # Set type to be identical so it will try it as a raw binary stream
+ $type = 'identical';
+ } else {
+ print ($log "Error: $reader failed (" .($?>>8). ") on a file not retrying as raw binary\n");
+ }
+ }
+
+ }
+
+ if ($type eq 'identical') {
+ # Treat 'identical' as a special case - no filtering, just do raw binary stream comparison.
+ my $fileHandle1 = IO::File->new($file1) or die "Error: Couldn't open \"$file1\" for reading: $!\n";
+ my $fileHandle2 = IO::File->new($file2) or die "Error: Couldn't open \"$file2\" for reading: $!\n";
+ binmode($fileHandle1);
+ binmode($fileHandle2);
+ $same = CompareStreams($fileHandle1, $fileHandle2, $file1);
+ }
+
+ # Make sure the $? is reset for the next file otherwise it will report errors
+ $? = 0;
+
+ return $same;
+}
+
+sub CompareStreams {
+ my $fileHandle1 = shift;
+ my $fileHandle2 = shift;
+ my $filename = shift;
+ my $same = 1;
+ my $offset = -4096;
+ my $buf1;
+ my $buf2;
+ while ($same) {
+ my $len1 = $fileHandle1->read($buf1, 4096);
+ my $len2 = $fileHandle2->read($buf2, 4096);
+ if ($len1 == 0 and $len2 == 0) {
+ return 1;
+ }
+ $same = $buf1 eq $buf2;
+ $offset += 4096;
+ }
+ if ($verbose) {
+ my @bytes1 = unpack "C*", $buf1;
+ my @bytes2 = unpack "C*", $buf2;
+ foreach my $thisByte (@bytes1) {
+ if ($thisByte != $bytes2[0]) {
+ printf $log "Binary comparison: %s failed at byte %d: %02x != %02x\n", $filename, $offset, $thisByte, $bytes2[0];
+ last;
+ }
+ shift @bytes2;
+ $offset+=1;
+ }
+ }
+ return 0;
+}
+
+sub NextSignificantLine {
+ my $filehandle = shift;
+ my $linenumber = shift;
+ my $cleanersub = shift;
+ my $skipblanks = shift;
+
+ while (!eof($filehandle)) {
+ my $line = <$filehandle>;
+ $$linenumber++;
+ $cleanersub->(\$line);
+ return $line if !$skipblanks or $line !~ /^\s*$/;
+ }
+ return undef; # on eof
+}
+
+sub CompareTexts {
+ my $filehandle1 = shift;
+ my $filehandle2 = shift;
+ my $cleaner = shift;
+ my $filename = shift;
+ my $skipblanks = shift;
+ my $lineNum1 = 0;
+ my $lineNum2 = 0;
+
+ while (1) {
+ my $line1 = NextSignificantLine($filehandle1, \$lineNum1, $cleaner, $skipblanks);
+ my $line2 = NextSignificantLine($filehandle2, \$lineNum2, $cleaner, $skipblanks);
+
+ return 0 if defined($line1) != defined($line2); # eof vs. significant content
+ return 1 if !defined($line1) and !defined($line2); # eof on both files
+
+ if ($line1 ne $line2) {
+ printf($log "Text comparison: %s failed at lines %d/%d\n< %s> %s\n",
+ $filename, $lineNum1, $lineNum2, $line1, $line2) if $verbose;
+ return 0;
+ }
+ }
+}
+
+sub Drain {
+ foreach my $handle (@_) {
+ while (my $line = <$handle>) {
+ }
+ }
+}
+
+sub RelativePath {
+ my $name = shift;
+ if (($name =~ /^\\[^\\]/) || ($name =~ /^\//)) { # abs path (unix or windows), not UNC
+ unless ($toRoot) {
+ $toRoot = getcwd();
+ $toRoot =~ s/\//\\/g;
+ $toRoot =~ s/^[a-zA-Z]:\\(.*)$/$1/;
+ $toRoot =~ s/[^\\]+/../g;
+ if ($toRoot =~ /^$/) {
+ $toRoot = '.'; # because we are starting in the root
+ }
+ }
+ return $toRoot.$name;
+ }
+ return $name;
+}
+
+# Function to expand compressed formats and recompare expanded files
+# This is the file against file implementation
+# It returns one identical / non indentical result based on all files in the
+# expanded content. i.e one non identical expanded file will cause the non
+# expanded file to be reported as non identical.
+sub ExpandAndCompareFiles
+{
+ my $file1 = shift;
+ my $file2 = shift;
+ my $expandor = shift;
+
+ # Create two temporary directories
+ my $tempdir1 = tempdir ( "EvalidExpand_XXXXXX", DIR => File::Spec->tmpdir, CLEANUP => 1);
+ my $tempdir2 = tempdir ( "EvalidExpand_XXXXXX", DIR => File::Spec->tmpdir, CLEANUP => 1);
+
+ # Build the Expandor commandline
+ my $cmd1 = $expandor;
+ $cmd1 =~ s/%TEMPDIR%/$tempdir1/g;
+ $cmd1 =~ s/%FILE%/$file1/g;
+
+ my $cmd2 = $expandor;
+ $cmd2 =~ s/%TEMPDIR%/$tempdir2/g;
+ $cmd2 =~ s/%FILE%/$file2/g;
+
+ # Expand files
+ my $output = `$cmd1 2>&1`;
+ print($log "Expanding using $cmd1 output was:-\n$output") if ($verbose);
+ if ($? > 0)
+ {
+ print ($log "$cmd1 exited with $?") if ($verbose);
+ return -1;
+ }
+
+ $output = `$cmd2 2>&1`;
+ print($log "Expanding using $cmd2 output was:-\n$output") if ($verbose);
+ if ($? > 0)
+ {
+ print ($log "$cmd2 exited with $?") if ($verbose);
+ return -1;
+ }
+
+ # Produce full filelist of expanded files without directory names
+ my %iFileList1;
+ $tempdir1 =~ s#\\#/#g; # Make sure the dir seperators are / for consistent and easier matching.
+ find sub {
+ if (!-d)
+ {
+ my ($fixedpath) = $File::Find::name;
+ $fixedpath =~ s#\\#/#g;
+ my ($relpath) = $File::Find::name =~ /$tempdir1(.*)/i;
+ $iFileList1{$relpath} = "left";
+ }
+ }, $tempdir1;
+
+ my %iFileList2;
+ $tempdir2 =~ s#\\#/#g; # Make sure the dir seperators are / for consistent and easier matching.
+ find sub {
+ if (!-d)
+ {
+ my ($fixedpath) = $File::Find::name;
+ $fixedpath =~ s#\\#/#g;
+ my ($relpath) = $File::Find::name =~ /$tempdir2(.*)/i;
+ $iFileList2{$relpath} = "right";
+ }
+ }, $tempdir2;
+
+ #Work out the if the two file lists are different
+ foreach my $file (sort keys %iFileList1)
+ {
+ if (! defined $iFileList2{$file})
+ {
+ # If the filename does not exist in the second filelist the compressed files cannot be the same.
+ print ($log "Did not find $file in $file2\n") if ($verbose);
+ return 0;
+ } else {
+ delete $iFileList2{$file}
+ }
+ }
+
+ # There are extra files in the second compressed file therefore the compressed files cannot be the same.
+ if (scalar(keys %iFileList2) > 0)
+ {
+ print ($log "$file2 contained more files than $file1\n") if ($verbose);
+ return 0;
+ }
+
+ print($log "Comparing content\n") if ($verbose);
+ #filelist1 and filelist2 contain all the same filenames, now compare the contents of each file
+ my $same = -1; # Variable to store collated result of comparison, assume an error
+ foreach my $file (keys %iFileList1)
+ {
+ my $type;
+ ($same, $type) = CompareFiles($tempdir1.$file,$tempdir2.$file, $verbose, $log);
+ print ($log "Comparing $tempdir1.$file against $tempdir2.$file\n") if ($verbose);
+ last if ($same == 0); # do not bother comparing more files if one of the expanded files is different.
+ }
+
+ #Cleanup the temporary directories
+ rmtree([$tempdir1,$tempdir2]);
+
+ return $same;
+}
+
+# Create descriptive versions of input files in response to the -d option to MD5 generation
+sub dumpDescriptiveOutput ($$@)
+ {
+ my ($originalFile, $dumpDirFile, @content) = @_;
+
+ my $currentDir = cwd;
+ my $drive = "";
+ $dumpDirFile =~ s/^.://; # Remove drive letter
+
+ $drive = $1 if ($currentDir =~ /^(\w{1}:)\//);
+
+ my $DUMPFILE = $dumpDir;
+ $DUMPFILE = cwd."\\$dumpDir" if ($dumpDir !~ /^(\\|\/|\w{1}:\\)/);
+ $DUMPFILE = $drive.$dumpDir if ($dumpDir =~ /^\\/);
+ $DUMPFILE .= "\\" if ($DUMPFILE !~ /(\\|\/)$/);
+ $DUMPFILE .= $dumpDirFile;
+ $DUMPFILE =~ s/\//\\/g;
+
+ # This is most likely to come about due to maintaining path structures in expanded archives e.g. .chm files
+ if (length ($DUMPFILE) > 255)
+ {
+ print ("Warning: Not attempting to create \"$DUMPFILE\" as it exceeds Windows MAX_PATH limit.\n");
+ return;
+ }
+
+ mkpath (dirname ($DUMPFILE));
+
+ my $success = 0;
+
+ if (@content)
+ {
+ if (open DUMPFILE, "> $DUMPFILE")
+ {
+ print DUMPFILE $_ foreach (@content);
+ close DUMPFILE;
+ $success = 1;
+ }
+ }
+ else
+ {
+ $success = 1 if (copy ($originalFile, $DUMPFILE));
+ }
+
+ print ("Warning: Cannot create \"$DUMPFILE\".\n") if (!$success);
+ }
+
+
+#
+# Filters.
+#
+
+sub Elf2E32Filter {
+ my $line = shift;
+ if ($$line =~ /Time Stamp:|E32ImageFile|Header CRC:/) { # Ignore time stamps, file name and Header CRC which uses the timestamp.
+ $$line = '';
+ }
+ if ($$line =~ /imports from /) {
+ $$line = lc $$line; # DLL names are not case-sensitive in the Symbian platform loader
+ }
+}
+
+sub ElfDumpFilter {
+ my $line = shift;
+ $$line =~ s/^\tProgram header offset.*$/Program header offset/;
+ $$line =~ s/^\tSection header offset.*$/Section header offset/;
+ $$line =~ s/#<DLL>(\S+\.\S+)#<\\DLL>/#<DLL>\L$1\E#<\\DLL>/; # DLL names are not case-sensitive in the Symbian platform loader
+ if ($$line =~ /^\.(rel\.)?debug_/) {
+ $$line = ''; # additional debug-related information - not considered significant
+ }
+}
+
+sub NmFilter {
+ my $line = shift;
+ $$line =~ s/^.*:$//; # ignore the filenames
+ $$line =~ s/\.\.\\[^(]*\\//g;
+ $$line =~ s/\.\.\/[^(]*\///g; # ignore pathnames of object files
+ $$line =~ s/^BFD: (.*)$//; # ignore the Binary File Descriptor(BFD) warning messages
+ if ($$line =~ /^(.+ (_head|_))\w+_(EPOC32_\w+(_LIB|_iname))$/i) {
+ # dlltool uses the "-o" argument string as the basis for a "unique symbol", but
+ # doesn't turn the name into a canonical form first.
+ # dh.o:
+ # U ________EPOC32_RELEASE_ARM4_UREL_EIKCOCTL_LIB_iname
+ # 00000000 ? _head_______EPOC32_RELEASE_ARM4_UREL_EIKCOCTL_LIB
+ $$line = uc "$1_..._$3\n";
+ }
+}
+
+
+sub MapFilter {
+ my $line = shift;
+ $$line =~ s/([d-z])\d*s_?\d+\.o/$1s999.o/; # ignore the names of intermediate files in .LIB
+ $$line =~ s/([d-z])\d*([ht])\.o/$1$2.o/; # ignore the names of intermediate files in .LIB
+ $$line =~ s-/-\\-go; # convert / into \
+ $$line =~ s/(\.\.\\|.:\\)[^(]*\\//g; # ignore pathnames of object files
+ $$line =~ s/\.stab.*$//; # ignore .stab and .stabstr lines
+ $$line =~ s/0x.*size before relaxing//; # ignore additional comments about .stab and .stabstr
+ $$line =~ s/(_head|_)\w+_(EPOC32_\w+(_LIB|_iname))/$1_,,,_$3/; # dlltool-generated unique symbols
+ $$line =~ s/Timestamp is .*$//; # ignore timestamps in DevStudio map files
+ if ($$line =~ /^ARM Linker,/) {
+ $$line = '';
+ } # ignore the message that armlink's license will expire. (in RVCT MAP file)
+ if ($$line =~ /^Your license/) {
+ $$line = '';
+ }
+ $$line =~ s/\s__T\d{8}\s/ __Tnnnnnnnn /; # ignore RVCT generated internal symbols
+ if ($$line =~ /0x00000000 Number 0 /) { # ignore filenames in RVCT link maps
+ $$line = '';
+ }
+
+ # Ignore various case differences:
+
+ ## RVCT
+
+ # source filenames turning up in mangled symbols e.g.:
+ # __sti___13_BALServer_cpp 0x000087c9 Thumb Code 52 BALServer.o(.text)
+ $$line =~ s/^(\s+__sti___\d+_)(\w+)(.*\(\.text\))$/$1\L$2\E$3/;
+
+ # object filenames e.g.:
+ # .text 0x0000a01c Section 164 AssertE.o(.text)
+ $$line =~ s/^(\s+\.text\s+0x[0-9A-Fa-f]{8}\s+Section\s+\d+\s+)(.+)(\(\.text\))$/$1\L$2\E$3/;
+
+ ## WINSCW
+
+ # import/static libraries processed listed in the last section e.g.:
+ #1 EDLL.LIB
+ #99 EDLL.LIB (not used)
+ $$line =~ s/^(\d{1,2} {5,6})(\w+\.lib)( \(not used\)|)$/$1\L$2\E$3/i;
+}
+
+sub UnzipFilter {
+ my $line = shift;
+ $$line =~ s/^Archive:.*$/Archive/; # ignore the archive names
+ # Line format of unzip -l -v
+ # Length Method Size Ratio Date Time CRC-32 Name, Date can be dd-mm-yy or mm/dd/yy
+ $$line =~ s/ (\d+).*? ..-..-..\s+..:.. / ($1) 99-99-99 99:99 /; # ignore (Method Size Ratio Date Time) on contained files
+ $$line =~ s^ (\d+).*? ..\/..\/..\s+..:.. ^ ($1) 99-99-99 99:99 ^; # ignore (Method Size Ratio Date Time) on contained files
+}
+
+sub SgmlFilter {
+ my $line = shift;
+ $$line =~ s/<!--.*-->//; # ignore comments such as "generated by javadoc"
+}
+
+sub PreprocessedTextFilter {
+ my $line = shift;
+ $$line =~ s/^# \d+ ".*"( \d)?$//; # ignore #include history
+}
+
+sub FilterCVSTags {
+ my $line = shift;
+ $$line =~ s#//\s+\$(?:Id|Name|Header|Date|DateTime|Change|File|Revision|Author):.*\$$##m;
+ # Remove tags like:
+ # // $Id: //my/perforce/here $
+ # which may be inserted into source code by some licensees
+}
+
+sub PermanentFileStoreFilter {
+ my $line = shift;
+ $$line =~ s/^Dumping .*$/Dumping (file)/; # ignore the source file names
+}
+
+sub DistributionPolicyFilter {
+ my $line = shift;
+ $$line =~ s/# DistPolGen.*//;
+}
+
+sub FilterAll {
+ my $line = shift;
+ $$line = '';
+}
+
+sub FilterNone {
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+EvalidCompare.pm - Utilities for comparing the contents of files.
+
+=head1 DESCRIPTION
+
+This package has been largely factored out of the C<e32toolp> tool C<evalid>. The main pieces of borrowed functionality are the ability to identify file types by examining their content, and the ability to filter irrelevant data out of files to allow comparisons to be performed. This refactoring was done in order to allow both direct and indirect comparisons of files to be supported. Direct comparisions are done by reading a pair of files (in the same way the C<evalid> does). Indirect comparisons are done by generating MD5 signatures of the files to be compared. The later method allows comparisons to be performed much more efficiently, because only one file need be present provided the signature of the other is known.
+
+=head1 INTERFACE
+
+=head2 CompareFiles
+
+Expects to be passed a pair of file names. May optionally also be passed a verbosity level (defaults to 0) and a file handle for logging purposes (defaults to *STDIN). Returns 1 if the files match, 0 if not. Firstly does a raw binary compare of the two files. If they match, no further processing is done and 1 is returned. If not, the type of the first file is found and the files are re-compared, this time ignoring data known to be irrelevant for the file type. The result of this compare is then returned.
+
+=head2 GenerateSignature
+
+Expects to be passed a file name. May optionally also be passed a verbosity level (defaults to 0) and a file handle for logging purposes (defaults to *STDIN). Returns an MD5 signature of the specified file contents, having ignored irrelevant data associted with its type. This signature may subsequently be used to verify that the contents of the file has not been altered in a significant way.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+ All rights reserved.
+ This component and the accompanying materials are made available
+ under the terms of the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+=cut
+
+__END__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/evalid.lis Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,118 @@
+OK: left\ok\CHM_file\identical\file.chm and right\ok\CHM_file\identical\file.chm (identical)
+OK: left\ok\CHM_file\rebuilt\file.chm and right\ok\CHM_file\rebuilt\file.chm (chm file)
+OK: left\ok\E32_EXE\case_diff\armv5\udeb\usestaticdll.exe and right\ok\E32_EXE\case_diff\armv5\udeb\usestaticdll.exe (Compressed E32 EXE)
+OK: left\ok\E32_EXE\case_diff\armv5\urel\usestaticdll.exe and right\ok\E32_EXE\case_diff\armv5\urel\usestaticdll.exe (Compressed E32 EXE)
+OK: left\ok\ELF_library\case_diff\armv5\createstaticdll.lib and right\ok\ELF_library\case_diff\armv5\createstaticdll.lib (ELF library)
+OK: left\ok\identical\console.ini and right\ok\identical\console.ini (identical)
+OK: left\ok\Intel_DLL\winscw\udeb\ALARMSHARED.DLL and right\ok\Intel_DLL\winscw\udeb\ALARMSHARED.DLL (Intel DLL)
+OK: left\ok\Intel_DLL\winscw\urel\ALARMSHARED.DLL and right\ok\Intel_DLL\winscw\urel\ALARMSHARED.DLL (Intel DLL)
+OK: left\ok\Intel_exe\wins\urel\E32STRT.EXE and right\ok\Intel_exe\wins\urel\E32STRT.EXE (Intel EXE)
+OK: left\ok\Intel_exe\winscw\udeb\AlarmServer.exe and right\ok\Intel_exe\winscw\udeb\AlarmServer.exe (Intel EXE)
+OK: left\ok\Intel_exe\winscw\urel\E32STRT.EXE and right\ok\Intel_exe\winscw\urel\E32STRT.EXE (Intel EXE)
+OK: left\ok\Intel_library\wins\udeb\ALARMSHARED.LIB and right\ok\Intel_library\wins\udeb\ALARMSHARED.LIB (Intel library)
+OK: left\ok\Intel_library\wins\udeb\EEXE.LIB and right\ok\Intel_library\wins\udeb\EEXE.LIB (Intel library)
+OK: left\ok\Intel_library\wins\urel\EEXE.LIB and right\ok\Intel_library\wins\urel\EEXE.LIB (Intel library)
+OK: left\ok\Intel_library\winscw\udeb\ALARMSHARED.LIB and right\ok\Intel_library\winscw\udeb\ALARMSHARED.LIB (Intel library)
+OK: left\ok\Intel_library\winscw\udeb\EEXE.LIB and right\ok\Intel_library\winscw\udeb\EEXE.LIB (Intel library)
+OK: left\ok\Intel_library\winscw\urel\EEXE.LIB and right\ok\Intel_library\winscw\urel\EEXE.LIB (Intel library)
+OK: left\ok\Intel_object\FNTTRAN.exp and right\ok\Intel_object\FNTTRAN.exp (Intel object)
+OK: left\ok\MAP_file\arm4\udeb\ALARMSHARED.DLL.map and right\ok\MAP_file\arm4\udeb\ALARMSHARED.DLL.map (MAP file)
+OK: left\ok\MAP_file\arm4\udeb\E32STRT.EXE.map and right\ok\MAP_file\arm4\udeb\E32STRT.EXE.map (MAP file)
+OK: left\ok\MAP_file\arm4\urel\ALARMSHARED.DLL.map and right\ok\MAP_file\arm4\urel\ALARMSHARED.DLL.map (MAP file)
+OK: left\ok\MAP_file\arm4\urel\E32STRT.EXE.map and right\ok\MAP_file\arm4\urel\E32STRT.EXE.map (MAP file)
+OK: left\ok\MAP_file\thumb\udeb\ALARMSHARED.DLL.map and right\ok\MAP_file\thumb\udeb\ALARMSHARED.DLL.map (MAP file)
+OK: left\ok\MAP_file\thumb\udeb\E32STRT.EXE.map and right\ok\MAP_file\thumb\udeb\E32STRT.EXE.map (MAP file)
+OK: left\ok\MAP_file\thumb\urel\ALARMSHARED.DLL.map and right\ok\MAP_file\thumb\urel\ALARMSHARED.DLL.map (MAP file)
+OK: left\ok\MAP_file\thumb\urel\E32STRT.EXE.map and right\ok\MAP_file\thumb\urel\E32STRT.EXE.map (MAP file)
+OK: left\ok\MAP_file\winscw\urel\ALARMSHARED.DLL.map and right\ok\MAP_file\winscw\urel\ALARMSHARED.DLL.map (identical)
+OK: left\ok\MAP_file\winscw\urel\E32STRT.EXE.map and right\ok\MAP_file\winscw\urel\E32STRT.EXE.map (identical)
+OK: left\ok\Preprocessed_text\IRCOMM.rpp and right\ok\Preprocessed_text\IRCOMM.rpp (Preprocessed text)
+OK: left\ok\SGML_file\allclasses-frame.html and right\ok\SGML_file\allclasses-frame.html (SGML file)
+
+Results of evalid left\ok right\ok
+
+17 failed comparisons
+
+FAILED: left\ok\Compressed_E32_DLL\arm4\udeb\ALARMSHARED.DLL and right\ok\Compressed_E32_DLL\arm4\udeb\ALARMSHARED.DLL (Uncompressed E32 DLL)
+FAILED: left\ok\Compressed_E32_DLL\arm4\urel\ALARMSHARED.DLL and right\ok\Compressed_E32_DLL\arm4\urel\ALARMSHARED.DLL (Uncompressed E32 DLL)
+FAILED: left\ok\Compressed_E32_DLL\thumb\udeb\ALARMSHARED.DLL and right\ok\Compressed_E32_DLL\thumb\udeb\ALARMSHARED.DLL (Uncompressed E32 DLL)
+FAILED: left\ok\Compressed_E32_DLL\thumb\urel\ALARMSHARED.DLL and right\ok\Compressed_E32_DLL\thumb\urel\ALARMSHARED.DLL (Uncompressed E32 DLL)
+FAILED: left\ok\Compressed_E32_EXE\arm4\udeb\E32STRT.EXE and right\ok\Compressed_E32_EXE\arm4\udeb\E32STRT.EXE (Uncompressed E32 EXE)
+FAILED: left\ok\Compressed_E32_EXE\arm4\urel\E32STRT.EXE and right\ok\Compressed_E32_EXE\arm4\urel\E32STRT.EXE (Uncompressed E32 EXE)
+FAILED: left\ok\Compressed_E32_EXE\thumb\udeb\E32STRT.EXE and right\ok\Compressed_E32_EXE\thumb\udeb\E32STRT.EXE (Uncompressed E32 EXE)
+FAILED: left\ok\Compressed_E32_EXE\thumb\urel\E32STRT.EXE and right\ok\Compressed_E32_EXE\thumb\urel\E32STRT.EXE (Uncompressed E32 EXE)
+FAILED: left\ok\E32_DLL\arm4\udeb\ALARMSHARED.DLL and right\ok\E32_DLL\arm4\udeb\ALARMSHARED.DLL (E32 DLL)
+FAILED: left\ok\E32_DLL\arm4\urel\ALARMSHARED.DLL and right\ok\E32_DLL\arm4\urel\ALARMSHARED.DLL (E32 DLL)
+FAILED: left\ok\E32_DLL\thumb\udeb\ALARMSHARED.DLL and right\ok\E32_DLL\thumb\udeb\ALARMSHARED.DLL (E32 DLL)
+FAILED: left\ok\E32_DLL\thumb\urel\ALARMSHARED.DLL and right\ok\E32_DLL\thumb\urel\ALARMSHARED.DLL (E32 DLL)
+FAILED: left\ok\E32_EXE\arm4\udeb\ALARMSERVER.EXE and right\ok\E32_EXE\arm4\udeb\ALARMSERVER.EXE (E32 EXE)
+FAILED: left\ok\E32_EXE\arm4\urel\ALARMSERVER.EXE and right\ok\E32_EXE\arm4\urel\ALARMSERVER.EXE (E32 EXE)
+FAILED: left\ok\E32_EXE\thumb\udeb\ALARMSERVER.EXE and right\ok\E32_EXE\thumb\udeb\ALARMSERVER.EXE (E32 EXE)
+FAILED: left\ok\E32_EXE\thumb\urel\ALARMSERVER.EXE and right\ok\E32_EXE\thumb\urel\ALARMSERVER.EXE (E32 EXE)
+FAILED: left\ok\ZIP_file\aifapp_ResourceBundles.jar and right\ok\ZIP_file\aifapp_ResourceBundles.jar (ZIP file)
+
+----------------
+15:21 16/04/2010
+evalid left\ok right\ok
+Failed 17 of 47 comparisons
+----------------
+
+OK: left\ok\CHM_file\identical\file.chm and right\ok\CHM_file\identical\file.chm (identical)
+OK: left\ok\CHM_file\rebuilt\file.chm and right\ok\CHM_file\rebuilt\file.chm (chm file)
+OK: left\ok\Compressed_E32_DLL\arm4\udeb\ALARMSHARED.DLL and right\ok\Compressed_E32_DLL\arm4\udeb\ALARMSHARED.DLL (Uncompressed E32 DLL)
+OK: left\ok\Compressed_E32_DLL\arm4\urel\ALARMSHARED.DLL and right\ok\Compressed_E32_DLL\arm4\urel\ALARMSHARED.DLL (Uncompressed E32 DLL)
+OK: left\ok\Compressed_E32_DLL\thumb\udeb\ALARMSHARED.DLL and right\ok\Compressed_E32_DLL\thumb\udeb\ALARMSHARED.DLL (Uncompressed E32 DLL)
+OK: left\ok\Compressed_E32_DLL\thumb\urel\ALARMSHARED.DLL and right\ok\Compressed_E32_DLL\thumb\urel\ALARMSHARED.DLL (Uncompressed E32 DLL)
+OK: left\ok\Compressed_E32_EXE\arm4\udeb\E32STRT.EXE and right\ok\Compressed_E32_EXE\arm4\udeb\E32STRT.EXE (Uncompressed E32 EXE)
+OK: left\ok\Compressed_E32_EXE\arm4\urel\E32STRT.EXE and right\ok\Compressed_E32_EXE\arm4\urel\E32STRT.EXE (Uncompressed E32 EXE)
+OK: left\ok\Compressed_E32_EXE\thumb\udeb\E32STRT.EXE and right\ok\Compressed_E32_EXE\thumb\udeb\E32STRT.EXE (Uncompressed E32 EXE)
+OK: left\ok\Compressed_E32_EXE\thumb\urel\E32STRT.EXE and right\ok\Compressed_E32_EXE\thumb\urel\E32STRT.EXE (Uncompressed E32 EXE)
+OK: left\ok\E32_DLL\arm4\udeb\ALARMSHARED.DLL and right\ok\E32_DLL\arm4\udeb\ALARMSHARED.DLL (E32 DLL)
+OK: left\ok\E32_DLL\arm4\urel\ALARMSHARED.DLL and right\ok\E32_DLL\arm4\urel\ALARMSHARED.DLL (E32 DLL)
+OK: left\ok\E32_DLL\thumb\udeb\ALARMSHARED.DLL and right\ok\E32_DLL\thumb\udeb\ALARMSHARED.DLL (E32 DLL)
+OK: left\ok\E32_DLL\thumb\urel\ALARMSHARED.DLL and right\ok\E32_DLL\thumb\urel\ALARMSHARED.DLL (E32 DLL)
+OK: left\ok\E32_EXE\arm4\udeb\ALARMSERVER.EXE and right\ok\E32_EXE\arm4\udeb\ALARMSERVER.EXE (E32 EXE)
+OK: left\ok\E32_EXE\arm4\urel\ALARMSERVER.EXE and right\ok\E32_EXE\arm4\urel\ALARMSERVER.EXE (E32 EXE)
+OK: left\ok\E32_EXE\case_diff\armv5\udeb\usestaticdll.exe and right\ok\E32_EXE\case_diff\armv5\udeb\usestaticdll.exe (Compressed E32 EXE)
+OK: left\ok\E32_EXE\case_diff\armv5\urel\usestaticdll.exe and right\ok\E32_EXE\case_diff\armv5\urel\usestaticdll.exe (Compressed E32 EXE)
+OK: left\ok\E32_EXE\thumb\udeb\ALARMSERVER.EXE and right\ok\E32_EXE\thumb\udeb\ALARMSERVER.EXE (E32 EXE)
+OK: left\ok\E32_EXE\thumb\urel\ALARMSERVER.EXE and right\ok\E32_EXE\thumb\urel\ALARMSERVER.EXE (E32 EXE)
+OK: left\ok\ELF_library\case_diff\armv5\createstaticdll.lib and right\ok\ELF_library\case_diff\armv5\createstaticdll.lib (ELF library)
+OK: left\ok\identical\console.ini and right\ok\identical\console.ini (identical)
+OK: left\ok\Intel_DLL\winscw\udeb\ALARMSHARED.DLL and right\ok\Intel_DLL\winscw\udeb\ALARMSHARED.DLL (Intel DLL)
+OK: left\ok\Intel_DLL\winscw\urel\ALARMSHARED.DLL and right\ok\Intel_DLL\winscw\urel\ALARMSHARED.DLL (Intel DLL)
+OK: left\ok\Intel_exe\wins\urel\E32STRT.EXE and right\ok\Intel_exe\wins\urel\E32STRT.EXE (Intel EXE)
+OK: left\ok\Intel_exe\winscw\udeb\AlarmServer.exe and right\ok\Intel_exe\winscw\udeb\AlarmServer.exe (Intel EXE)
+OK: left\ok\Intel_exe\winscw\urel\E32STRT.EXE and right\ok\Intel_exe\winscw\urel\E32STRT.EXE (Intel EXE)
+OK: left\ok\Intel_library\wins\udeb\ALARMSHARED.LIB and right\ok\Intel_library\wins\udeb\ALARMSHARED.LIB (Intel library)
+OK: left\ok\Intel_library\wins\udeb\EEXE.LIB and right\ok\Intel_library\wins\udeb\EEXE.LIB (Intel library)
+OK: left\ok\Intel_library\wins\urel\EEXE.LIB and right\ok\Intel_library\wins\urel\EEXE.LIB (Intel library)
+OK: left\ok\Intel_library\winscw\udeb\ALARMSHARED.LIB and right\ok\Intel_library\winscw\udeb\ALARMSHARED.LIB (Intel library)
+OK: left\ok\Intel_library\winscw\udeb\EEXE.LIB and right\ok\Intel_library\winscw\udeb\EEXE.LIB (Intel library)
+OK: left\ok\Intel_library\winscw\urel\EEXE.LIB and right\ok\Intel_library\winscw\urel\EEXE.LIB (Intel library)
+OK: left\ok\Intel_object\FNTTRAN.exp and right\ok\Intel_object\FNTTRAN.exp (Intel object)
+OK: left\ok\MAP_file\arm4\udeb\ALARMSHARED.DLL.map and right\ok\MAP_file\arm4\udeb\ALARMSHARED.DLL.map (MAP file)
+OK: left\ok\MAP_file\arm4\udeb\E32STRT.EXE.map and right\ok\MAP_file\arm4\udeb\E32STRT.EXE.map (MAP file)
+OK: left\ok\MAP_file\arm4\urel\ALARMSHARED.DLL.map and right\ok\MAP_file\arm4\urel\ALARMSHARED.DLL.map (MAP file)
+OK: left\ok\MAP_file\arm4\urel\E32STRT.EXE.map and right\ok\MAP_file\arm4\urel\E32STRT.EXE.map (MAP file)
+OK: left\ok\MAP_file\thumb\udeb\ALARMSHARED.DLL.map and right\ok\MAP_file\thumb\udeb\ALARMSHARED.DLL.map (MAP file)
+OK: left\ok\MAP_file\thumb\udeb\E32STRT.EXE.map and right\ok\MAP_file\thumb\udeb\E32STRT.EXE.map (MAP file)
+OK: left\ok\MAP_file\thumb\urel\ALARMSHARED.DLL.map and right\ok\MAP_file\thumb\urel\ALARMSHARED.DLL.map (MAP file)
+OK: left\ok\MAP_file\thumb\urel\E32STRT.EXE.map and right\ok\MAP_file\thumb\urel\E32STRT.EXE.map (MAP file)
+OK: left\ok\MAP_file\winscw\urel\ALARMSHARED.DLL.map and right\ok\MAP_file\winscw\urel\ALARMSHARED.DLL.map (identical)
+OK: left\ok\MAP_file\winscw\urel\E32STRT.EXE.map and right\ok\MAP_file\winscw\urel\E32STRT.EXE.map (identical)
+OK: left\ok\Preprocessed_text\IRCOMM.rpp and right\ok\Preprocessed_text\IRCOMM.rpp (Preprocessed text)
+OK: left\ok\SGML_file\allclasses-frame.html and right\ok\SGML_file\allclasses-frame.html (SGML file)
+
+Results of evalid left\ok right\ok
+
+1 failed comparisons
+
+FAILED: left\ok\ZIP_file\aifapp_ResourceBundles.jar and right\ok\ZIP_file\aifapp_ResourceBundles.jar (ZIP file)
+
+----------------
+15:22 16/04/2010
+evalid left\ok right\ok
+Failed 1 of 47 comparisons
+----------------
+
Binary file bintools/evalid/left/fail/CHM_file/content/file.chm has changed
Binary file bintools/evalid/left/fail/CHM_file/less_files/filelist.chm has changed
Binary file bintools/evalid/left/fail/CHM_file/more_files/filelist.chm has changed
Binary file bintools/evalid/left/fail/Intel_DLL/wins/udeb/C32.DLL has changed
Binary file bintools/evalid/left/fail/Intel_DLL/wins/urel/BAFL.DLL has changed
Binary file bintools/evalid/left/fail/Intel_DLL/winscw_data.dll has changed
Binary file bintools/evalid/left/fail/Intel_DLL/winscw_export.dll has changed
Binary file bintools/evalid/left/fail/Intel_DLL/winscw_import.dll has changed
Binary file bintools/evalid/left/fail/Intel_DLL/winscw_rdata.dll has changed
Binary file bintools/evalid/left/fail/Intel_DLL/winscw_text.dll has changed
Binary file bintools/evalid/left/fail/Intel_DLL/winscw_uid.dll has changed
Binary file bintools/evalid/left/fail/Intel_EXE/winscw_data.exe has changed
Binary file bintools/evalid/left/fail/Intel_EXE/winscw_import.exe has changed
Binary file bintools/evalid/left/fail/Intel_EXE/winscw_rdata.exe has changed
Binary file bintools/evalid/left/fail/Intel_EXE/winscw_text.exe has changed
Binary file bintools/evalid/left/fail/Intel_EXE/winscw_uid.exe has changed
Binary file bintools/evalid/left/fail/Intel_library/symbol.lib has changed
Binary file bintools/evalid/left/fail/Intel_object/symbol.obj has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/fail/MAP_file/offset.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o) (_head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o) (________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o) (_head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o) (___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001004 0x318 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ 0x10001048 TASShdAlarm::InternalizeL(RReadStream &)
+ 0x10001264 TASShdAlarm::Reset(void)
+ 0x10001004 TASShdAlarm::TASShdAlarm(void)
+ 0x10001174 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000131c 0x8 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ 0x1000131c E32Dll(TDllReason)
+ .text 0x10001324 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x10001324 TBufBase16::TBufBase16(int)
+ .text 0x10001330 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x10001330 Time::NullTTime(void)
+ .text 0x1000133c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x1000133c TDes16::Copy(TDesC16 const &)
+ .text 0x10001348 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x10001348 RReadStream::ReadUint16L(void)
+ .text 0x10001354 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x10001354 RReadStream::ReadInt8L(void)
+ .text 0x10001360 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x10001360 RReadStream::ReadInt32L(void)
+ .text 0x1000136c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x1000136c InternalizeL(TInt64 &, RReadStream &)
+ .text 0x10001378 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x10001378 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x10001384 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x10001384 RReadStream::ReadInt16L(void)
+ .text 0x10001390 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x10001390 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x1000139c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x1000139c RWriteStream::WriteInt8L(int)
+ .text 0x100013a8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100013a8 RWriteStream::WriteInt32L(long)
+ .text 0x100013b4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x100013b4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013c0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x100013c0 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x100013cc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x100013cc RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x100013d8 ___CTOR_LIST__=.
+ 0x100013d8 __CTOR_LIST__=.
+ 0x100013d8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x100013dc 0x4 LONG 0x0
+ 0x100013e0 ___DTOR_LIST__=.
+ 0x100013e0 __DTOR_LIST__=.
+ 0x100013e0 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x100013e4 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x100013e8 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x100013e8 0x8 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ 0x10003000 _head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ 0x10003014 _head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ 0x10003104 ___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ 0x10003124 ________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/fail/MAP_file/size.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o) (_head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o) (________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o) (_head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o) (___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001004 0x318 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ 0x10001048 TASShdAlarm::InternalizeL(RReadStream &)
+ 0x10001264 TASShdAlarm::Reset(void)
+ 0x10001004 TASShdAlarm::TASShdAlarm(void)
+ 0x10001174 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000131c 0x8 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ 0x1000131c E32Dll(TDllReason)
+ .text 0x10001324 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x10001324 TBufBase16::TBufBase16(int)
+ .text 0x10001330 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x10001330 Time::NullTTime(void)
+ .text 0x1000133c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x1000133c TDes16::Copy(TDesC16 const &)
+ .text 0x10001348 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x10001348 RReadStream::ReadUint16L(void)
+ .text 0x10001354 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x10001354 RReadStream::ReadInt8L(void)
+ .text 0x10001360 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x10001360 RReadStream::ReadInt32L(void)
+ .text 0x1000136c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x1000136c InternalizeL(TInt64 &, RReadStream &)
+ .text 0x10001378 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x10001378 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x10001384 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x10001384 RReadStream::ReadInt16L(void)
+ .text 0x10001390 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x10001390 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x1000139c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x1000139c RWriteStream::WriteInt8L(int)
+ .text 0x100013a8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100013a8 RWriteStream::WriteInt32L(long)
+ .text 0x100013b4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x100013b4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013c0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x100013c0 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x100013cc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x100013cc RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x100013d8 ___CTOR_LIST__=.
+ 0x100013d8 __CTOR_LIST__=.
+ 0x100013d8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x100013dc 0x4 LONG 0x0
+ 0x100013e0 ___DTOR_LIST__=.
+ 0x100013e0 __DTOR_LIST__=.
+ 0x100013e0 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x100013e4 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x100013e8 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x100013e8 0x8 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ 0x10003000 _head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ 0x10003014 _head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ 0x10003104 ___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ 0x10003124 ________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/fail/MAP_file/symbol.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o) (_head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o) (________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o) (_head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o) (___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001004 0x318 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ 0x10001048 TASShdAlarm::InternalizeL(RReadStream &)
+ 0x10001264 TASShdAlarm::Reset(void)
+ 0x10001004 TASShdAlarm::TASShdAlarm(void)
+ 0x10001174 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000131c 0x8 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ 0x1000131c E32Dll(TDllReason)
+ .text 0x10001324 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x10001324 TBufBase16::TBufBase16(int)
+ .text 0x10001330 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x10001330 Time::NullTTime(void)
+ .text 0x1000133c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x1000133c TDes16::Copy(TDesC16 const &)
+ .text 0x10001348 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x10001348 RReadStream::ReadUint16L(void)
+ .text 0x10001354 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x10001354 RReadStream::ReadInt8L(void)
+ .text 0x10001360 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x10001360 RReadStream::ReadInt32L(void)
+ .text 0x1000136c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x1000136c InternalizeL(TInt64 &, RReadStream &)
+ .text 0x10001378 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x10001378 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x10001384 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x10001384 RReadStream::ReadInt16L(void)
+ .text 0x10001390 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x10001390 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x1000139c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x1000139c RWriteStream::WriteInt8L(int)
+ .text 0x100013a8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100013a8 RWriteStream::WriteInt32L(long)
+ .text 0x100013b4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x100013b4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013c0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x100013c0 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x100013cc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x100013cc RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x100013d8 ___CTOR_LIST__=.
+ 0x100013d8 __CTOR_LIST__=.
+ 0x100013d8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x100013dc 0x4 LONG 0x0
+ 0x100013e0 ___DTOR_LIST__=.
+ 0x100013e0 __DTOR_LIST__=.
+ 0x100013e0 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x100013e4 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x100013e8 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x100013e8 0x8 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ 0x10003000 _head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ 0x10003014 _head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ 0x10003104 ___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ 0x10003124 ________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/fail/MAP_file/winscw_offset.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,145 @@
+Address Size Name Subname Module
+
+40701000 0000003d .text ASSHDALARM.o(??0TASShdAlarm@@QAE@XZ)
+4070103d 00000107 .text ASSHDALARM.o(?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z)
+40701144 000000dc .text ASSHDALARM.o(?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z)
+40701220 000000a2 .text ASSHDALARM.o(?Reset@TASShdAlarm@@QAEXXZ)
+407012c2 00000003 .text ASSHDDLL.o(?E32Dll@@YAHW4TDllReason@@@Z)
+407012c6 00000006 .text EUSER.dll(??0TBufBase16@@IAE@H@Z)
+407012cc 00000006 .text ESTOR.dll(?ReadUint16L@RReadStream@@QAEGXZ)
+407012d2 00000006 .text ESTOR.dll(?ReadInt8L@RReadStream@@QAECXZ)
+407012d8 00000006 .text ESTOR.dll(?ReadInt32L@RReadStream@@QAEJXZ)
+407012de 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+407012e4 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+407012ea 00000006 .text ESTOR.dll(?ReadInt16L@RReadStream@@QAEFXZ)
+407012f0 00000006 .text ESTOR.dll(?WriteUint16L@RWriteStream@@QAEXI@Z)
+407012f6 00000006 .text ESTOR.dll(?WriteInt8L@RWriteStream@@QAEXH@Z)
+407012fc 00000006 .text ESTOR.dll(?WriteInt32L@RWriteStream@@QAEXJ@Z)
+40701302 00000006 .text ESTOR.dll(?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+40701308 00000006 .text ESTOR.dll(?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+4070130e 00000006 .text ESTOR.dll(?WriteInt16L@RWriteStream@@QAEXH@Z)
+40701314 00000006 .text EUSER.dll(?NullTTime@Time@@SA?AVTTime@@XZ)
+4070131a 00000006 .text EUSER.dll(?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+40701320 00000020 .text UP_DLL.obj(?initTable@@YAXPAP6AXXZ0@Z)
+40701340 000000a7 .text UP_DLL.obj(?_E32Dll@@YGHPAXI0@Z)
+407013e8 00000006 .text EUSER.dll(?__WireKernel@UpWins@@SAXXZ)
+40702000 0000001c .data ASSHDALARM.o
+40702020 00000018 .data ASSHDDLL.o
+40702038 00000018 .data uid.o
+40702050 00000018 .data UP_DLL.obj
+40702068 00000010 .data UP_DLL.obj
+40703000 0000000c .E32_UID uid.o
+40704000 00000014 .idata $2 ESTOR.dll
+40704014 00000014 .idata $2 EUSER.dll
+40704028 00000014 .idata $3 EUSER.dll
+4070403c 00000004 .idata $4 ESTOR.dll
+40704040 00000004 .idata $4 ESTOR.dll
+40704044 00000004 .idata $4 ESTOR.dll
+40704048 00000004 .idata $4 ESTOR.dll
+4070404c 00000004 .idata $4 ESTOR.dll
+40704050 00000004 .idata $4 ESTOR.dll
+40704054 00000004 .idata $4 ESTOR.dll
+40704058 00000004 .idata $4 ESTOR.dll
+4070405c 00000004 .idata $4 ESTOR.dll
+40704060 00000004 .idata $4 ESTOR.dll
+40704064 00000004 .idata $4 ESTOR.dll
+40704068 00000004 .idata $4 ESTOR.dll
+4070406c 00000004 .idata $4 ESTOR.dll
+40704070 00000004 .idata $4 EUSER.dll
+40704074 00000004 .idata $4 EUSER.dll
+40704078 00000004 .idata $4 EUSER.dll
+4070407c 00000004 .idata $4 EUSER.dll
+40704080 00000004 .idata $4 EUSER.dll
+40704084 00000004 .idata $5 ESTOR.dll(__imp_?ReadUint16L@RReadStream@@QAEGXZ)
+40704088 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt8L@RReadStream@@QAECXZ)
+4070408c 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt32L@RReadStream@@QAEJXZ)
+40704090 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+40704094 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+40704098 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt16L@RReadStream@@QAEFXZ)
+4070409c 00000004 .idata $5 ESTOR.dll(__imp_?WriteUint16L@RWriteStream@@QAEXI@Z)
+407040a0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt8L@RWriteStream@@QAEXH@Z)
+407040a4 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt32L@RWriteStream@@QAEXJ@Z)
+407040a8 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+407040ac 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+407040b0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt16L@RWriteStream@@QAEXH@Z)
+407040b4 00000004 .idata $5 ESTOR.dll
+407040b8 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@H@Z)
+407040bc 00000004 .idata $5 EUSER.dll(__imp_?NullTTime@Time@@SA?AVTTime@@XZ)
+407040c0 00000004 .idata $5 EUSER.dll(__imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+407040c4 00000004 .idata $5 EUSER.dll(__imp_?__WireKernel@UpWins@@SAXXZ)
+407040c8 00000004 .idata $5 EUSER.dll
+407040cc 0000000a .idata $6 ESTOR.dll
+407040d6 0000000a .idata $6 EUSER.dll
+40705000 00000004 .CRT $XCA UP_DLL.obj
+40705008 00000004 .CRT $XCZ UP_DLL.obj
+40705010 00000004 .CRT $XIA UP_DLL.obj
+40705018 00000004 .CRT $XIZ UP_DLL.obj
+40705020 00000004 .CRT $XPA UP_DLL.obj
+40705028 00000004 .CRT $XPZ UP_DLL.obj
+40705030 00000004 .CRT $XTA UP_DLL.obj
+40705038 00000004 .CRT $XTZ UP_DLL.obj
+40706000 00000012 .bss ASSHDALARM.o
+40706018 00000008 .bss ASSHDDLL.o
+40706020 00000008 .bss uid.o
+40706028 00000008 .bss UP_DLL.obj
+40706030 00000004 .bss
+
+--------------
+Public Symbols
+--------------
+
+Address Module Name
+-------- -------------------- ----
+40701000 ASSHDALARM.o ??0TASShdAlarm@@QAE@XZ
+4070103d ASSHDALARM.o ?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z
+40701144 ASSHDALARM.o ?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z
+40701220 ASSHDALARM.o ?Reset@TASShdAlarm@@QAEXXZ
+407012c2 ASSHDDLL.o ?E32Dll@@YAHW4TDllReason@@@Z
+407012c6 EUSER.dll ??0TBufBase16@@IAE@H@Z
+407012cc ESTOR.dll ?ReadUint16L@RReadStream@@QAEGXZ
+407012d2 ESTOR.dll ?ReadInt8L@RReadStream@@QAECXZ
+407012d8 ESTOR.dll ?ReadInt32L@RReadStream@@QAEJXZ
+407012de ESTOR.dll ?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+407012e4 ESTOR.dll ?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+407012ea ESTOR.dll ?ReadInt16L@RReadStream@@QAEFXZ
+407012f0 ESTOR.dll ?WriteUint16L@RWriteStream@@QAEXI@Z
+407012f6 ESTOR.dll ?WriteInt8L@RWriteStream@@QAEXH@Z
+407012fc ESTOR.dll ?WriteInt32L@RWriteStream@@QAEXJ@Z
+40701302 ESTOR.dll ?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+40701308 ESTOR.dll ?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+4070130e ESTOR.dll ?WriteInt16L@RWriteStream@@QAEXH@Z
+40701314 EUSER.dll ?NullTTime@Time@@SA?AVTTime@@XZ
+4070131a EUSER.dll ?Copy@TDes16@@QAEXABVTDesC16@@@Z
+40701340 UP_DLL.obj ?_E32Dll@@YGHPAXI0@Z
+407013e8 EUSER.dll ?__WireKernel@UpWins@@SAXXZ
+40703000 uid.o ?uid@@3PAVTUid@@A
+40704000 ESTOR.dll __IMPORT_DESCRIPTOR_ESTOR
+40704014 EUSER.dll __IMPORT_DESCRIPTOR_EUSER
+40704028 EUSER.dll __NULL_IMPORT_DESCRIPTOR
+40704084 ESTOR.dll __imp_?ReadUint16L@RReadStream@@QAEGXZ
+40704088 ESTOR.dll __imp_?ReadInt8L@RReadStream@@QAECXZ
+4070408c ESTOR.dll __imp_?ReadInt32L@RReadStream@@QAEJXZ
+40704090 ESTOR.dll __imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+40704094 ESTOR.dll __imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+40704098 ESTOR.dll __imp_?ReadInt16L@RReadStream@@QAEFXZ
+4070409c ESTOR.dll __imp_?WriteUint16L@RWriteStream@@QAEXI@Z
+407040a0 ESTOR.dll __imp_?WriteInt8L@RWriteStream@@QAEXH@Z
+407040a4 ESTOR.dll __imp_?WriteInt32L@RWriteStream@@QAEXJ@Z
+407040a8 ESTOR.dll __imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+407040ac ESTOR.dll __imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+407040b0 ESTOR.dll __imp_?WriteInt16L@RWriteStream@@QAEXH@Z
+407040b4 ESTOR.dll ESTOR_NULL_THUNK_DATA
+407040b8 EUSER.dll __imp_??0TBufBase16@@IAE@H@Z
+407040bc EUSER.dll __imp_?NullTTime@Time@@SA?AVTTime@@XZ
+407040c0 EUSER.dll __imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z
+407040c4 EUSER.dll __imp_?__WireKernel@UpWins@@SAXXZ
+407040c8 EUSER.dll EUSER_NULL_THUNK_DATA
+40705000 UP_DLL.obj ?__xc_a@@3PAP6AXXZA
+40705008 UP_DLL.obj ?__xc_z@@3PAP6AXXZA
+40705010 UP_DLL.obj ?__xi_a@@3PAP6AXXZA
+40705018 UP_DLL.obj ?__xi_z@@3PAP6AXXZA
+40705020 UP_DLL.obj ?__xp_a@@3PAP6AXXZA
+40705028 UP_DLL.obj ?__xp_z@@3PAP6AXXZA
+40705030 UP_DLL.obj ?__xt_a@@3PAP6AXXZA
+40705038 UP_DLL.obj ?__xt_z@@3PAP6AXXZA
+40706030 common ?_initialised@@3HA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/fail/MAP_file/winscw_symbol.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,145 @@
+Address Size Name Subname Module
+
+40701000 0000003d .text ASSHDALARM.o(??0TASShdAlarm@@QAE@XZ)
+4070103d 00000107 .text ASSHDALARM.o(?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z)
+40701144 000000dc .text ASSHDALARM.o(?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z)
+40701220 000000a2 .text ASSHDALARM.o(?Reset@TASShdAlarm@@QAEXXZ)
+407012c2 00000003 .text ASSHDDLL.o(?E32Dll@@YAHW4TDllReason@@@Z)
+407012c6 00000006 .text EUSER.dll(??0TBufBase16@@IAE@H@Z)
+407012cc 00000006 .text ESTOR.dll(?ReadUint16L@RReadStream@@QAEGXZ)
+407012d2 00000006 .text ESTOR.dll(?ReadInt8L@RReadStream@@QAECXZ)
+407012d8 00000006 .text ESTOR.dll(?ReadInt32L@RReadStream@@QAEJXZ)
+407012de 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+407012e4 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+407012ea 00000006 .text ESTOR.dll(?ReadInt16L@RReadStream@@QAEFXZ)
+407012f0 00000006 .text ESTOR.dll(?WriteUint16L@RWriteStream@@QAEXI@Z)
+407012f6 00000006 .text ESTOR.dll(?WriteInt8L@RWriteStream@@QAEXH@Z)
+407012fc 00000006 .text ESTOR.dll(?WriteInt32L@RWriteStream@@QAEXJ@Z)
+40701302 00000006 .text ESTOR.dll(?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+40701308 00000006 .text ESTOR.dll(?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+4070130e 00000006 .text ESTOR.dll(?WriteInt16L@RWriteStream@@QAEXH@Z)
+40701314 00000006 .text EUSER.dll(?NullTTime@Time@@SA?AVTTime@@XZ)
+4070131a 00000006 .text EUSER.dll(?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+40701320 00000020 .text UP_DLL.obj(?initTable@@YAXPAP6AXXZ0@Z)
+40701340 000000a7 .text UP_DLL.obj(?_E32Dll@@YGHPAXI0@Z)
+407013e8 00000006 .text EUSER.dll(?__WireKernel@UpWins@@SAXXZ)
+40702000 0000001c .data ASSHDALARM.o
+40702020 00000018 .data ASSHDDLL.o
+40702038 00000018 .data uid.o
+40702050 00000018 .data UP_DLL.obj
+40702068 00000010 .data UP_DLL.obj
+40703000 0000000c .E32_UID uid.o
+40704000 00000014 .idata $2 ESTOR.dll
+40704014 00000014 .idata $2 EUSER.dll
+40704028 00000014 .idata $3 EUSER.dll
+4070403c 00000004 .idata $4 ESTOR.dll
+40704040 00000004 .idata $4 ESTOR.dll
+40704044 00000004 .idata $4 ESTOR.dll
+40704048 00000004 .idata $4 ESTOR.dll
+4070404c 00000004 .idata $4 ESTOR.dll
+40704050 00000004 .idata $4 ESTOR.dll
+40704054 00000004 .idata $4 ESTOR.dll
+40704058 00000004 .idata $4 ESTOR.dll
+4070405c 00000004 .idata $4 ESTOR.dll
+40704060 00000004 .idata $4 ESTOR.dll
+40704064 00000004 .idata $4 ESTOR.dll
+40704068 00000004 .idata $4 ESTOR.dll
+4070406c 00000004 .idata $4 ESTOR.dll
+40704070 00000004 .idata $4 EUSER.dll
+40704074 00000004 .idata $4 EUSER.dll
+40704078 00000004 .idata $4 EUSER.dll
+4070407c 00000004 .idata $4 EUSER.dll
+40704080 00000004 .idata $4 EUSER.dll
+40704084 00000004 .idata $5 ESTOR.dll(__imp_?ReadUint16L@RReadStream@@QAEGXZ)
+40704088 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt8L@RReadStream@@QAECXZ)
+4070408c 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt32L@RReadStream@@QAEJXZ)
+40704090 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+40704094 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+40704098 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt16L@RReadStream@@QAEFXZ)
+4070409c 00000004 .idata $5 ESTOR.dll(__imp_?WriteUint16L@RWriteStream@@QAEXI@Z)
+407040a0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt8L@RWriteStream@@QAEXH@Z)
+407040a4 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt32L@RWriteStream@@QAEXJ@Z)
+407040a8 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+407040ac 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+407040b0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt16L@RWriteStream@@QAEXH@Z)
+407040b4 00000004 .idata $5 ESTOR.dll
+407040b8 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@H@Z)
+407040bc 00000004 .idata $5 EUSER.dll(__imp_?NullTTime@Time@@SA?AVTTime@@XZ)
+407040c0 00000004 .idata $5 EUSER.dll(__imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+407040c4 00000004 .idata $5 EUSER.dll(__imp_?__WireKernel@UpWins@@SAXXZ)
+407040c8 00000004 .idata $5 EUSER.dll
+407040cc 0000000a .idata $6 ESTOR.dll
+407040d6 0000000a .idata $6 EUSER.dll
+40705000 00000004 .CRT $XCA UP_DLL.obj
+40705008 00000004 .CRT $XCZ UP_DLL.obj
+40705010 00000004 .CRT $XIA UP_DLL.obj
+40705018 00000004 .CRT $XIZ UP_DLL.obj
+40705020 00000004 .CRT $XPA UP_DLL.obj
+40705028 00000004 .CRT $XPZ UP_DLL.obj
+40705030 00000004 .CRT $XTA UP_DLL.obj
+40705038 00000004 .CRT $XTZ UP_DLL.obj
+40706000 00000012 .bss ASSHDALARM.o
+40706018 00000008 .bss ASSHDDLL.o
+40706020 00000008 .bss uid.o
+40706028 00000008 .bss UP_DLL.obj
+40706030 00000004 .bss
+
+--------------
+Public Symbols
+--------------
+
+Address Module Name
+-------- -------------------- ----
+40701000 ASSHDALARM.o ??0TASShdAlarm@@QAE@XZ
+4070103d ASSHDALARM.o ?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z
+40701144 ASSHDALARM.o ?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z
+40701220 ASSHDALARM.o ?Reset@TASShdAlarm@@QAEXXZ
+407012c2 ASSHDDLL.o ?E32Dll@@YAHW4TDllReason@@@Z
+407012c6 EUSER.dll ??0TBufBase16@@IAE@H@Z
+407012cc ESTOR.dll ?ReadUint16L@RReadStream@@QAEGXZ
+407012d2 ESTOR.dll ?ReadInt8L@RReadStream@@QAECXZ
+407012d8 ESTOR.dll ?ReadInt32L@RReadStream@@QAEJXZ
+407012de ESTOR.dll ?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+407012e4 ESTOR.dll ?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+407012ea ESTOR.dll ?ReadInt16L@RReadStream@@QAEFXZ
+407012f0 ESTOR.dll ?WriteUint16L@RWriteStream@@QAEXI@Z
+407012f6 ESTOR.dll ?WriteInt8L@RWriteStream@@QAEXH@Z
+407012fc ESTOR.dll ?WriteInt32L@RWriteStream@@QAEXJ@Z
+40701302 ESTOR.dll ?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+40701308 ESTOR.dll ?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+4070130e ESTOR.dll ?WriteInt16L@RWriteStream@@QAEXH@Z
+40701314 EUSER.dll ?NullTTime@Time@@SA?AVTTime@@XZ
+4070131a EUSER.dll ?Copy@TDes16@@QAEXABVTDesC16@@@Z
+40701340 UP_DLL.obj ?_E32Dll@@YGHPAXI0@Z
+407013e8 EUSER.dll ?__WireKernel@UpWins@@SAXXZ
+40703000 uid.o ?uid@@3PAVTUid@@A
+40704000 ESTOR.dll __IMPORT_DESCRIPTOR_ESTOR
+40704014 EUSER.dll __IMPORT_DESCRIPTOR_EUSER
+40704028 EUSER.dll __NULL_IMPORT_DESCRIPTOR
+40704084 ESTOR.dll __imp_?ReadUint16L@RReadStream@@QAEGXZ
+40704088 ESTOR.dll __imp_?ReadInt8L@RReadStream@@QAECXZ
+4070408c ESTOR.dll __imp_?ReadInt32L@RReadStream@@QAEJXZ
+40704090 ESTOR.dll __imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+40704094 ESTOR.dll __imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+40704098 ESTOR.dll __imp_?ReadInt16L@RReadStream@@QAEFXZ
+4070409c ESTOR.dll __imp_?WriteUint16L@RWriteStream@@QAEXI@Z
+407040a0 ESTOR.dll __imp_?WriteInt8L@RWriteStream@@QAEXH@Z
+407040a4 ESTOR.dll __imp_?WriteInt32L@RWriteStream@@QAEXJ@Z
+407040a8 ESTOR.dll __imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+407040ac ESTOR.dll __imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+407040b0 ESTOR.dll __imp_?WriteInt16L@RWriteStream@@QAEXH@Z
+407040b4 ESTOR.dll ESTOR_NULL_THUNK_DATA
+407040b8 EUSER.dll __imp_??0TBufBase16@@IAE@H@Z
+407040bc EUSER.dll __imp_?NullTTime@Time@@SA?AVTTime@@XZ
+407040c0 EUSER.dll __imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z
+407040c4 EUSER.dll __imp_?__WireKernel@UpWins@@SAXXZ
+407040c8 EUSER.dll EUSER_NULL_THUNK_DATA
+40705000 UP_DLL.obj ?__xc_a@@3PAP6AXXZA
+40705008 UP_DLL.obj ?__xc_z@@3PAP6AXXZA
+40705010 UP_DLL.obj ?__xi_a@@3PAP6AXXZA
+40705018 UP_DLL.obj ?__xi_z@@3PAP6AXXZA
+40705020 UP_DLL.obj ?__xp_a@@3PAP6AXXZA
+40705028 UP_DLL.obj ?__xp_z@@3PAP6AXXZA
+40705030 UP_DLL.obj ?__xt_a@@3PAP6AXXZA
+40705038 UP_DLL.obj ?__xt_z@@3PAP6AXXZA
+40706030 common ?_initialised@@3HA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/fail/Preprocessed_text/content.rpp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+# 1 "W:\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS"
+// IRCOMM.RSS
+//
+// Copyright (c) 1998 Symbian Ltd. All rights reserved.
+//
+
+# 1 "ircomm.rls" 1
+rls_string STRING_r_irccsy_info1 "Infrared"
+# 6 "W:\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS" 2
+
+# 1 "..\\INC\\csy.rh" 1
+// CSY.RH
+//
+// Copyright (c) 1998 Symbian Ltd. All rights reserved.
+//
+
+
+STRUCT CSY_INFORMATION
+ {
+ LTEXT humanreadablename;
+ }
+# 7 "W:\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS" 2
+
+
+RESOURCE CSY_INFORMATION r_irccsy_info
+ {
+ humanreadablename=STRING_r_irccsy_info1;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/fail/SGML_file/content.html Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Tue Jul 15 18:05:14 BST 2003 -->
+<TITLE>
+All Classes
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/symbian/sdk/util/assertion/Assert.html" TARGET="classFrame">Assert</A>
+<BR>
+<A HREF="com/symbian/sdk/util/assertion/AssertionException.html" TARGET="classFrame">AssertionException</A>
+<BR>
+<A HREF="com/symbian/sdk/util/assertion/JniOutOfMemoryError.html" TARGET="classFrame">JniOutOfMemoryError</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
Binary file bintools/evalid/left/fail/SIS_file/release/armi/urel/gdbstub.sis has changed
Binary file bintools/evalid/left/fail/ZIP_file/content.zip has changed
Binary file bintools/evalid/left/fail/ZIP_file/order.zip has changed
Binary file bintools/evalid/left/fail/ZIP_file/size.zip has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/fail/unknown_format/data/BuildInfo.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,3 @@
+DeviceFamily 100
+DeviceFamilyRev 0x700
+ManufacturerSoftwareBuild 02223
Binary file bintools/evalid/left/fail/unknown_format/ksa/layout.bin has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/missing/leftonlydir/file.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1 @@
+left only dir
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/missing/leftonlyfile.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1 @@
+left only file
Binary file bintools/evalid/left/ok/CHM_file/identical/file.chm has changed
Binary file bintools/evalid/left/ok/CHM_file/rebuilt/file.chm has changed
Binary file bintools/evalid/left/ok/Compressed_E32_DLL/arm4/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/Compressed_E32_DLL/arm4/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/Compressed_E32_DLL/thumb/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/Compressed_E32_DLL/thumb/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/Compressed_E32_EXE/arm4/udeb/E32STRT.EXE has changed
Binary file bintools/evalid/left/ok/Compressed_E32_EXE/arm4/urel/E32STRT.EXE has changed
Binary file bintools/evalid/left/ok/Compressed_E32_EXE/thumb/udeb/E32STRT.EXE has changed
Binary file bintools/evalid/left/ok/Compressed_E32_EXE/thumb/urel/E32STRT.EXE has changed
Binary file bintools/evalid/left/ok/E32_DLL/arm4/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/E32_DLL/arm4/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/E32_DLL/thumb/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/E32_DLL/thumb/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/E32_EXE/arm4/udeb/ALARMSERVER.EXE has changed
Binary file bintools/evalid/left/ok/E32_EXE/arm4/urel/ALARMSERVER.EXE has changed
Binary file bintools/evalid/left/ok/E32_EXE/case_diff/armv5/udeb/usestaticdll.exe has changed
Binary file bintools/evalid/left/ok/E32_EXE/case_diff/armv5/urel/usestaticdll.exe has changed
Binary file bintools/evalid/left/ok/E32_EXE/thumb/udeb/ALARMSERVER.EXE has changed
Binary file bintools/evalid/left/ok/E32_EXE/thumb/urel/ALARMSERVER.EXE has changed
Binary file bintools/evalid/left/ok/ELF_library/case_diff/armv5/createstaticdll.lib has changed
Binary file bintools/evalid/left/ok/Intel_DLL/winscw/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/Intel_DLL/winscw/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/left/ok/Intel_exe/wins/urel/E32STRT.EXE has changed
Binary file bintools/evalid/left/ok/Intel_exe/winscw/udeb/AlarmServer.exe has changed
Binary file bintools/evalid/left/ok/Intel_exe/winscw/urel/E32STRT.EXE has changed
Binary file bintools/evalid/left/ok/Intel_library/wins/udeb/ALARMSHARED.LIB has changed
Binary file bintools/evalid/left/ok/Intel_library/wins/udeb/EEXE.LIB has changed
Binary file bintools/evalid/left/ok/Intel_library/wins/urel/EEXE.LIB has changed
Binary file bintools/evalid/left/ok/Intel_library/winscw/udeb/ALARMSHARED.LIB has changed
Binary file bintools/evalid/left/ok/Intel_library/winscw/udeb/EEXE.LIB has changed
Binary file bintools/evalid/left/ok/Intel_library/winscw/urel/EEXE.LIB has changed
Binary file bintools/evalid/left/ok/Intel_object/FNTTRAN.exp has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/arm4/udeb/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,301 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UDEB/UP_DLL.o)
+ (_E32Dll)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o) (_head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o) (________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o) (_head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o) (___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.exp
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLLSTUB.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x600
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UDEB/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001014 0x338 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o)
+ 0x10001060 TASShdAlarm::InternalizeL(RReadStream &)
+ 0x10001290 TASShdAlarm::Reset(void)
+ 0x10001014 TASShdAlarm::TASShdAlarm(void)
+ 0x10001198 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000134c 0x14 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDDLL.o)
+ 0x1000134c E32Dll(TDllReason)
+ .text 0x10001360 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x10001360 TBufBase16::TBufBase16(int)
+ .text 0x1000136c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x1000136c Time::NullTTime(void)
+ .text 0x10001378 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x10001378 TDes16::Copy(TDesC16 const &)
+ .text 0x10001384 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x10001384 RReadStream::ReadUint16L(void)
+ .text 0x10001390 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x10001390 RReadStream::ReadInt8L(void)
+ .text 0x1000139c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x1000139c RReadStream::ReadInt32L(void)
+ .text 0x100013a8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x100013a8 InternalizeL(TInt64 &, RReadStream &)
+ .text 0x100013b4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x100013b4 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x100013c0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x100013c0 RReadStream::ReadInt16L(void)
+ .text 0x100013cc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x100013cc RWriteStream::WriteUint16L(unsigned int)
+ .text 0x100013d8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x100013d8 RWriteStream::WriteInt8L(int)
+ .text 0x100013e4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100013e4 RWriteStream::WriteInt32L(long)
+ .text 0x100013f0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x100013f0 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013fc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x100013fc ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x10001408 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x10001408 RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x10001414 ___CTOR_LIST__=.
+ 0x10001414 __CTOR_LIST__=.
+ 0x10001414 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x10001418 0x4 LONG 0x0
+ 0x1000141c ___DTOR_LIST__=.
+ 0x1000141c __DTOR_LIST__=.
+ 0x1000141c 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x10001420 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x10001424 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x10001424 0x8 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ 0x10003000 _head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ 0x10003014 _head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ 0x10003104 ___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ 0x10003124 ________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab 0x10005000 0x4a00
+ *(.stab)
+ .stab 0x10005000 0x1d94 ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UDEB/UP_DLL.o)
+ .stab 0x10006d94 0x2928 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o)
+ 0x2934 (size before relaxing)
+ .stab 0x100096bc 0x1bc ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDDLL.o)
+ 0xd74 (size before relaxing)
+
+.stabstr 0x1000a000 0x53400
+ *(.stabstr)
+ .stabstr 0x1000a000 0x53226 ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UDEB/UP_DLL.o)
+ 0x0 (size before relaxing)
+OUTPUT(..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/arm4/udeb/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,458 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ (_E32Startup)
+..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TFindFile::TFindFile(RFs &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TFindFile::FindByDir(TDesC16 const &, TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TParseBase::FullName(void) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFile::Open(RFs &, TDesC16 const &, unsigned int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFile::Read(TDes8 &, int) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFsBase::Close(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFs::Connect(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFile::Size(int &) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFile::Read(TDes8 &) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFs::DriveList(TBuf8<26> &) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o) (_head__________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o) (___________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB_iname)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TLocale::TLocale(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TBufBase16::TBufBase16(TDesC16 const &, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TDes16::AppendNumFixedWidth(unsigned int, TRadix, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TPtr8::TPtr8(unsigned char *, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TLocale::Set(void) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TCurrencySymbol::TCurrencySymbol(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (User::SetCurrencySymbol(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (UserHal::SetXYInputCalibration(TDigitizerCalibration const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (User::Panic(TDesC16 const &, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (User::Alloc(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TPtr8::TPtr8(unsigned char *, int, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (User::Free(void *))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TBufBase8::TBufBase8(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TDesC8::AtC(int) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TDesC16::AtC(int) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RProcess::Resume(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RHandleBase::Close(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o) (_head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o) (________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (HAL::Get(HALData::TAttribute, int &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (HAL::Set(HALData::TAttribute, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o) (_head_______EPOC32_RELEASE_ARM4_UREL_HAL_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o) (________EPOC32_RELEASE_ARM4_UREL_HAL_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x00400000 __image_base__=0x400000
+ 0x00000000 __dll__=0x0
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.exp
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB
+LOAD ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB
+
+.text 0x00401000 0xa00
+ *(.init)
+ *(.text)
+ .text 0x00401000 0xac ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ 0x0040109c atexit
+ 0x00401000 _E32Startup
+ .text 0x004010ac 0x540 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o)
+ 0x00401328 E32Main(void)
+ .text 0x004015ec 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ 0x004015ec TFindFile::TFindFile(RFs &)
+ .text 0x004015f8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ 0x004015f8 TFindFile::FindByDir(TDesC16 const &, TDesC16 const &)
+ .text 0x00401604 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ 0x00401604 TParseBase::FullName(void) const
+ .text 0x00401610 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ 0x00401610 RFile::Open(RFs &, TDesC16 const &, unsigned int)
+ .text 0x0040161c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ 0x0040161c RFile::Read(TDes8 &, int) const
+ .text 0x00401628 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ 0x00401628 RFsBase::Close(void)
+ .text 0x00401634 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ 0x00401634 RFs::Connect(int)
+ .text 0x00401640 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ 0x00401640 RFile::Size(int &) const
+ .text 0x0040164c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ 0x0040164c RFile::Read(TDes8 &) const
+ .text 0x00401658 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ 0x00401658 RFs::DriveList(TBuf8<26> &) const
+ .text 0x00401664 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ 0x00401664 TLocale::TLocale(void)
+ .text 0x00401670 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ 0x00401670 TBufBase16::TBufBase16(TDesC16 const &, int)
+ .text 0x0040167c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ 0x0040167c TDes16::AppendNumFixedWidth(unsigned int, TRadix, int)
+ .text 0x00401688 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x00401688 TDes16::Copy(TDesC16 const &)
+ .text 0x00401694 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ 0x00401694 TPtr8::TPtr8(unsigned char *, int)
+ .text 0x004016a0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ 0x004016a0 TLocale::Set(void) const
+ .text 0x004016ac 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ 0x004016ac TCurrencySymbol::TCurrencySymbol(void)
+ .text 0x004016b8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ 0x004016b8 User::SetCurrencySymbol(TDesC16 const &)
+ .text 0x004016c4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x004016c4 TBufBase16::TBufBase16(int)
+ .text 0x004016d0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ 0x004016d0 UserHal::SetXYInputCalibration(TDigitizerCalibration const &)
+ .text 0x004016dc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ 0x004016dc User::Panic(TDesC16 const &, int)
+ .text 0x004016e8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ 0x004016e8 User::Alloc(int)
+ .text 0x004016f4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ 0x004016f4 TPtr8::TPtr8(unsigned char *, int, int)
+ .text 0x00401700 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ 0x00401700 User::Free(void *)
+ .text 0x0040170c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ 0x0040170c TBufBase8::TBufBase8(int)
+ .text 0x00401718 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ 0x00401718 TDesC8::AtC(int) const
+ .text 0x00401724 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ 0x00401724 TDesC16::AtC(int) const
+ .text 0x00401730 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ 0x00401730 RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .text 0x0040173c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ 0x0040173c RProcess::Resume(void)
+ .text 0x00401748 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ 0x00401748 RHandleBase::Close(void)
+ .text 0x00401754 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ 0x00401754 HAL::Get(HALData::TAttribute, int &)
+ .text 0x00401760 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ 0x00401760 HAL::Set(HALData::TAttribute, int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x0040176c ___CTOR_LIST__=.
+ 0x0040176c __CTOR_LIST__=.
+ 0x0040176c 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x00401770 0x4 LONG 0x0
+ 0x00401774 ___DTOR_LIST__=.
+ 0x00401774 __DTOR_LIST__=.
+ 0x00401774 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x00401778 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x0040177c etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x0040177c 0xe0 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x00402000 0x0
+ 0x00402000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x00402000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x00402000 0x0
+ 0x00402000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x00402000 __bss_end__=.
+
+.edata
+ *(.edata)
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x00402000 0x400
+ SORT(*)(.idata$2)
+ .idata$2 0x00402000 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o)
+ 0x00402000 _head__________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB
+ .idata$2 0x00402014 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ 0x00402014 _head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ .idata$2 0x00402028 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o)
+ 0x00402028 _head_______EPOC32_RELEASE_ARM4_UREL_HAL_LIB
+ SORT(*)(.idata$3)
+ .idata$3 0x0040203c 0x20 ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ 0x0040205c 0x4 LONG 0x0
+ 0x00402060 0x4 LONG 0x0
+ 0x00402064 0x4 LONG 0x0
+ 0x00402068 0x4 LONG 0x0
+ 0x0040206c 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x00402070 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o)
+ .idata$4 0x00402074 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ .idata$4 0x00402078 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ .idata$4 0x0040207c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ .idata$4 0x00402080 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ .idata$4 0x00402084 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ .idata$4 0x00402088 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ .idata$4 0x0040208c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ .idata$4 0x00402090 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ .idata$4 0x00402094 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ .idata$4 0x00402098 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ .idata$4 0x0040209c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285t.o)
+ .idata$4 0x004020a0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$4 0x004020a4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ .idata$4 0x004020a8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ .idata$4 0x004020ac 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ .idata$4 0x004020b0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ .idata$4 0x004020b4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ .idata$4 0x004020b8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$4 0x004020bc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ .idata$4 0x004020c0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ .idata$4 0x004020c4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ .idata$4 0x004020c8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ .idata$4 0x004020cc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ .idata$4 0x004020d0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ .idata$4 0x004020d4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ .idata$4 0x004020d8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ .idata$4 0x004020dc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$4 0x004020e0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ .idata$4 0x004020e4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ .idata$4 0x004020e8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ .idata$4 0x004020ec 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ .idata$4 0x004020f0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ .idata$4 0x004020f4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ .idata$4 0x004020f8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o)
+ .idata$4 0x004020fc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ .idata$4 0x00402100 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ .idata$4 0x00402104 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x00402108 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o)
+ .idata$5 0x0040210c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ 0x0040210c _imp__Close__7RFsBase
+ 0x0040210c RFsBase::__imp_Close(void)
+ .idata$5 0x00402110 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ 0x00402110 _imp__Connect__3RFsi
+ 0x00402110 RFs::__imp_Connect(int)
+ .idata$5 0x00402114 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ 0x00402114 RFs::__imp_DriveList(TBuf8<26> &) const
+ 0x00402114 _imp__DriveList__C3RFsRt5TBuf81i26
+ .idata$5 0x00402118 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ 0x00402118 _imp__FindByDir__9TFindFileRC7TDesC16T1
+ 0x00402118 TFindFile::__imp_FindByDir(TDesC16 const &, TDesC16 const &)
+ .idata$5 0x0040211c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ 0x0040211c _imp__FullName__C10TParseBase
+ 0x0040211c TParseBase::__imp_FullName(void) const
+ .idata$5 0x00402120 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ 0x00402120 RFile::__imp_Open(RFs &, TDesC16 const &, unsigned int)
+ 0x00402120 _imp__Open__5RFileR3RFsRC7TDesC16Ui
+ .idata$5 0x00402124 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ 0x00402124 _imp__Read__C5RFileR5TDes8
+ 0x00402124 RFile::__imp_Read(TDes8 &) const
+ .idata$5 0x00402128 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ 0x00402128 _imp__Read__C5RFileR5TDes8i
+ 0x00402128 RFile::__imp_Read(TDes8 &, int) const
+ .idata$5 0x0040212c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ 0x0040212c RFile::__imp_Size(int &) const
+ 0x0040212c _imp__Size__C5RFileRi
+ .idata$5 0x00402130 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ 0x00402130 TFindFile::_imp__(RFs &)
+ 0x00402130 __imp___9TFindFileR3RFs
+ .idata$5 0x00402134 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285t.o)
+ .idata$5 0x00402138 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$5 0x0040213c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ 0x0040213c User::__imp_Alloc(int)
+ 0x0040213c _imp__Alloc__4Useri
+ .idata$5 0x00402140 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ 0x00402140 _imp__AppendNumFixedWidth__6TDes16Ui6TRadixi
+ 0x00402140 TDes16::__imp_AppendNumFixedWidth(unsigned int, TRadix, int)
+ .idata$5 0x00402144 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ 0x00402144 TDesC8::__imp_AtC(int) const
+ 0x00402144 _imp__AtC__C6TDesC8i
+ .idata$5 0x00402148 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ 0x00402148 _imp__AtC__C7TDesC16i
+ 0x00402148 TDesC16::__imp_AtC(int) const
+ .idata$5 0x0040214c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ 0x0040214c RHandleBase::__imp_Close(void)
+ 0x0040214c _imp__Close__11RHandleBase
+ .idata$5 0x00402150 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x00402150 _imp__Copy__6TDes16RC7TDesC16
+ 0x00402150 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x00402154 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ 0x00402154 _imp__Create__8RProcessRC7TDesC16T110TOwnerType
+ 0x00402154 RProcess::__imp_Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .idata$5 0x00402158 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ 0x00402158 _imp__Free__4UserPv
+ 0x00402158 User::__imp_Free(void *)
+ .idata$5 0x0040215c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ 0x0040215c _imp__Panic__4UserRC7TDesC16i
+ 0x0040215c User::__imp_Panic(TDesC16 const &, int)
+ .idata$5 0x00402160 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ 0x00402160 _imp__Resume__8RProcess
+ 0x00402160 RProcess::__imp_Resume(void)
+ .idata$5 0x00402164 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ 0x00402164 _imp__SetCurrencySymbol__4UserRC7TDesC16
+ 0x00402164 User::__imp_SetCurrencySymbol(TDesC16 const &)
+ .idata$5 0x00402168 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ 0x00402168 _imp__SetXYInputCalibration__7UserHalRC21TDigitizerCalibration
+ 0x00402168 UserHal::__imp_SetXYInputCalibration(TDigitizerCalibration const &)
+ .idata$5 0x0040216c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ 0x0040216c _imp__Set__C7TLocale
+ 0x0040216c TLocale::__imp_Set(void) const
+ .idata$5 0x00402170 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ 0x00402170 TBufBase16::_imp__(TDesC16 const &, int)
+ 0x00402170 __imp___10TBufBase16RC7TDesC16i
+ .idata$5 0x00402174 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x00402174 TBufBase16::_imp__(int)
+ 0x00402174 __imp___10TBufBase16i
+ .idata$5 0x00402178 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ 0x00402178 __imp___15TCurrencySymbol
+ 0x00402178 TCurrencySymbol::_imp__(void)
+ .idata$5 0x0040217c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ 0x0040217c TPtr8::_imp__(unsigned char *, int)
+ 0x0040217c __imp___5TPtr8PUci
+ .idata$5 0x00402180 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ 0x00402180 __imp___5TPtr8PUcii
+ 0x00402180 TPtr8::_imp__(unsigned char *, int, int)
+ .idata$5 0x00402184 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ 0x00402184 TLocale::_imp__(void)
+ 0x00402184 __imp___7TLocale
+ .idata$5 0x00402188 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ 0x00402188 __imp___9TBufBase8i
+ 0x00402188 TBufBase8::_imp__(int)
+ .idata$5 0x0040218c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ .idata$5 0x00402190 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o)
+ .idata$5 0x00402194 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ 0x00402194 HAL::__imp_Get(HALData::TAttribute, int &)
+ 0x00402194 _imp__Get__3HALQ27HALData10TAttributeRi
+ .idata$5 0x00402198 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ 0x00402198 _imp__Set__3HALQ27HALData10TAttributei
+ 0x00402198 HAL::__imp_Set(HALData::TAttribute, int)
+ .idata$5 0x0040219c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x004021a0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ .idata$7 0x004021a4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ .idata$7 0x004021a8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ .idata$7 0x004021ac 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ .idata$7 0x004021b0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ .idata$7 0x004021b4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ .idata$7 0x004021b8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ .idata$7 0x004021bc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ .idata$7 0x004021c0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ .idata$7 0x004021c4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ .idata$7 0x004021c8 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285t.o)
+ 0x004021c8 ___________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB_iname
+ .idata$7 0x004021dc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ .idata$7 0x004021e0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ .idata$7 0x004021e4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ .idata$7 0x004021e8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ .idata$7 0x004021ec 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ .idata$7 0x004021f0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$7 0x004021f4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ .idata$7 0x004021f8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ .idata$7 0x004021fc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ .idata$7 0x00402200 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ .idata$7 0x00402204 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ .idata$7 0x00402208 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ .idata$7 0x0040220c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ .idata$7 0x00402210 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ .idata$7 0x00402214 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$7 0x00402218 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ .idata$7 0x0040221c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ .idata$7 0x00402220 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ .idata$7 0x00402224 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ .idata$7 0x00402228 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ .idata$7 0x0040222c 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ 0x0040222c ________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+ .idata$7 0x00402240 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ .idata$7 0x00402244 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ .idata$7 0x00402248 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415t.o)
+ 0x00402248 ________EPOC32_RELEASE_ARM4_UREL_HAL_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x00403000 0x0
+ 0x00403000 end=.
+ 0x00403000 _end=.
+ 0x00403000 __end__=.
+
+.reloc 0x00403000 0x200
+ *(.reloc)
+ .reloc 0x00403000 0x60 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab 0x00404000 0x4600
+ *(.stab)
+ .stab 0x00404000 0xe34 ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ .stab 0x00404e34 0x3618 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o)
+ 0x3624 (size before relaxing)
+
+.stabstr 0x00409000 0x34000
+ *(.stabstr)
+ .stabstr 0x00409000 0x33f32 ..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ 0x0 (size before relaxing)
+OUTPUT(..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.EXE epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/arm4/urel/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o) (_head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o) (________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o) (_head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o) (___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001004 0x318 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ 0x10001048 TASShdAlarm::InternalizeL(RReadStream &)
+ 0x10001264 TASShdAlarm::Reset(void)
+ 0x10001004 TASShdAlarm::TASShdAlarm(void)
+ 0x10001174 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000131c 0x8 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ 0x1000131c E32Dll(TDllReason)
+ .text 0x10001324 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x10001324 TBufBase16::TBufBase16(int)
+ .text 0x10001330 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x10001330 Time::NullTTime(void)
+ .text 0x1000133c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x1000133c TDes16::Copy(TDesC16 const &)
+ .text 0x10001348 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x10001348 RReadStream::ReadUint16L(void)
+ .text 0x10001354 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x10001354 RReadStream::ReadInt8L(void)
+ .text 0x10001360 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x10001360 RReadStream::ReadInt32L(void)
+ .text 0x1000136c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x1000136c InternalizeL(TInt64 &, RReadStream &)
+ .text 0x10001378 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x10001378 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x10001384 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x10001384 RReadStream::ReadInt16L(void)
+ .text 0x10001390 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x10001390 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x1000139c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x1000139c RWriteStream::WriteInt8L(int)
+ .text 0x100013a8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100013a8 RWriteStream::WriteInt32L(long)
+ .text 0x100013b4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x100013b4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013c0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x100013c0 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x100013cc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x100013cc RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x100013d8 ___CTOR_LIST__=.
+ 0x100013d8 __CTOR_LIST__=.
+ 0x100013d8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x100013dc 0x4 LONG 0x0
+ 0x100013e0 ___DTOR_LIST__=.
+ 0x100013e0 __DTOR_LIST__=.
+ 0x100013e0 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x100013e4 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x100013e8 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x100013e8 0x8 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ 0x10003000 _head__________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ 0x10003014 _head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d2091t.o)
+ 0x10003104 ___________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ 0x10003124 ________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/arm4/urel/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,453 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/ARM4/UREL/UC_EXE.o)
+ (_E32Startup)
+..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TFindFile::TFindFile(RFs &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TFindFile::FindByDir(TDesC16 const &, TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TParseBase::FullName(void) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFile::Open(RFs &, TDesC16 const &, unsigned int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFile::Read(TDes8 &, int) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFsBase::Close(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFs::Connect(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFile::Size(int &) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFile::Read(TDes8 &) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFs::DriveList(TBuf8<26> &) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o) (_head__________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o) (___________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB_iname)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TLocale::TLocale(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TBufBase16::TBufBase16(TDesC16 const &, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TDes16::AppendNumFixedWidth(unsigned int, TRadix, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TPtr8::TPtr8(unsigned char *, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TLocale::Set(void) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TCurrencySymbol::TCurrencySymbol(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (User::SetCurrencySymbol(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (UserHal::SetXYInputCalibration(TDigitizerCalibration const &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (User::Panic(TDesC16 const &, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (User::Alloc(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TPtr8::TPtr8(unsigned char *, int, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (User::Free(void *))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TBufBase8::TBufBase8(int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TDesC8::AtC(int) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TDesC16::AtC(int) const)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RProcess::Resume(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RHandleBase::Close(void))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o) (_head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o) (________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (HAL::Get(HALData::TAttribute, int &))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (HAL::Set(HALData::TAttribute, int))
+..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o) (_head_______EPOC32_RELEASE_ARM4_UREL_HAL_LIB)
+..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415t.o)
+ ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o) (________EPOC32_RELEASE_ARM4_UREL_HAL_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x00400000 __image_base__=0x400000
+ 0x00000000 __dll__=0x0
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.exp
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EEXE.LIB
+LOAD ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB
+
+.text 0x00401000 0x800
+ *(.init)
+ *(.text)
+ .text 0x00401000 0x98 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/ARM4/UREL/UC_EXE.o)
+ 0x00401094 atexit
+ 0x00401000 _E32Startup
+ .text 0x00401098 0x4e0 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o)
+ 0x004012dc E32Main(void)
+ .text 0x00401578 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ 0x00401578 TFindFile::TFindFile(RFs &)
+ .text 0x00401584 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ 0x00401584 TFindFile::FindByDir(TDesC16 const &, TDesC16 const &)
+ .text 0x00401590 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ 0x00401590 TParseBase::FullName(void) const
+ .text 0x0040159c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ 0x0040159c RFile::Open(RFs &, TDesC16 const &, unsigned int)
+ .text 0x004015a8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ 0x004015a8 RFile::Read(TDes8 &, int) const
+ .text 0x004015b4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ 0x004015b4 RFsBase::Close(void)
+ .text 0x004015c0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ 0x004015c0 RFs::Connect(int)
+ .text 0x004015cc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ 0x004015cc RFile::Size(int &) const
+ .text 0x004015d8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ 0x004015d8 RFile::Read(TDes8 &) const
+ .text 0x004015e4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ 0x004015e4 RFs::DriveList(TBuf8<26> &) const
+ .text 0x004015f0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ 0x004015f0 TLocale::TLocale(void)
+ .text 0x004015fc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ 0x004015fc TBufBase16::TBufBase16(TDesC16 const &, int)
+ .text 0x00401608 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ 0x00401608 TDes16::AppendNumFixedWidth(unsigned int, TRadix, int)
+ .text 0x00401614 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x00401614 TDes16::Copy(TDesC16 const &)
+ .text 0x00401620 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ 0x00401620 TPtr8::TPtr8(unsigned char *, int)
+ .text 0x0040162c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ 0x0040162c TLocale::Set(void) const
+ .text 0x00401638 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ 0x00401638 TCurrencySymbol::TCurrencySymbol(void)
+ .text 0x00401644 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ 0x00401644 User::SetCurrencySymbol(TDesC16 const &)
+ .text 0x00401650 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x00401650 TBufBase16::TBufBase16(int)
+ .text 0x0040165c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ 0x0040165c UserHal::SetXYInputCalibration(TDigitizerCalibration const &)
+ .text 0x00401668 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ 0x00401668 User::Panic(TDesC16 const &, int)
+ .text 0x00401674 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ 0x00401674 User::Alloc(int)
+ .text 0x00401680 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ 0x00401680 TPtr8::TPtr8(unsigned char *, int, int)
+ .text 0x0040168c 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ 0x0040168c User::Free(void *)
+ .text 0x00401698 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ 0x00401698 TBufBase8::TBufBase8(int)
+ .text 0x004016a4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ 0x004016a4 TDesC8::AtC(int) const
+ .text 0x004016b0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ 0x004016b0 TDesC16::AtC(int) const
+ .text 0x004016bc 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ 0x004016bc RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .text 0x004016c8 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ 0x004016c8 RProcess::Resume(void)
+ .text 0x004016d4 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ 0x004016d4 RHandleBase::Close(void)
+ .text 0x004016e0 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ 0x004016e0 HAL::Get(HALData::TAttribute, int &)
+ .text 0x004016ec 0xc ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ 0x004016ec HAL::Set(HALData::TAttribute, int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x004016f8 ___CTOR_LIST__=.
+ 0x004016f8 __CTOR_LIST__=.
+ 0x004016f8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x004016fc 0x4 LONG 0x0
+ 0x00401700 ___DTOR_LIST__=.
+ 0x00401700 __DTOR_LIST__=.
+ 0x00401700 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x00401704 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x00401708 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x00401708 0xe0 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x00402000 0x0
+ 0x00402000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x00402000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x00402000 0x0
+ 0x00402000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x00402000 __bss_end__=.
+
+.edata
+ *(.edata)
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x00402000 0x400
+ SORT(*)(.idata$2)
+ .idata$2 0x00402000 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o)
+ 0x00402000 _head__________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB
+ .idata$2 0x00402014 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ 0x00402014 _head_______EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ .idata$2 0x00402028 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o)
+ 0x00402028 _head_______EPOC32_RELEASE_ARM4_UREL_HAL_LIB
+ SORT(*)(.idata$3)
+ .idata$3 0x0040203c 0x20 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/ARM4/UREL/UC_EXE.o)
+ 0x0040205c 0x4 LONG 0x0
+ 0x00402060 0x4 LONG 0x0
+ 0x00402064 0x4 LONG 0x0
+ 0x00402068 0x4 LONG 0x0
+ 0x0040206c 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x00402070 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o)
+ .idata$4 0x00402074 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ .idata$4 0x00402078 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ .idata$4 0x0040207c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ .idata$4 0x00402080 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ .idata$4 0x00402084 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ .idata$4 0x00402088 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ .idata$4 0x0040208c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ .idata$4 0x00402090 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ .idata$4 0x00402094 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ .idata$4 0x00402098 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ .idata$4 0x0040209c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285t.o)
+ .idata$4 0x004020a0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$4 0x004020a4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ .idata$4 0x004020a8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ .idata$4 0x004020ac 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ .idata$4 0x004020b0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ .idata$4 0x004020b4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ .idata$4 0x004020b8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$4 0x004020bc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ .idata$4 0x004020c0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ .idata$4 0x004020c4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ .idata$4 0x004020c8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ .idata$4 0x004020cc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ .idata$4 0x004020d0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ .idata$4 0x004020d4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ .idata$4 0x004020d8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ .idata$4 0x004020dc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$4 0x004020e0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ .idata$4 0x004020e4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ .idata$4 0x004020e8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ .idata$4 0x004020ec 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ .idata$4 0x004020f0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ .idata$4 0x004020f4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ .idata$4 0x004020f8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o)
+ .idata$4 0x004020fc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ .idata$4 0x00402100 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ .idata$4 0x00402104 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x00402108 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285h.o)
+ .idata$5 0x0040210c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ 0x0040210c _imp__Close__7RFsBase
+ 0x0040210c RFsBase::__imp_Close(void)
+ .idata$5 0x00402110 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ 0x00402110 _imp__Connect__3RFsi
+ 0x00402110 RFs::__imp_Connect(int)
+ .idata$5 0x00402114 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ 0x00402114 RFs::__imp_DriveList(TBuf8<26> &) const
+ 0x00402114 _imp__DriveList__C3RFsRt5TBuf81i26
+ .idata$5 0x00402118 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ 0x00402118 _imp__FindByDir__9TFindFileRC7TDesC16T1
+ 0x00402118 TFindFile::__imp_FindByDir(TDesC16 const &, TDesC16 const &)
+ .idata$5 0x0040211c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ 0x0040211c _imp__FullName__C10TParseBase
+ 0x0040211c TParseBase::__imp_FullName(void) const
+ .idata$5 0x00402120 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ 0x00402120 RFile::__imp_Open(RFs &, TDesC16 const &, unsigned int)
+ 0x00402120 _imp__Open__5RFileR3RFsRC7TDesC16Ui
+ .idata$5 0x00402124 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ 0x00402124 _imp__Read__C5RFileR5TDes8
+ 0x00402124 RFile::__imp_Read(TDes8 &) const
+ .idata$5 0x00402128 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ 0x00402128 _imp__Read__C5RFileR5TDes8i
+ 0x00402128 RFile::__imp_Read(TDes8 &, int) const
+ .idata$5 0x0040212c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ 0x0040212c RFile::__imp_Size(int &) const
+ 0x0040212c _imp__Size__C5RFileRi
+ .idata$5 0x00402130 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ 0x00402130 TFindFile::_imp__(RFs &)
+ 0x00402130 __imp___9TFindFileR3RFs
+ .idata$5 0x00402134 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285t.o)
+ .idata$5 0x00402138 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216h.o)
+ .idata$5 0x0040213c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ 0x0040213c User::__imp_Alloc(int)
+ 0x0040213c _imp__Alloc__4Useri
+ .idata$5 0x00402140 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ 0x00402140 _imp__AppendNumFixedWidth__6TDes16Ui6TRadixi
+ 0x00402140 TDes16::__imp_AppendNumFixedWidth(unsigned int, TRadix, int)
+ .idata$5 0x00402144 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ 0x00402144 TDesC8::__imp_AtC(int) const
+ 0x00402144 _imp__AtC__C6TDesC8i
+ .idata$5 0x00402148 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ 0x00402148 _imp__AtC__C7TDesC16i
+ 0x00402148 TDesC16::__imp_AtC(int) const
+ .idata$5 0x0040214c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ 0x0040214c RHandleBase::__imp_Close(void)
+ 0x0040214c _imp__Close__11RHandleBase
+ .idata$5 0x00402150 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ 0x00402150 _imp__Copy__6TDes16RC7TDesC16
+ 0x00402150 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x00402154 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ 0x00402154 _imp__Create__8RProcessRC7TDesC16T110TOwnerType
+ 0x00402154 RProcess::__imp_Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .idata$5 0x00402158 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ 0x00402158 _imp__Free__4UserPv
+ 0x00402158 User::__imp_Free(void *)
+ .idata$5 0x0040215c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ 0x0040215c _imp__Panic__4UserRC7TDesC16i
+ 0x0040215c User::__imp_Panic(TDesC16 const &, int)
+ .idata$5 0x00402160 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ 0x00402160 _imp__Resume__8RProcess
+ 0x00402160 RProcess::__imp_Resume(void)
+ .idata$5 0x00402164 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ 0x00402164 _imp__SetCurrencySymbol__4UserRC7TDesC16
+ 0x00402164 User::__imp_SetCurrencySymbol(TDesC16 const &)
+ .idata$5 0x00402168 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ 0x00402168 _imp__SetXYInputCalibration__7UserHalRC21TDigitizerCalibration
+ 0x00402168 UserHal::__imp_SetXYInputCalibration(TDigitizerCalibration const &)
+ .idata$5 0x0040216c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ 0x0040216c _imp__Set__C7TLocale
+ 0x0040216c TLocale::__imp_Set(void) const
+ .idata$5 0x00402170 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ 0x00402170 TBufBase16::_imp__(TDesC16 const &, int)
+ 0x00402170 __imp___10TBufBase16RC7TDesC16i
+ .idata$5 0x00402174 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ 0x00402174 TBufBase16::_imp__(int)
+ 0x00402174 __imp___10TBufBase16i
+ .idata$5 0x00402178 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ 0x00402178 __imp___15TCurrencySymbol
+ 0x00402178 TCurrencySymbol::_imp__(void)
+ .idata$5 0x0040217c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ 0x0040217c TPtr8::_imp__(unsigned char *, int)
+ 0x0040217c __imp___5TPtr8PUci
+ .idata$5 0x00402180 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ 0x00402180 __imp___5TPtr8PUcii
+ 0x00402180 TPtr8::_imp__(unsigned char *, int, int)
+ .idata$5 0x00402184 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ 0x00402184 TLocale::_imp__(void)
+ 0x00402184 __imp___7TLocale
+ .idata$5 0x00402188 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ 0x00402188 __imp___9TBufBase8i
+ 0x00402188 TBufBase8::_imp__(int)
+ .idata$5 0x0040218c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ .idata$5 0x00402190 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415h.o)
+ .idata$5 0x00402194 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ 0x00402194 HAL::__imp_Get(HALData::TAttribute, int &)
+ 0x00402194 _imp__Get__3HALQ27HALData10TAttributeRi
+ .idata$5 0x00402198 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ 0x00402198 _imp__Set__3HALQ27HALData10TAttributei
+ 0x00402198 HAL::__imp_Set(HALData::TAttribute, int)
+ .idata$5 0x0040219c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x004021a0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00015.o)
+ .idata$7 0x004021a4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00018.o)
+ .idata$7 0x004021a8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00034.o)
+ .idata$7 0x004021ac 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00044.o)
+ .idata$7 0x004021b0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00051.o)
+ .idata$7 0x004021b4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00121.o)
+ .idata$7 0x004021b8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00136.o)
+ .idata$7 0x004021bc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00138.o)
+ .idata$7 0x004021c0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00185.o)
+ .idata$7 0x004021c4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285s_00217.o)
+ .idata$7 0x004021c8 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1285t.o)
+ 0x004021c8 ___________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB_iname
+ .idata$7 0x004021dc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00045.o)
+ .idata$7 0x004021e0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00068.o)
+ .idata$7 0x004021e4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00098.o)
+ .idata$7 0x004021e8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00099.o)
+ .idata$7 0x004021ec 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00172.o)
+ .idata$7 0x004021f0 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00251.o)
+ .idata$7 0x004021f4 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00292.o)
+ .idata$7 0x004021f8 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00476.o)
+ .idata$7 0x004021fc 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00809.o)
+ .idata$7 0x00402200 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00953.o)
+ .idata$7 0x00402204 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_00981.o)
+ .idata$7 0x00402208 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01039.o)
+ .idata$7 0x0040220c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01074.o)
+ .idata$7 0x00402210 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01282.o)
+ .idata$7 0x00402214 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01283.o)
+ .idata$7 0x00402218 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01336.o)
+ .idata$7 0x0040221c 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01366.o)
+ .idata$7 0x00402220 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01367.o)
+ .idata$7 0x00402224 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01405.o)
+ .idata$7 0x00402228 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216s_01431.o)
+ .idata$7 0x0040222c 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1216t.o)
+ 0x0040222c ________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+ .idata$7 0x00402240 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00001.o)
+ .idata$7 0x00402244 0x4 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415s_00002.o)
+ .idata$7 0x00402248 0x14 ..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1415t.o)
+ 0x00402248 ________EPOC32_RELEASE_ARM4_UREL_HAL_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x00403000 0x0
+ 0x00403000 end=.
+ 0x00403000 _end=.
+ 0x00403000 __end__=.
+
+.reloc 0x00403000 0x200
+ *(.reloc)
+ .reloc 0x00403000 0x60 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.EXE epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/thumb/udeb/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,301 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/THUMB/UDEB/UP_DLL.o)
+ (_E32Dll)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o) (_head_______EPOC32_RELEASE_THUMB_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o) (________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o) (_head__________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o) (___________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.exp
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLLSTUB.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0xc ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/THUMB/UDEB/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x1000100c 0x254 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o)
+ 0x1000104c TASShdAlarm::InternalizeL(RReadStream &)
+ 0x100011d8 TASShdAlarm::Reset(void)
+ 0x1000100c TASShdAlarm::TASShdAlarm(void)
+ 0x1000111c TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x10001260 0x4 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDDLL.o)
+ 0x10001260 E32Dll(TDllReason)
+ .text 0x10001264 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ 0x10001264 TBufBase16::TBufBase16(int)
+ .text 0x10001270 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ 0x10001270 Time::NullTTime(void)
+ .text 0x1000127c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ 0x1000127c TDes16::Copy(TDesC16 const &)
+ .text 0x10001288 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ 0x10001288 RReadStream::ReadUint16L(void)
+ .text 0x10001294 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ 0x10001294 RReadStream::ReadInt8L(void)
+ .text 0x100012a0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ 0x100012a0 RReadStream::ReadInt32L(void)
+ .text 0x100012ac 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ 0x100012ac InternalizeL(TInt64 &, RReadStream &)
+ .text 0x100012b8 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ 0x100012b8 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x100012c4 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ 0x100012c4 RReadStream::ReadInt16L(void)
+ .text 0x100012d0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ 0x100012d0 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x100012dc 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ 0x100012dc RWriteStream::WriteInt8L(int)
+ .text 0x100012e8 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ 0x100012e8 RWriteStream::WriteInt32L(long)
+ .text 0x100012f4 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ 0x100012f4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x10001304 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ 0x10001304 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x10001310 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ 0x10001310 RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x1000131c ___CTOR_LIST__=.
+ 0x1000131c __CTOR_LIST__=.
+ 0x1000131c 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x10001320 0x4 LONG 0x0
+ 0x10001324 ___DTOR_LIST__=.
+ 0x10001324 __DTOR_LIST__=.
+ 0x10001324 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x10001328 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x1000132c etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x1000132c 0xc ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o)
+ 0x10003000 _head__________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ 0x10003014 _head_______EPOC32_RELEASE_THUMB_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951t.o)
+ 0x10003104 ___________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ 0x10003124 ________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x2c ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab 0x10005000 0x4a00
+ *(.stab)
+ .stab 0x10005000 0x1da0 ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/THUMB/UDEB/UP_DLL.o)
+ .stab 0x10006da0 0x29ac ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o)
+ 0x29b8 (size before relaxing)
+ .stab 0x1000974c 0x1bc ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDDLL.o)
+ 0xd74 (size before relaxing)
+
+.stabstr 0x1000a000 0x53400
+ *(.stabstr)
+ .stabstr 0x1000a000 0x532bd ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/THUMB/UDEB/UP_DLL.o)
+ 0x0 (size before relaxing)
+OUTPUT(..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/thumb/udeb/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,478 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ (_E32Startup)
+..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EPOC/EGCC/THUMB/UDEB/UP_GCC.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o) (_call_via_r0)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TFindFile::TFindFile(RFs &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TFindFile::FindByDir(TDesC16 const &, TDesC16 const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TParseBase::FullName(void) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFile::Open(RFs &, TDesC16 const &, unsigned int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFile::Read(TDes8 &, int) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFsBase::Close(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFs::Connect(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFile::Size(int &) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFile::Read(TDes8 &) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFs::DriveList(TBuf8<26> &) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o) (_head__________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o) (___________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB_iname)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TLocale::TLocale(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TBufBase16::TBufBase16(TDesC16 const &, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TDes16::AppendNumFixedWidth(unsigned int, TRadix, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TPtr8::TPtr8(unsigned char *, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TLocale::Set(void) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TCurrencySymbol::TCurrencySymbol(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (User::SetCurrencySymbol(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (UserHal::SetXYInputCalibration(TDigitizerCalibration const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (User::Panic(TDesC16 const &, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (User::Alloc(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TPtr8::TPtr8(unsigned char *, int, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (User::Free(void *))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TBufBase8::TBufBase8(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TDesC8::AtC(int) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TDesC16::AtC(int) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RProcess::Resume(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RHandleBase::Close(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o) (_head_______EPOC32_RELEASE_THUMB_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o) (________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (HAL::Get(HALData::TAttribute, int &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (HAL::Set(HALData::TAttribute, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o) (_head_______EPOC32_RELEASE_THUMB_UREL_HAL_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o) (________EPOC32_RELEASE_THUMB_UREL_HAL_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x00400000 __image_base__=0x400000
+ 0x00000000 __dll__=0x0
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.exp
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB
+LOAD ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB
+
+.text 0x00401000 0x800
+ *(.init)
+ *(.text)
+ .text 0x00401000 0x60 ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ 0x0040105c atexit
+ 0x00401000 _E32Startup
+ .text 0x00401060 0x438 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o)
+ 0x00401244 E32Main(void)
+ .text 0x00401498 0x38 ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EPOC/EGCC/THUMB/UDEB/UP_GCC.o)
+ 0x004014a0 _call_via_r2
+ 0x004014b0 _call_via_r6
+ 0x004014ac _call_via_r5
+ 0x004014a4 _call_via_r3
+ 0x004014c4 _call_via_fp
+ 0x004014b8 _call_via_r8
+ 0x004014b4 _call_via_r7
+ 0x00401498 _call_via_r0
+ 0x004014c0 _call_via_sl
+ 0x004014bc _call_via_r9
+ 0x004014a8 _call_via_r4
+ 0x0040149c _call_via_r1
+ 0x004014c8 _call_via_ip
+ 0x004014cc _call_via_lr
+ .text 0x004014d0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ 0x004014d0 TFindFile::TFindFile(RFs &)
+ .text 0x004014dc 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ 0x004014dc TFindFile::FindByDir(TDesC16 const &, TDesC16 const &)
+ .text 0x004014e8 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ 0x004014e8 TParseBase::FullName(void) const
+ .text 0x004014f4 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ 0x004014f4 RFile::Open(RFs &, TDesC16 const &, unsigned int)
+ .text 0x00401504 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ 0x00401504 RFile::Read(TDes8 &, int) const
+ .text 0x00401510 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ 0x00401510 RFsBase::Close(void)
+ .text 0x0040151c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ 0x0040151c RFs::Connect(int)
+ .text 0x00401528 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ 0x00401528 RFile::Size(int &) const
+ .text 0x00401534 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ 0x00401534 RFile::Read(TDes8 &) const
+ .text 0x00401540 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ 0x00401540 RFs::DriveList(TBuf8<26> &) const
+ .text 0x0040154c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ 0x0040154c TLocale::TLocale(void)
+ .text 0x00401558 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ 0x00401558 TBufBase16::TBufBase16(TDesC16 const &, int)
+ .text 0x00401564 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ 0x00401564 TDes16::AppendNumFixedWidth(unsigned int, TRadix, int)
+ .text 0x00401574 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ 0x00401574 TDes16::Copy(TDesC16 const &)
+ .text 0x00401580 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ 0x00401580 TPtr8::TPtr8(unsigned char *, int)
+ .text 0x0040158c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ 0x0040158c TLocale::Set(void) const
+ .text 0x00401598 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ 0x00401598 TCurrencySymbol::TCurrencySymbol(void)
+ .text 0x004015a4 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ 0x004015a4 User::SetCurrencySymbol(TDesC16 const &)
+ .text 0x004015b0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ 0x004015b0 TBufBase16::TBufBase16(int)
+ .text 0x004015bc 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ 0x004015bc UserHal::SetXYInputCalibration(TDigitizerCalibration const &)
+ .text 0x004015c8 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ 0x004015c8 User::Panic(TDesC16 const &, int)
+ .text 0x004015d4 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ 0x004015d4 User::Alloc(int)
+ .text 0x004015e0 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ 0x004015e0 TPtr8::TPtr8(unsigned char *, int, int)
+ .text 0x004015f0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ 0x004015f0 User::Free(void *)
+ .text 0x004015fc 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ 0x004015fc TBufBase8::TBufBase8(int)
+ .text 0x00401608 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ 0x00401608 TDesC8::AtC(int) const
+ .text 0x00401614 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ 0x00401614 TDesC16::AtC(int) const
+ .text 0x00401620 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ 0x00401620 RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .text 0x00401630 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ 0x00401630 RProcess::Resume(void)
+ .text 0x0040163c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ 0x0040163c RHandleBase::Close(void)
+ .text 0x00401648 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ 0x00401648 HAL::Get(HALData::TAttribute, int &)
+ .text 0x00401654 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ 0x00401654 HAL::Set(HALData::TAttribute, int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x00401660 ___CTOR_LIST__=.
+ 0x00401660 __CTOR_LIST__=.
+ 0x00401660 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x00401664 0x4 LONG 0x0
+ 0x00401668 ___DTOR_LIST__=.
+ 0x00401668 __DTOR_LIST__=.
+ 0x00401668 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x0040166c 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x00401670 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x00401670 0x8 ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ .rdata 0x00401678 0x108 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x00402000 0x0
+ 0x00402000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x00402000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x00402000 0x0
+ 0x00402000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x00402000 __bss_end__=.
+
+.edata
+ *(.edata)
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x00402000 0x400
+ SORT(*)(.idata$2)
+ .idata$2 0x00402000 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o)
+ 0x00402000 _head__________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB
+ .idata$2 0x00402014 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ 0x00402014 _head_______EPOC32_RELEASE_THUMB_UREL_EUSER_LIB
+ .idata$2 0x00402028 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o)
+ 0x00402028 _head_______EPOC32_RELEASE_THUMB_UREL_HAL_LIB
+ SORT(*)(.idata$3)
+ .idata$3 0x0040203c 0x20 ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ 0x0040205c 0x4 LONG 0x0
+ 0x00402060 0x4 LONG 0x0
+ 0x00402064 0x4 LONG 0x0
+ 0x00402068 0x4 LONG 0x0
+ 0x0040206c 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x00402070 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$4 0x00402074 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ .idata$4 0x00402078 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ .idata$4 0x0040207c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ .idata$4 0x00402080 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ .idata$4 0x00402084 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ .idata$4 0x00402088 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ .idata$4 0x0040208c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ .idata$4 0x00402090 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ .idata$4 0x00402094 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ .idata$4 0x00402098 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ .idata$4 0x0040209c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559t.o)
+ .idata$4 0x004020a0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ .idata$4 0x004020a4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ .idata$4 0x004020a8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ .idata$4 0x004020ac 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ .idata$4 0x004020b0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ .idata$4 0x004020b4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ .idata$4 0x004020b8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ .idata$4 0x004020bc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ .idata$4 0x004020c0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ .idata$4 0x004020c4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ .idata$4 0x004020c8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ .idata$4 0x004020cc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ .idata$4 0x004020d0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ .idata$4 0x004020d4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ .idata$4 0x004020d8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ .idata$4 0x004020dc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ .idata$4 0x004020e0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ .idata$4 0x004020e4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ .idata$4 0x004020e8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ .idata$4 0x004020ec 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ .idata$4 0x004020f0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ .idata$4 0x004020f4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ .idata$4 0x004020f8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o)
+ .idata$4 0x004020fc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ .idata$4 0x00402100 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ .idata$4 0x00402104 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x00402108 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$5 0x0040210c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ 0x0040210c _imp__Close__7RFsBase
+ 0x0040210c RFsBase::__imp_Close(void)
+ .idata$5 0x00402110 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ 0x00402110 _imp__Connect__3RFsi
+ 0x00402110 RFs::__imp_Connect(int)
+ .idata$5 0x00402114 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ 0x00402114 RFs::__imp_DriveList(TBuf8<26> &) const
+ 0x00402114 _imp__DriveList__C3RFsRt5TBuf81i26
+ .idata$5 0x00402118 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ 0x00402118 _imp__FindByDir__9TFindFileRC7TDesC16T1
+ 0x00402118 TFindFile::__imp_FindByDir(TDesC16 const &, TDesC16 const &)
+ .idata$5 0x0040211c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ 0x0040211c _imp__FullName__C10TParseBase
+ 0x0040211c TParseBase::__imp_FullName(void) const
+ .idata$5 0x00402120 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ 0x00402120 RFile::__imp_Open(RFs &, TDesC16 const &, unsigned int)
+ 0x00402120 _imp__Open__5RFileR3RFsRC7TDesC16Ui
+ .idata$5 0x00402124 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ 0x00402124 _imp__Read__C5RFileR5TDes8
+ 0x00402124 RFile::__imp_Read(TDes8 &) const
+ .idata$5 0x00402128 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ 0x00402128 _imp__Read__C5RFileR5TDes8i
+ 0x00402128 RFile::__imp_Read(TDes8 &, int) const
+ .idata$5 0x0040212c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ 0x0040212c RFile::__imp_Size(int &) const
+ 0x0040212c _imp__Size__C5RFileRi
+ .idata$5 0x00402130 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ 0x00402130 TFindFile::_imp__(RFs &)
+ 0x00402130 __imp___9TFindFileR3RFs
+ .idata$5 0x00402134 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559t.o)
+ .idata$5 0x00402138 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ .idata$5 0x0040213c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ 0x0040213c User::__imp_Alloc(int)
+ 0x0040213c _imp__Alloc__4Useri
+ .idata$5 0x00402140 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ 0x00402140 _imp__AppendNumFixedWidth__6TDes16Ui6TRadixi
+ 0x00402140 TDes16::__imp_AppendNumFixedWidth(unsigned int, TRadix, int)
+ .idata$5 0x00402144 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ 0x00402144 TDesC8::__imp_AtC(int) const
+ 0x00402144 _imp__AtC__C6TDesC8i
+ .idata$5 0x00402148 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ 0x00402148 _imp__AtC__C7TDesC16i
+ 0x00402148 TDesC16::__imp_AtC(int) const
+ .idata$5 0x0040214c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ 0x0040214c RHandleBase::__imp_Close(void)
+ 0x0040214c _imp__Close__11RHandleBase
+ .idata$5 0x00402150 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ 0x00402150 _imp__Copy__6TDes16RC7TDesC16
+ 0x00402150 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x00402154 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ 0x00402154 _imp__Create__8RProcessRC7TDesC16T110TOwnerType
+ 0x00402154 RProcess::__imp_Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .idata$5 0x00402158 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ 0x00402158 _imp__Free__4UserPv
+ 0x00402158 User::__imp_Free(void *)
+ .idata$5 0x0040215c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ 0x0040215c _imp__Panic__4UserRC7TDesC16i
+ 0x0040215c User::__imp_Panic(TDesC16 const &, int)
+ .idata$5 0x00402160 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ 0x00402160 _imp__Resume__8RProcess
+ 0x00402160 RProcess::__imp_Resume(void)
+ .idata$5 0x00402164 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ 0x00402164 _imp__SetCurrencySymbol__4UserRC7TDesC16
+ 0x00402164 User::__imp_SetCurrencySymbol(TDesC16 const &)
+ .idata$5 0x00402168 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ 0x00402168 _imp__SetXYInputCalibration__7UserHalRC21TDigitizerCalibration
+ 0x00402168 UserHal::__imp_SetXYInputCalibration(TDigitizerCalibration const &)
+ .idata$5 0x0040216c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ 0x0040216c _imp__Set__C7TLocale
+ 0x0040216c TLocale::__imp_Set(void) const
+ .idata$5 0x00402170 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ 0x00402170 TBufBase16::_imp__(TDesC16 const &, int)
+ 0x00402170 __imp___10TBufBase16RC7TDesC16i
+ .idata$5 0x00402174 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ 0x00402174 TBufBase16::_imp__(int)
+ 0x00402174 __imp___10TBufBase16i
+ .idata$5 0x00402178 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ 0x00402178 __imp___15TCurrencySymbol
+ 0x00402178 TCurrencySymbol::_imp__(void)
+ .idata$5 0x0040217c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ 0x0040217c TPtr8::_imp__(unsigned char *, int)
+ 0x0040217c __imp___5TPtr8PUci
+ .idata$5 0x00402180 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ 0x00402180 __imp___5TPtr8PUcii
+ 0x00402180 TPtr8::_imp__(unsigned char *, int, int)
+ .idata$5 0x00402184 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ 0x00402184 TLocale::_imp__(void)
+ 0x00402184 __imp___7TLocale
+ .idata$5 0x00402188 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ 0x00402188 __imp___9TBufBase8i
+ 0x00402188 TBufBase8::_imp__(int)
+ .idata$5 0x0040218c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ .idata$5 0x00402190 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o)
+ .idata$5 0x00402194 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ 0x00402194 HAL::__imp_Get(HALData::TAttribute, int &)
+ 0x00402194 _imp__Get__3HALQ27HALData10TAttributeRi
+ .idata$5 0x00402198 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ 0x00402198 _imp__Set__3HALQ27HALData10TAttributei
+ 0x00402198 HAL::__imp_Set(HALData::TAttribute, int)
+ .idata$5 0x0040219c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x004021a0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ .idata$7 0x004021a4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ .idata$7 0x004021a8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ .idata$7 0x004021ac 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ .idata$7 0x004021b0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ .idata$7 0x004021b4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ .idata$7 0x004021b8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ .idata$7 0x004021bc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ .idata$7 0x004021c0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ .idata$7 0x004021c4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ .idata$7 0x004021c8 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559t.o)
+ 0x004021c8 ___________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB_iname
+ .idata$7 0x004021dc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ .idata$7 0x004021e0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ .idata$7 0x004021e4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ .idata$7 0x004021e8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ .idata$7 0x004021ec 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ .idata$7 0x004021f0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ .idata$7 0x004021f4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ .idata$7 0x004021f8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ .idata$7 0x004021fc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ .idata$7 0x00402200 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ .idata$7 0x00402204 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ .idata$7 0x00402208 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ .idata$7 0x0040220c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ .idata$7 0x00402210 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ .idata$7 0x00402214 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ .idata$7 0x00402218 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ .idata$7 0x0040221c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ .idata$7 0x00402220 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ .idata$7 0x00402224 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ .idata$7 0x00402228 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ .idata$7 0x0040222c 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ 0x0040222c ________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname
+ .idata$7 0x00402240 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ .idata$7 0x00402244 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ .idata$7 0x00402248 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622t.o)
+ 0x00402248 ________EPOC32_RELEASE_THUMB_UREL_HAL_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x00403000 0x0
+ 0x00403000 end=.
+ 0x00403000 _end=.
+ 0x00403000 __end__=.
+
+.reloc 0x00403000 0x200
+ *(.reloc)
+ .reloc 0x00403000 0x78 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab 0x00404000 0x5400
+ *(.stab)
+ .stab 0x00404000 0xe34 ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ .stab 0x00404e34 0x369c ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o)
+ 0x36a8 (size before relaxing)
+ .stab 0x004084d0 0xd38 ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EPOC/EGCC/THUMB/UDEB/UP_GCC.o)
+ 0x18f0 (size before relaxing)
+
+.stabstr 0x0040a000 0x47e00
+ *(.stabstr)
+ .stabstr 0x0040a000 0x47c60 ..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ 0x0 (size before relaxing)
+OUTPUT(..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.EXE epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/thumb/urel/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/THUMB/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o) (_head_______EPOC32_RELEASE_THUMB_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o) (________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o) (_head__________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o) (___________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.exp
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EDLL.LIB
+LOAD ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EDLL.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EDLL/THUMB/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x1000100c 0x254 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o)
+ 0x1000104c TASShdAlarm::InternalizeL(RReadStream &)
+ 0x100011d8 TASShdAlarm::Reset(void)
+ 0x1000100c TASShdAlarm::TASShdAlarm(void)
+ 0x1000111c TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x10001260 0x4 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDDLL.o)
+ 0x10001260 E32Dll(TDllReason)
+ .text 0x10001264 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ 0x10001264 TBufBase16::TBufBase16(int)
+ .text 0x10001270 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ 0x10001270 Time::NullTTime(void)
+ .text 0x1000127c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ 0x1000127c TDes16::Copy(TDesC16 const &)
+ .text 0x10001288 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ 0x10001288 RReadStream::ReadUint16L(void)
+ .text 0x10001294 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ 0x10001294 RReadStream::ReadInt8L(void)
+ .text 0x100012a0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ 0x100012a0 RReadStream::ReadInt32L(void)
+ .text 0x100012ac 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ 0x100012ac InternalizeL(TInt64 &, RReadStream &)
+ .text 0x100012b8 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ 0x100012b8 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x100012c4 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ 0x100012c4 RReadStream::ReadInt16L(void)
+ .text 0x100012d0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ 0x100012d0 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x100012dc 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ 0x100012dc RWriteStream::WriteInt8L(int)
+ .text 0x100012e8 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ 0x100012e8 RWriteStream::WriteInt32L(long)
+ .text 0x100012f4 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ 0x100012f4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x10001304 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ 0x10001304 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x10001310 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ 0x10001310 RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x1000131c ___CTOR_LIST__=.
+ 0x1000131c __CTOR_LIST__=.
+ 0x1000131c 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x10001320 0x4 LONG 0x0
+ 0x10001324 ___DTOR_LIST__=.
+ 0x10001324 __DTOR_LIST__=.
+ 0x10001324 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x10001328 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x1000132c etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x1000132c 0xc ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../EPOC32/BUILD/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o)
+ 0x10003000 _head__________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ 0x10003014 _head_______EPOC32_RELEASE_THUMB_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1951t.o)
+ 0x10003104 ___________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ 0x10003124 ________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x2c ..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\EPOC32\BUILD\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/thumb/urel/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,471 @@
+Archive member included because of file (symbol)
+
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o)
+ (_E32Startup)
+..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o)
+ (--whole-archive)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EGCC.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EPOC/EGCC/THUMB/UREL/UP_GCC.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o) (_call_via_r0)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TFindFile::TFindFile(RFs &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TFindFile::FindByDir(TDesC16 const &, TDesC16 const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TParseBase::FullName(void) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFile::Open(RFs &, TDesC16 const &, unsigned int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFile::Read(TDes8 &, int) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFsBase::Close(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFs::Connect(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFile::Size(int &) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFile::Read(TDes8 &) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFs::DriveList(TBuf8<26> &) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o) (_head__________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o) (___________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB_iname)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TLocale::TLocale(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TBufBase16::TBufBase16(TDesC16 const &, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TDes16::AppendNumFixedWidth(unsigned int, TRadix, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TPtr8::TPtr8(unsigned char *, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TLocale::Set(void) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TCurrencySymbol::TCurrencySymbol(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (User::SetCurrencySymbol(TDesC16 const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TBufBase16::TBufBase16(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (UserHal::SetXYInputCalibration(TDigitizerCalibration const &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (User::Panic(TDesC16 const &, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (User::Alloc(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TPtr8::TPtr8(unsigned char *, int, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (User::Free(void *))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TBufBase8::TBufBase8(int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TDesC8::AtC(int) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TDesC16::AtC(int) const)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RProcess::Resume(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RHandleBase::Close(void))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o) (_head_______EPOC32_RELEASE_THUMB_UREL_EUSER_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o) (________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (HAL::Get(HALData::TAttribute, int &))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (HAL::Set(HALData::TAttribute, int))
+..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o) (_head_______EPOC32_RELEASE_THUMB_UREL_HAL_LIB)
+..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622t.o)
+ ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o) (________EPOC32_RELEASE_THUMB_UREL_HAL_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x00400000 __image_base__=0x400000
+ 0x00000000 __dll__=0x0
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.exp
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB
+LOAD ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EGCC.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB
+LOAD ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB
+
+.text 0x00401000 0x800
+ *(.init)
+ *(.text)
+ .text 0x00401000 0x60 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o)
+ 0x0040105c atexit
+ 0x00401000 _E32Startup
+ .text 0x00401060 0x438 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o)
+ 0x00401244 E32Main(void)
+ .text 0x00401498 0x38 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EGCC.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EPOC/EGCC/THUMB/UREL/UP_GCC.o)
+ 0x004014a0 _call_via_r2
+ 0x004014b0 _call_via_r6
+ 0x004014ac _call_via_r5
+ 0x004014a4 _call_via_r3
+ 0x004014c4 _call_via_fp
+ 0x004014b8 _call_via_r8
+ 0x004014b4 _call_via_r7
+ 0x00401498 _call_via_r0
+ 0x004014c0 _call_via_sl
+ 0x004014bc _call_via_r9
+ 0x004014a8 _call_via_r4
+ 0x0040149c _call_via_r1
+ 0x004014c8 _call_via_ip
+ 0x004014cc _call_via_lr
+ .text 0x004014d0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ 0x004014d0 TFindFile::TFindFile(RFs &)
+ .text 0x004014dc 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ 0x004014dc TFindFile::FindByDir(TDesC16 const &, TDesC16 const &)
+ .text 0x004014e8 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ 0x004014e8 TParseBase::FullName(void) const
+ .text 0x004014f4 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ 0x004014f4 RFile::Open(RFs &, TDesC16 const &, unsigned int)
+ .text 0x00401504 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ 0x00401504 RFile::Read(TDes8 &, int) const
+ .text 0x00401510 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ 0x00401510 RFsBase::Close(void)
+ .text 0x0040151c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ 0x0040151c RFs::Connect(int)
+ .text 0x00401528 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ 0x00401528 RFile::Size(int &) const
+ .text 0x00401534 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ 0x00401534 RFile::Read(TDes8 &) const
+ .text 0x00401540 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ 0x00401540 RFs::DriveList(TBuf8<26> &) const
+ .text 0x0040154c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ 0x0040154c TLocale::TLocale(void)
+ .text 0x00401558 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ 0x00401558 TBufBase16::TBufBase16(TDesC16 const &, int)
+ .text 0x00401564 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ 0x00401564 TDes16::AppendNumFixedWidth(unsigned int, TRadix, int)
+ .text 0x00401574 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ 0x00401574 TDes16::Copy(TDesC16 const &)
+ .text 0x00401580 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ 0x00401580 TPtr8::TPtr8(unsigned char *, int)
+ .text 0x0040158c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ 0x0040158c TLocale::Set(void) const
+ .text 0x00401598 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ 0x00401598 TCurrencySymbol::TCurrencySymbol(void)
+ .text 0x004015a4 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ 0x004015a4 User::SetCurrencySymbol(TDesC16 const &)
+ .text 0x004015b0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ 0x004015b0 TBufBase16::TBufBase16(int)
+ .text 0x004015bc 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ 0x004015bc UserHal::SetXYInputCalibration(TDigitizerCalibration const &)
+ .text 0x004015c8 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ 0x004015c8 User::Panic(TDesC16 const &, int)
+ .text 0x004015d4 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ 0x004015d4 User::Alloc(int)
+ .text 0x004015e0 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ 0x004015e0 TPtr8::TPtr8(unsigned char *, int, int)
+ .text 0x004015f0 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ 0x004015f0 User::Free(void *)
+ .text 0x004015fc 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ 0x004015fc TBufBase8::TBufBase8(int)
+ .text 0x00401608 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ 0x00401608 TDesC8::AtC(int) const
+ .text 0x00401614 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ 0x00401614 TDesC16::AtC(int) const
+ .text 0x00401620 0x10 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ 0x00401620 RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .text 0x00401630 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ 0x00401630 RProcess::Resume(void)
+ .text 0x0040163c 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ 0x0040163c RHandleBase::Close(void)
+ .text 0x00401648 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ 0x00401648 HAL::Get(HALData::TAttribute, int &)
+ .text 0x00401654 0xc ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ 0x00401654 HAL::Set(HALData::TAttribute, int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x00401660 ___CTOR_LIST__=.
+ 0x00401660 __CTOR_LIST__=.
+ 0x00401660 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x00401664 0x4 LONG 0x0
+ 0x00401668 ___DTOR_LIST__=.
+ 0x00401668 __DTOR_LIST__=.
+ 0x00401668 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x0040166c 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x00401670 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x00401670 0x8 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o)
+ .rdata 0x00401678 0x108 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../EPOC32/BUILD/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x00402000 0x0
+ 0x00402000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x00402000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x00402000 0x0
+ 0x00402000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x00402000 __bss_end__=.
+
+.edata
+ *(.edata)
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x00402000 0x400
+ SORT(*)(.idata$2)
+ .idata$2 0x00402000 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o)
+ 0x00402000 _head__________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB
+ .idata$2 0x00402014 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ 0x00402014 _head_______EPOC32_RELEASE_THUMB_UREL_EUSER_LIB
+ .idata$2 0x00402028 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o)
+ 0x00402028 _head_______EPOC32_RELEASE_THUMB_UREL_HAL_LIB
+ SORT(*)(.idata$3)
+ .idata$3 0x0040203c 0x20 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../EPOC32/BUILD/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o)
+ 0x0040205c 0x4 LONG 0x0
+ 0x00402060 0x4 LONG 0x0
+ 0x00402064 0x4 LONG 0x0
+ 0x00402068 0x4 LONG 0x0
+ 0x0040206c 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x00402070 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$4 0x00402074 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ .idata$4 0x00402078 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ .idata$4 0x0040207c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ .idata$4 0x00402080 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ .idata$4 0x00402084 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ .idata$4 0x00402088 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ .idata$4 0x0040208c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ .idata$4 0x00402090 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ .idata$4 0x00402094 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ .idata$4 0x00402098 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ .idata$4 0x0040209c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559t.o)
+ .idata$4 0x004020a0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ .idata$4 0x004020a4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ .idata$4 0x004020a8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ .idata$4 0x004020ac 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ .idata$4 0x004020b0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ .idata$4 0x004020b4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ .idata$4 0x004020b8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ .idata$4 0x004020bc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ .idata$4 0x004020c0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ .idata$4 0x004020c4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ .idata$4 0x004020c8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ .idata$4 0x004020cc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ .idata$4 0x004020d0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ .idata$4 0x004020d4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ .idata$4 0x004020d8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ .idata$4 0x004020dc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ .idata$4 0x004020e0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ .idata$4 0x004020e4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ .idata$4 0x004020e8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ .idata$4 0x004020ec 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ .idata$4 0x004020f0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ .idata$4 0x004020f4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ .idata$4 0x004020f8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o)
+ .idata$4 0x004020fc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ .idata$4 0x00402100 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ .idata$4 0x00402104 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x00402108 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$5 0x0040210c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ 0x0040210c _imp__Close__7RFsBase
+ 0x0040210c RFsBase::__imp_Close(void)
+ .idata$5 0x00402110 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ 0x00402110 _imp__Connect__3RFsi
+ 0x00402110 RFs::__imp_Connect(int)
+ .idata$5 0x00402114 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ 0x00402114 RFs::__imp_DriveList(TBuf8<26> &) const
+ 0x00402114 _imp__DriveList__C3RFsRt5TBuf81i26
+ .idata$5 0x00402118 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ 0x00402118 _imp__FindByDir__9TFindFileRC7TDesC16T1
+ 0x00402118 TFindFile::__imp_FindByDir(TDesC16 const &, TDesC16 const &)
+ .idata$5 0x0040211c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ 0x0040211c _imp__FullName__C10TParseBase
+ 0x0040211c TParseBase::__imp_FullName(void) const
+ .idata$5 0x00402120 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ 0x00402120 RFile::__imp_Open(RFs &, TDesC16 const &, unsigned int)
+ 0x00402120 _imp__Open__5RFileR3RFsRC7TDesC16Ui
+ .idata$5 0x00402124 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ 0x00402124 _imp__Read__C5RFileR5TDes8
+ 0x00402124 RFile::__imp_Read(TDes8 &) const
+ .idata$5 0x00402128 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ 0x00402128 _imp__Read__C5RFileR5TDes8i
+ 0x00402128 RFile::__imp_Read(TDes8 &, int) const
+ .idata$5 0x0040212c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ 0x0040212c RFile::__imp_Size(int &) const
+ 0x0040212c _imp__Size__C5RFileRi
+ .idata$5 0x00402130 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ 0x00402130 TFindFile::_imp__(RFs &)
+ 0x00402130 __imp___9TFindFileR3RFs
+ .idata$5 0x00402134 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559t.o)
+ .idata$5 0x00402138 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529h.o)
+ .idata$5 0x0040213c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ 0x0040213c User::__imp_Alloc(int)
+ 0x0040213c _imp__Alloc__4Useri
+ .idata$5 0x00402140 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ 0x00402140 _imp__AppendNumFixedWidth__6TDes16Ui6TRadixi
+ 0x00402140 TDes16::__imp_AppendNumFixedWidth(unsigned int, TRadix, int)
+ .idata$5 0x00402144 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ 0x00402144 TDesC8::__imp_AtC(int) const
+ 0x00402144 _imp__AtC__C6TDesC8i
+ .idata$5 0x00402148 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ 0x00402148 _imp__AtC__C7TDesC16i
+ 0x00402148 TDesC16::__imp_AtC(int) const
+ .idata$5 0x0040214c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ 0x0040214c RHandleBase::__imp_Close(void)
+ 0x0040214c _imp__Close__11RHandleBase
+ .idata$5 0x00402150 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ 0x00402150 _imp__Copy__6TDes16RC7TDesC16
+ 0x00402150 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x00402154 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ 0x00402154 _imp__Create__8RProcessRC7TDesC16T110TOwnerType
+ 0x00402154 RProcess::__imp_Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .idata$5 0x00402158 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ 0x00402158 _imp__Free__4UserPv
+ 0x00402158 User::__imp_Free(void *)
+ .idata$5 0x0040215c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ 0x0040215c _imp__Panic__4UserRC7TDesC16i
+ 0x0040215c User::__imp_Panic(TDesC16 const &, int)
+ .idata$5 0x00402160 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ 0x00402160 _imp__Resume__8RProcess
+ 0x00402160 RProcess::__imp_Resume(void)
+ .idata$5 0x00402164 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ 0x00402164 _imp__SetCurrencySymbol__4UserRC7TDesC16
+ 0x00402164 User::__imp_SetCurrencySymbol(TDesC16 const &)
+ .idata$5 0x00402168 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ 0x00402168 _imp__SetXYInputCalibration__7UserHalRC21TDigitizerCalibration
+ 0x00402168 UserHal::__imp_SetXYInputCalibration(TDigitizerCalibration const &)
+ .idata$5 0x0040216c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ 0x0040216c _imp__Set__C7TLocale
+ 0x0040216c TLocale::__imp_Set(void) const
+ .idata$5 0x00402170 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ 0x00402170 TBufBase16::_imp__(TDesC16 const &, int)
+ 0x00402170 __imp___10TBufBase16RC7TDesC16i
+ .idata$5 0x00402174 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ 0x00402174 TBufBase16::_imp__(int)
+ 0x00402174 __imp___10TBufBase16i
+ .idata$5 0x00402178 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ 0x00402178 __imp___15TCurrencySymbol
+ 0x00402178 TCurrencySymbol::_imp__(void)
+ .idata$5 0x0040217c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ 0x0040217c TPtr8::_imp__(unsigned char *, int)
+ 0x0040217c __imp___5TPtr8PUci
+ .idata$5 0x00402180 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ 0x00402180 __imp___5TPtr8PUcii
+ 0x00402180 TPtr8::_imp__(unsigned char *, int, int)
+ .idata$5 0x00402184 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ 0x00402184 TLocale::_imp__(void)
+ 0x00402184 __imp___7TLocale
+ .idata$5 0x00402188 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ 0x00402188 __imp___9TBufBase8i
+ 0x00402188 TBufBase8::_imp__(int)
+ .idata$5 0x0040218c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ .idata$5 0x00402190 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622h.o)
+ .idata$5 0x00402194 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ 0x00402194 HAL::__imp_Get(HALData::TAttribute, int &)
+ 0x00402194 _imp__Get__3HALQ27HALData10TAttributeRi
+ .idata$5 0x00402198 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ 0x00402198 _imp__Set__3HALQ27HALData10TAttributei
+ 0x00402198 HAL::__imp_Set(HALData::TAttribute, int)
+ .idata$5 0x0040219c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x004021a0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00015.o)
+ .idata$7 0x004021a4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00018.o)
+ .idata$7 0x004021a8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00034.o)
+ .idata$7 0x004021ac 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00044.o)
+ .idata$7 0x004021b0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00051.o)
+ .idata$7 0x004021b4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00121.o)
+ .idata$7 0x004021b8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00136.o)
+ .idata$7 0x004021bc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00138.o)
+ .idata$7 0x004021c0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00185.o)
+ .idata$7 0x004021c4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559s_00217.o)
+ .idata$7 0x004021c8 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1559t.o)
+ 0x004021c8 ___________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB_iname
+ .idata$7 0x004021dc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00045.o)
+ .idata$7 0x004021e0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00068.o)
+ .idata$7 0x004021e4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00098.o)
+ .idata$7 0x004021e8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00099.o)
+ .idata$7 0x004021ec 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00172.o)
+ .idata$7 0x004021f0 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00251.o)
+ .idata$7 0x004021f4 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00292.o)
+ .idata$7 0x004021f8 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00476.o)
+ .idata$7 0x004021fc 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00809.o)
+ .idata$7 0x00402200 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00953.o)
+ .idata$7 0x00402204 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_00981.o)
+ .idata$7 0x00402208 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01039.o)
+ .idata$7 0x0040220c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01074.o)
+ .idata$7 0x00402210 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01282.o)
+ .idata$7 0x00402214 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01283.o)
+ .idata$7 0x00402218 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01336.o)
+ .idata$7 0x0040221c 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01366.o)
+ .idata$7 0x00402220 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01367.o)
+ .idata$7 0x00402224 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01405.o)
+ .idata$7 0x00402228 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529s_01431.o)
+ .idata$7 0x0040222c 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1529t.o)
+ 0x0040222c ________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname
+ .idata$7 0x00402240 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00001.o)
+ .idata$7 0x00402244 0x4 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622s_00002.o)
+ .idata$7 0x00402248 0x14 ..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/WINNT/Profiles/RMBUIL~1/LOCALS~1/Temp/d1622t.o)
+ 0x00402248 ________EPOC32_RELEASE_THUMB_UREL_HAL_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x00403000 0x0
+ 0x00403000 end=.
+ 0x00403000 _end=.
+ 0x00403000 __end__=.
+
+.reloc 0x00403000 0x200
+ *(.reloc)
+ .reloc 0x00403000 0x78 ..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\EPOC32\BUILD\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.EXE epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/winscw/urel/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,145 @@
+Address Size Name Subname Module
+
+40701000 0000003d .text ASSHDALARM.o(??0TASShdAlarm@@QAE@XZ)
+4070103d 00000107 .text ASSHDALARM.o(?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z)
+40701144 000000dc .text ASSHDALARM.o(?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z)
+40701220 000000a2 .text ASSHDALARM.o(?Reset@TASShdAlarm@@QAEXXZ)
+407012c2 00000003 .text ASSHDDLL.o(?E32Dll@@YAHW4TDllReason@@@Z)
+407012c6 00000006 .text EUSER.dll(??0TBufBase16@@IAE@H@Z)
+407012cc 00000006 .text ESTOR.dll(?ReadUint16L@RReadStream@@QAEGXZ)
+407012d2 00000006 .text ESTOR.dll(?ReadInt8L@RReadStream@@QAECXZ)
+407012d8 00000006 .text ESTOR.dll(?ReadInt32L@RReadStream@@QAEJXZ)
+407012de 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+407012e4 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+407012ea 00000006 .text ESTOR.dll(?ReadInt16L@RReadStream@@QAEFXZ)
+407012f0 00000006 .text ESTOR.dll(?WriteUint16L@RWriteStream@@QAEXI@Z)
+407012f6 00000006 .text ESTOR.dll(?WriteInt8L@RWriteStream@@QAEXH@Z)
+407012fc 00000006 .text ESTOR.dll(?WriteInt32L@RWriteStream@@QAEXJ@Z)
+40701302 00000006 .text ESTOR.dll(?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+40701308 00000006 .text ESTOR.dll(?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+4070130e 00000006 .text ESTOR.dll(?WriteInt16L@RWriteStream@@QAEXH@Z)
+40701314 00000006 .text EUSER.dll(?NullTTime@Time@@SA?AVTTime@@XZ)
+4070131a 00000006 .text EUSER.dll(?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+40701320 00000020 .text UP_DLL.obj(?initTable@@YAXPAP6AXXZ0@Z)
+40701340 000000a7 .text UP_DLL.obj(?_E32Dll@@YGHPAXI0@Z)
+407013e8 00000006 .text EUSER.dll(?__WireKernel@UpWins@@SAXXZ)
+40702000 0000001c .data ASSHDALARM.o
+40702020 00000018 .data ASSHDDLL.o
+40702038 00000018 .data uid.o
+40702050 00000018 .data UP_DLL.obj
+40702068 00000010 .data UP_DLL.obj
+40703000 0000000c .E32_UID uid.o
+40704000 00000014 .idata $2 ESTOR.dll
+40704014 00000014 .idata $2 EUSER.dll
+40704028 00000014 .idata $3 EUSER.dll
+4070403c 00000004 .idata $4 ESTOR.dll
+40704040 00000004 .idata $4 ESTOR.dll
+40704044 00000004 .idata $4 ESTOR.dll
+40704048 00000004 .idata $4 ESTOR.dll
+4070404c 00000004 .idata $4 ESTOR.dll
+40704050 00000004 .idata $4 ESTOR.dll
+40704054 00000004 .idata $4 ESTOR.dll
+40704058 00000004 .idata $4 ESTOR.dll
+4070405c 00000004 .idata $4 ESTOR.dll
+40704060 00000004 .idata $4 ESTOR.dll
+40704064 00000004 .idata $4 ESTOR.dll
+40704068 00000004 .idata $4 ESTOR.dll
+4070406c 00000004 .idata $4 ESTOR.dll
+40704070 00000004 .idata $4 EUSER.dll
+40704074 00000004 .idata $4 EUSER.dll
+40704078 00000004 .idata $4 EUSER.dll
+4070407c 00000004 .idata $4 EUSER.dll
+40704080 00000004 .idata $4 EUSER.dll
+40704084 00000004 .idata $5 ESTOR.dll(__imp_?ReadUint16L@RReadStream@@QAEGXZ)
+40704088 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt8L@RReadStream@@QAECXZ)
+4070408c 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt32L@RReadStream@@QAEJXZ)
+40704090 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+40704094 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+40704098 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt16L@RReadStream@@QAEFXZ)
+4070409c 00000004 .idata $5 ESTOR.dll(__imp_?WriteUint16L@RWriteStream@@QAEXI@Z)
+407040a0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt8L@RWriteStream@@QAEXH@Z)
+407040a4 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt32L@RWriteStream@@QAEXJ@Z)
+407040a8 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+407040ac 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+407040b0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt16L@RWriteStream@@QAEXH@Z)
+407040b4 00000004 .idata $5 ESTOR.dll
+407040b8 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@H@Z)
+407040bc 00000004 .idata $5 EUSER.dll(__imp_?NullTTime@Time@@SA?AVTTime@@XZ)
+407040c0 00000004 .idata $5 EUSER.dll(__imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+407040c4 00000004 .idata $5 EUSER.dll(__imp_?__WireKernel@UpWins@@SAXXZ)
+407040c8 00000004 .idata $5 EUSER.dll
+407040cc 0000000a .idata $6 ESTOR.dll
+407040d6 0000000a .idata $6 EUSER.dll
+40705000 00000004 .CRT $XCA UP_DLL.obj
+40705008 00000004 .CRT $XCZ UP_DLL.obj
+40705010 00000004 .CRT $XIA UP_DLL.obj
+40705018 00000004 .CRT $XIZ UP_DLL.obj
+40705020 00000004 .CRT $XPA UP_DLL.obj
+40705028 00000004 .CRT $XPZ UP_DLL.obj
+40705030 00000004 .CRT $XTA UP_DLL.obj
+40705038 00000004 .CRT $XTZ UP_DLL.obj
+40706000 00000012 .bss ASSHDALARM.o
+40706018 00000008 .bss ASSHDDLL.o
+40706020 00000008 .bss uid.o
+40706028 00000008 .bss UP_DLL.obj
+40706030 00000004 .bss
+
+--------------
+Public Symbols
+--------------
+
+Address Module Name
+-------- -------------------- ----
+40701000 ASSHDALARM.o ??0TASShdAlarm@@QAE@XZ
+4070103d ASSHDALARM.o ?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z
+40701144 ASSHDALARM.o ?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z
+40701220 ASSHDALARM.o ?Reset@TASShdAlarm@@QAEXXZ
+407012c2 ASSHDDLL.o ?E32Dll@@YAHW4TDllReason@@@Z
+407012c6 EUSER.dll ??0TBufBase16@@IAE@H@Z
+407012cc ESTOR.dll ?ReadUint16L@RReadStream@@QAEGXZ
+407012d2 ESTOR.dll ?ReadInt8L@RReadStream@@QAECXZ
+407012d8 ESTOR.dll ?ReadInt32L@RReadStream@@QAEJXZ
+407012de ESTOR.dll ?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+407012e4 ESTOR.dll ?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+407012ea ESTOR.dll ?ReadInt16L@RReadStream@@QAEFXZ
+407012f0 ESTOR.dll ?WriteUint16L@RWriteStream@@QAEXI@Z
+407012f6 ESTOR.dll ?WriteInt8L@RWriteStream@@QAEXH@Z
+407012fc ESTOR.dll ?WriteInt32L@RWriteStream@@QAEXJ@Z
+40701302 ESTOR.dll ?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+40701308 ESTOR.dll ?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+4070130e ESTOR.dll ?WriteInt16L@RWriteStream@@QAEXH@Z
+40701314 EUSER.dll ?NullTTime@Time@@SA?AVTTime@@XZ
+4070131a EUSER.dll ?Copy@TDes16@@QAEXABVTDesC16@@@Z
+40701340 UP_DLL.obj ?_E32Dll@@YGHPAXI0@Z
+407013e8 EUSER.dll ?__WireKernel@UpWins@@SAXXZ
+40703000 uid.o ?uid@@3PAVTUid@@A
+40704000 ESTOR.dll __IMPORT_DESCRIPTOR_ESTOR
+40704014 EUSER.dll __IMPORT_DESCRIPTOR_EUSER
+40704028 EUSER.dll __NULL_IMPORT_DESCRIPTOR
+40704084 ESTOR.dll __imp_?ReadUint16L@RReadStream@@QAEGXZ
+40704088 ESTOR.dll __imp_?ReadInt8L@RReadStream@@QAECXZ
+4070408c ESTOR.dll __imp_?ReadInt32L@RReadStream@@QAEJXZ
+40704090 ESTOR.dll __imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+40704094 ESTOR.dll __imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+40704098 ESTOR.dll __imp_?ReadInt16L@RReadStream@@QAEFXZ
+4070409c ESTOR.dll __imp_?WriteUint16L@RWriteStream@@QAEXI@Z
+407040a0 ESTOR.dll __imp_?WriteInt8L@RWriteStream@@QAEXH@Z
+407040a4 ESTOR.dll __imp_?WriteInt32L@RWriteStream@@QAEXJ@Z
+407040a8 ESTOR.dll __imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+407040ac ESTOR.dll __imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+407040b0 ESTOR.dll __imp_?WriteInt16L@RWriteStream@@QAEXH@Z
+407040b4 ESTOR.dll ESTOR_NULL_THUNK_DATA
+407040b8 EUSER.dll __imp_??0TBufBase16@@IAE@H@Z
+407040bc EUSER.dll __imp_?NullTTime@Time@@SA?AVTTime@@XZ
+407040c0 EUSER.dll __imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z
+407040c4 EUSER.dll __imp_?__WireKernel@UpWins@@SAXXZ
+407040c8 EUSER.dll EUSER_NULL_THUNK_DATA
+40705000 UP_DLL.obj ?__xc_a@@3PAP6AXXZA
+40705008 UP_DLL.obj ?__xc_z@@3PAP6AXXZA
+40705010 UP_DLL.obj ?__xi_a@@3PAP6AXXZA
+40705018 UP_DLL.obj ?__xi_z@@3PAP6AXXZA
+40705020 UP_DLL.obj ?__xp_a@@3PAP6AXXZA
+40705028 UP_DLL.obj ?__xp_z@@3PAP6AXXZA
+40705030 UP_DLL.obj ?__xt_a@@3PAP6AXXZA
+40705038 UP_DLL.obj ?__xt_z@@3PAP6AXXZA
+40706030 common ?_initialised@@3HA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/MAP_file/winscw/urel/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,311 @@
+Address Size Name Subname Module
+
+00401000 00000179 .text ESTART.o(?LoadLocale@@YAXAAVRFs@@@Z)
+00401179 0000011b .text ESTART.o(?InitialiseScreenCalibration@@YAXAAVRFs@@@Z)
+00401294 0000008a .text ESTART.o(?LocalFSInitialisation@@YAXAAVRFs@@@Z)
+0040131e 000002d7 .text ESTART.o(?E32Main@@YAHXZ)
+004015f6 00000006 .text EUSER.dll(??0TLocale@@QAE@XZ)
+004015fc 00000006 .text EFSRV.dll(??0TFindFile@@QAE@AAVRFs@@@Z)
+00401602 00000006 .text EUSER.dll(??0TBufBase16@@IAE@ABVTDesC16@@H@Z)
+00401608 00000006 .text HAL.dll(?Get@HAL@@SAHW4TAttribute@HALData@@AAH@Z)
+0040160e 00000006 .text EUSER.dll(?AppendNumFixedWidth@TDes16@@QAEXIW4TRadix@@H@Z)
+00401614 00000006 .text HAL.dll(?Set@HAL@@SAHW4TAttribute@HALData@@H@Z)
+0040161a 00000006 .text EFSRV.dll(?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z)
+00401620 00000006 .text EFSRV.dll(?FullName@TParseBase@@QBEABVTDesC16@@XZ)
+00401626 00000006 .text EUSER.dll(?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+0040162c 00000006 .text EFSRV.dll(?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z)
+00401632 00000006 .text EUSER.dll(??0TPtr8@@QAE@PAEH@Z)
+00401638 00000006 .text EFSRV.dll(?Read@RFile@@QBEHAAVTDes8@@H@Z)
+0040163e 00000006 .text EUSER.dll(?Set@TLocale@@QBEXXZ)
+00401644 00000006 .text EUSER.dll(??0TCurrencySymbol@@QAE@XZ)
+0040164a 00000006 .text EUSER.dll(?SetCurrencySymbol@User@@SAXABVTDesC16@@@Z)
+00401650 00000006 .text EFSRV.dll(?Close@RFsBase@@QAEXXZ)
+00401656 00000006 .text EUSER.dll(??0TBufBase16@@IAE@H@Z)
+0040165c 00000006 .text EUSER.dll(?SetXYInputCalibration@UserHal@@SAHABVTDigitizerCalibration@@@Z)
+00401662 00000006 .text EUSER.dll(??0TBufBase8@@IAE@H@Z)
+00401668 00000006 .text EFSRV.dll(?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z)
+0040166e 00000006 .text EUSER.dll(?Panic@User@@SAXABVTDesC16@@H@Z)
+00401674 00000006 .text EUSER.dll(?AtC@TDesC8@@IBEABEH@Z)
+0040167a 00000006 .text EFSRV.dll(?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z)
+00401680 00000006 .text EFSRV.dll(?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z)
+00401686 00000006 .text EUSER.dll(?WaitForRequest@User@@SAXAAVTRequestStatus@@@Z)
+0040168c 00000006 .text EFSRV.dll(?Connect@RFs@@QAEHH@Z)
+00401692 00000006 .text EFSRV.dll(?Size@RFile@@QBEHAAH@Z)
+00401698 00000006 .text EFSRV.dll(?Read@RFile@@QBEHAAVTDes8@@@Z)
+0040169e 00000006 .text EUSER.dll(?Alloc@User@@SAPAXH@Z)
+004016a4 00000006 .text EUSER.dll(??0TPtr8@@QAE@PAEHH@Z)
+004016aa 00000006 .text EUSER.dll(?Free@User@@SAXPAX@Z)
+004016b0 00000006 .text EUSER.dll(?AtC@TDesC16@@IBEABGH@Z)
+004016b6 00000006 .text EUSER.dll(?Create@RProcess@@QAEHABVTDesC16@@0W4TOwnerType@@@Z)
+004016bc 00000006 .text EUSER.dll(?Resume@RProcess@@QAEXXZ)
+004016c2 00000006 .text EUSER.dll(?Close@RHandleBase@@QAEXXZ)
+004016c8 00000020 .text UP_EXE.obj(?initTable@@YAXPAP6AXXZ0@Z)
+004016e8 00000021 .text UP_EXE.obj(?Panic@@YAXW4TStatPanic@@@Z)
+00401709 00000177 .text UP_EXE.obj(?startupThread@@YAHXZ)
+00401880 00000011 .text UP_EXE.obj(?_E32Startup@@YGXXZ)
+00401892 00000006 .text EUSER.dll(??0TPtrC16@@QAE@PBG@Z)
+00401898 00000006 .text EUSER.dll(?BlockThreads@UserSvr@@SAXW4TBlockType@@@Z)
+0040189e 00000006 .text EUSER.dll(?__DllAttachProcess@UpWins@@SAXXZ)
+004018a4 00000006 .text EUSER.dll(?__FileServer@UpWins@@SAP6AHPAX@ZXZ)
+004018aa 00000006 .text EUSER.dll(?Create@RThread@@QAEHABVTDesC16@@P6AHPAX@ZHHH1W4TOwnerType@@@Z)
+004018b0 00000006 .text EUSER.dll(?SetPriority@RThread@@QBEXW4TThreadPriority@@@Z)
+004018b6 00000006 .text EUSER.dll(?SetSystem@RThread@@QBEXH@Z)
+004018bc 00000006 .text EUSER.dll(?SetProtected@RThread@@QBEXH@Z)
+004018c2 00000006 .text EUSER.dll(?Resume@RThread@@QBEXXZ)
+004018c8 00000006 .text EUSER.dll(?__Synchronize@UpWins@@SAXXZ)
+004018ce 00000006 .text EUSER.dll(?__ReleaseInitThreads@UpWins@@SAXXZ)
+004018d4 00000006 .text EUSER.dll(?__WindowServer@UpWins@@SAP6AHPAX@ZXZ)
+004018da 00000006 .text EUSER.dll(?__WireKernel@UpWins@@SAXXZ)
+004018e0 00000006 .text EUSER.dll(?KernelStartup@UserSvr@@SAXP6AHPAX@Z@Z)
+00402000 0000019c .data ESTART.o
+004021a0 00000018 .data uid.o
+004021b8 00000018 .data UP_EXE.obj
+004021d0 00000040 .data UP_EXE.obj
+00403000 0000000c .E32_UID uid.o
+00404000 00000014 .idata $2 EFSRV.dll
+00404014 00000014 .idata $2 EUSER.dll
+00404028 00000014 .idata $2 HAL.dll
+0040403c 00000014 .idata $3 EFSRV.dll
+00404050 00000004 .idata $4 EFSRV.dll
+00404054 00000004 .idata $4 EFSRV.dll
+00404058 00000004 .idata $4 EFSRV.dll
+0040405c 00000004 .idata $4 EFSRV.dll
+00404060 00000004 .idata $4 EFSRV.dll
+00404064 00000004 .idata $4 EFSRV.dll
+00404068 00000004 .idata $4 EFSRV.dll
+0040406c 00000004 .idata $4 EFSRV.dll
+00404070 00000004 .idata $4 EFSRV.dll
+00404074 00000004 .idata $4 EFSRV.dll
+00404078 00000004 .idata $4 EFSRV.dll
+0040407c 00000004 .idata $4 EFSRV.dll
+00404080 00000004 .idata $4 EFSRV.dll
+00404084 00000004 .idata $4 EUSER.dll
+00404088 00000004 .idata $4 EUSER.dll
+0040408c 00000004 .idata $4 EUSER.dll
+00404090 00000004 .idata $4 EUSER.dll
+00404094 00000004 .idata $4 EUSER.dll
+00404098 00000004 .idata $4 EUSER.dll
+0040409c 00000004 .idata $4 EUSER.dll
+004040a0 00000004 .idata $4 EUSER.dll
+004040a4 00000004 .idata $4 EUSER.dll
+004040a8 00000004 .idata $4 EUSER.dll
+004040ac 00000004 .idata $4 EUSER.dll
+004040b0 00000004 .idata $4 EUSER.dll
+004040b4 00000004 .idata $4 EUSER.dll
+004040b8 00000004 .idata $4 EUSER.dll
+004040bc 00000004 .idata $4 EUSER.dll
+004040c0 00000004 .idata $4 EUSER.dll
+004040c4 00000004 .idata $4 EUSER.dll
+004040c8 00000004 .idata $4 EUSER.dll
+004040cc 00000004 .idata $4 EUSER.dll
+004040d0 00000004 .idata $4 EUSER.dll
+004040d4 00000004 .idata $4 EUSER.dll
+004040d8 00000004 .idata $4 EUSER.dll
+004040dc 00000004 .idata $4 EUSER.dll
+004040e0 00000004 .idata $4 EUSER.dll
+004040e4 00000004 .idata $4 EUSER.dll
+004040e8 00000004 .idata $4 EUSER.dll
+004040ec 00000004 .idata $4 EUSER.dll
+004040f0 00000004 .idata $4 EUSER.dll
+004040f4 00000004 .idata $4 EUSER.dll
+004040f8 00000004 .idata $4 EUSER.dll
+004040fc 00000004 .idata $4 EUSER.dll
+00404100 00000004 .idata $4 EUSER.dll
+00404104 00000004 .idata $4 EUSER.dll
+00404108 00000004 .idata $4 EUSER.dll
+0040410c 00000004 .idata $4 EUSER.dll
+00404110 00000004 .idata $4 EUSER.dll
+00404114 00000004 .idata $4 HAL.dll
+00404118 00000004 .idata $4 HAL.dll
+0040411c 00000004 .idata $4 HAL.dll
+00404120 00000004 .idata $5 EFSRV.dll(__imp_??0TFindFile@@QAE@AAVRFs@@@Z)
+00404124 00000004 .idata $5 EFSRV.dll(__imp_?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z)
+00404128 00000004 .idata $5 EFSRV.dll(__imp_?FullName@TParseBase@@QBEABVTDesC16@@XZ)
+0040412c 00000004 .idata $5 EFSRV.dll(__imp_?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z)
+00404130 00000004 .idata $5 EFSRV.dll(__imp_?Read@RFile@@QBEHAAVTDes8@@H@Z)
+00404134 00000004 .idata $5 EFSRV.dll(__imp_?Close@RFsBase@@QAEXXZ)
+00404138 00000004 .idata $5 EFSRV.dll(__imp_?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z)
+0040413c 00000004 .idata $5 EFSRV.dll(__imp_?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z)
+00404140 00000004 .idata $5 EFSRV.dll(__imp_?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z)
+00404144 00000004 .idata $5 EFSRV.dll(__imp_?Connect@RFs@@QAEHH@Z)
+00404148 00000004 .idata $5 EFSRV.dll(__imp_?Size@RFile@@QBEHAAH@Z)
+0040414c 00000004 .idata $5 EFSRV.dll(__imp_?Read@RFile@@QBEHAAVTDes8@@@Z)
+00404150 00000004 .idata $5 EFSRV.dll
+00404154 00000004 .idata $5 EUSER.dll(__imp_??0TLocale@@QAE@XZ)
+00404158 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@ABVTDesC16@@H@Z)
+0040415c 00000004 .idata $5 EUSER.dll(__imp_?AppendNumFixedWidth@TDes16@@QAEXIW4TRadix@@H@Z)
+00404160 00000004 .idata $5 EUSER.dll(__imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+00404164 00000004 .idata $5 EUSER.dll(__imp_??0TPtr8@@QAE@PAEH@Z)
+00404168 00000004 .idata $5 EUSER.dll(__imp_?Set@TLocale@@QBEXXZ)
+0040416c 00000004 .idata $5 EUSER.dll(__imp_??0TCurrencySymbol@@QAE@XZ)
+00404170 00000004 .idata $5 EUSER.dll(__imp_?SetCurrencySymbol@User@@SAXABVTDesC16@@@Z)
+00404174 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@H@Z)
+00404178 00000004 .idata $5 EUSER.dll(__imp_?SetXYInputCalibration@UserHal@@SAHABVTDigitizerCalibration@@@Z)
+0040417c 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase8@@IAE@H@Z)
+00404180 00000004 .idata $5 EUSER.dll(__imp_?Panic@User@@SAXABVTDesC16@@H@Z)
+00404184 00000004 .idata $5 EUSER.dll(__imp_?AtC@TDesC8@@IBEABEH@Z)
+00404188 00000004 .idata $5 EUSER.dll(__imp_?WaitForRequest@User@@SAXAAVTRequestStatus@@@Z)
+0040418c 00000004 .idata $5 EUSER.dll(__imp_?Alloc@User@@SAPAXH@Z)
+00404190 00000004 .idata $5 EUSER.dll(__imp_??0TPtr8@@QAE@PAEHH@Z)
+00404194 00000004 .idata $5 EUSER.dll(__imp_?Free@User@@SAXPAX@Z)
+00404198 00000004 .idata $5 EUSER.dll(__imp_?AtC@TDesC16@@IBEABGH@Z)
+0040419c 00000004 .idata $5 EUSER.dll(__imp_?Create@RProcess@@QAEHABVTDesC16@@0W4TOwnerType@@@Z)
+004041a0 00000004 .idata $5 EUSER.dll(__imp_?Resume@RProcess@@QAEXXZ)
+004041a4 00000004 .idata $5 EUSER.dll(__imp_?Close@RHandleBase@@QAEXXZ)
+004041a8 00000004 .idata $5 EUSER.dll(__imp_??0TPtrC16@@QAE@PBG@Z)
+004041ac 00000004 .idata $5 EUSER.dll(__imp_?BlockThreads@UserSvr@@SAXW4TBlockType@@@Z)
+004041b0 00000004 .idata $5 EUSER.dll(__imp_?__DllAttachProcess@UpWins@@SAXXZ)
+004041b4 00000004 .idata $5 EUSER.dll(__imp_?__FileServer@UpWins@@SAP6AHPAX@ZXZ)
+004041b8 00000004 .idata $5 EUSER.dll(__imp_?Create@RThread@@QAEHABVTDesC16@@P6AHPAX@ZHHH1W4TOwnerType@@@Z)
+004041bc 00000004 .idata $5 EUSER.dll(__imp_?SetPriority@RThread@@QBEXW4TThreadPriority@@@Z)
+004041c0 00000004 .idata $5 EUSER.dll(__imp_?SetSystem@RThread@@QBEXH@Z)
+004041c4 00000004 .idata $5 EUSER.dll(__imp_?SetProtected@RThread@@QBEXH@Z)
+004041c8 00000004 .idata $5 EUSER.dll(__imp_?Resume@RThread@@QBEXXZ)
+004041cc 00000004 .idata $5 EUSER.dll(__imp_?__Synchronize@UpWins@@SAXXZ)
+004041d0 00000004 .idata $5 EUSER.dll(__imp_?__ReleaseInitThreads@UpWins@@SAXXZ)
+004041d4 00000004 .idata $5 EUSER.dll(__imp_?__WindowServer@UpWins@@SAP6AHPAX@ZXZ)
+004041d8 00000004 .idata $5 EUSER.dll(__imp_?__WireKernel@UpWins@@SAXXZ)
+004041dc 00000004 .idata $5 EUSER.dll(__imp_?KernelStartup@UserSvr@@SAXP6AHPAX@Z@Z)
+004041e0 00000004 .idata $5 EUSER.dll
+004041e4 00000004 .idata $5 HAL.dll(__imp_?Get@HAL@@SAHW4TAttribute@HALData@@AAH@Z)
+004041e8 00000004 .idata $5 HAL.dll(__imp_?Set@HAL@@SAHW4TAttribute@HALData@@H@Z)
+004041ec 00000004 .idata $5 HAL.dll
+004041f0 0000000a .idata $6 EFSRV.dll
+004041fa 0000000a .idata $6 EUSER.dll
+00404204 00000008 .idata $6 HAL.dll
+00405000 00000004 .CRT $XCA UP_EXE.obj
+00405008 00000004 .CRT $XCZ UP_EXE.obj
+00405010 00000004 .CRT $XIA UP_EXE.obj
+00405018 00000004 .CRT $XIZ UP_EXE.obj
+00405020 00000004 .CRT $XPA UP_EXE.obj
+00405028 00000004 .CRT $XPZ UP_EXE.obj
+00405030 00000004 .CRT $XTA UP_EXE.obj
+00405038 00000004 .CRT $XTZ UP_EXE.obj
+00406000 00000008 .bss ESTART.o
+00406008 00000008 .bss uid.o
+00406010 00000008 .bss UP_EXE.obj
+00406018 00000000 .bss
+
+--------------
+Public Symbols
+--------------
+
+Address Module Name
+-------- -------------------- ----
+0040131e ESTART.o ?E32Main@@YAHXZ
+004015f6 EUSER.dll ??0TLocale@@QAE@XZ
+004015fc EFSRV.dll ??0TFindFile@@QAE@AAVRFs@@@Z
+00401602 EUSER.dll ??0TBufBase16@@IAE@ABVTDesC16@@H@Z
+00401608 HAL.dll ?Get@HAL@@SAHW4TAttribute@HALData@@AAH@Z
+0040160e EUSER.dll ?AppendNumFixedWidth@TDes16@@QAEXIW4TRadix@@H@Z
+00401614 HAL.dll ?Set@HAL@@SAHW4TAttribute@HALData@@H@Z
+0040161a EFSRV.dll ?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z
+00401620 EFSRV.dll ?FullName@TParseBase@@QBEABVTDesC16@@XZ
+00401626 EUSER.dll ?Copy@TDes16@@QAEXABVTDesC16@@@Z
+0040162c EFSRV.dll ?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z
+00401632 EUSER.dll ??0TPtr8@@QAE@PAEH@Z
+00401638 EFSRV.dll ?Read@RFile@@QBEHAAVTDes8@@H@Z
+0040163e EUSER.dll ?Set@TLocale@@QBEXXZ
+00401644 EUSER.dll ??0TCurrencySymbol@@QAE@XZ
+0040164a EUSER.dll ?SetCurrencySymbol@User@@SAXABVTDesC16@@@Z
+00401650 EFSRV.dll ?Close@RFsBase@@QAEXXZ
+00401656 EUSER.dll ??0TBufBase16@@IAE@H@Z
+0040165c EUSER.dll ?SetXYInputCalibration@UserHal@@SAHABVTDigitizerCalibration@@@Z
+00401662 EUSER.dll ??0TBufBase8@@IAE@H@Z
+00401668 EFSRV.dll ?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z
+0040166e EUSER.dll ?Panic@User@@SAXABVTDesC16@@H@Z
+00401674 EUSER.dll ?AtC@TDesC8@@IBEABEH@Z
+0040167a EFSRV.dll ?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z
+00401680 EFSRV.dll ?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z
+00401686 EUSER.dll ?WaitForRequest@User@@SAXAAVTRequestStatus@@@Z
+0040168c EFSRV.dll ?Connect@RFs@@QAEHH@Z
+00401692 EFSRV.dll ?Size@RFile@@QBEHAAH@Z
+00401698 EFSRV.dll ?Read@RFile@@QBEHAAVTDes8@@@Z
+0040169e EUSER.dll ?Alloc@User@@SAPAXH@Z
+004016a4 EUSER.dll ??0TPtr8@@QAE@PAEHH@Z
+004016aa EUSER.dll ?Free@User@@SAXPAX@Z
+004016b0 EUSER.dll ?AtC@TDesC16@@IBEABGH@Z
+004016b6 EUSER.dll ?Create@RProcess@@QAEHABVTDesC16@@0W4TOwnerType@@@Z
+004016bc EUSER.dll ?Resume@RProcess@@QAEXXZ
+004016c2 EUSER.dll ?Close@RHandleBase@@QAEXXZ
+004016e8 UP_EXE.obj ?Panic@@YAXW4TStatPanic@@@Z
+00401880 UP_EXE.obj ?_E32Startup@@YGXXZ
+00401892 EUSER.dll ??0TPtrC16@@QAE@PBG@Z
+00401898 EUSER.dll ?BlockThreads@UserSvr@@SAXW4TBlockType@@@Z
+0040189e EUSER.dll ?__DllAttachProcess@UpWins@@SAXXZ
+004018a4 EUSER.dll ?__FileServer@UpWins@@SAP6AHPAX@ZXZ
+004018aa EUSER.dll ?Create@RThread@@QAEHABVTDesC16@@P6AHPAX@ZHHH1W4TOwnerType@@@Z
+004018b0 EUSER.dll ?SetPriority@RThread@@QBEXW4TThreadPriority@@@Z
+004018b6 EUSER.dll ?SetSystem@RThread@@QBEXH@Z
+004018bc EUSER.dll ?SetProtected@RThread@@QBEXH@Z
+004018c2 EUSER.dll ?Resume@RThread@@QBEXXZ
+004018c8 EUSER.dll ?__Synchronize@UpWins@@SAXXZ
+004018ce EUSER.dll ?__ReleaseInitThreads@UpWins@@SAXXZ
+004018d4 EUSER.dll ?__WindowServer@UpWins@@SAP6AHPAX@ZXZ
+004018da EUSER.dll ?__WireKernel@UpWins@@SAXXZ
+004018e0 EUSER.dll ?KernelStartup@UserSvr@@SAXP6AHPAX@Z@Z
+00403000 uid.o ?uid@@3PAVTUid@@A
+00404000 EFSRV.dll __IMPORT_DESCRIPTOR_EFSRV
+00404014 EUSER.dll __IMPORT_DESCRIPTOR_EUSER
+00404028 HAL.dll __IMPORT_DESCRIPTOR_HAL
+0040403c EFSRV.dll __NULL_IMPORT_DESCRIPTOR
+00404120 EFSRV.dll __imp_??0TFindFile@@QAE@AAVRFs@@@Z
+00404124 EFSRV.dll __imp_?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z
+00404128 EFSRV.dll __imp_?FullName@TParseBase@@QBEABVTDesC16@@XZ
+0040412c EFSRV.dll __imp_?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z
+00404130 EFSRV.dll __imp_?Read@RFile@@QBEHAAVTDes8@@H@Z
+00404134 EFSRV.dll __imp_?Close@RFsBase@@QAEXXZ
+00404138 EFSRV.dll __imp_?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z
+0040413c EFSRV.dll __imp_?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z
+00404140 EFSRV.dll __imp_?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z
+00404144 EFSRV.dll __imp_?Connect@RFs@@QAEHH@Z
+00404148 EFSRV.dll __imp_?Size@RFile@@QBEHAAH@Z
+0040414c EFSRV.dll __imp_?Read@RFile@@QBEHAAVTDes8@@@Z
+00404150 EFSRV.dll EFSRV_NULL_THUNK_DATA
+00404154 EUSER.dll __imp_??0TLocale@@QAE@XZ
+00404158 EUSER.dll __imp_??0TBufBase16@@IAE@ABVTDesC16@@H@Z
+0040415c EUSER.dll __imp_?AppendNumFixedWidth@TDes16@@QAEXIW4TRadix@@H@Z
+00404160 EUSER.dll __imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z
+00404164 EUSER.dll __imp_??0TPtr8@@QAE@PAEH@Z
+00404168 EUSER.dll __imp_?Set@TLocale@@QBEXXZ
+0040416c EUSER.dll __imp_??0TCurrencySymbol@@QAE@XZ
+00404170 EUSER.dll __imp_?SetCurrencySymbol@User@@SAXABVTDesC16@@@Z
+00404174 EUSER.dll __imp_??0TBufBase16@@IAE@H@Z
+00404178 EUSER.dll __imp_?SetXYInputCalibration@UserHal@@SAHABVTDigitizerCalibration@@@Z
+0040417c EUSER.dll __imp_??0TBufBase8@@IAE@H@Z
+00404180 EUSER.dll __imp_?Panic@User@@SAXABVTDesC16@@H@Z
+00404184 EUSER.dll __imp_?AtC@TDesC8@@IBEABEH@Z
+00404188 EUSER.dll __imp_?WaitForRequest@User@@SAXAAVTRequestStatus@@@Z
+0040418c EUSER.dll __imp_?Alloc@User@@SAPAXH@Z
+00404190 EUSER.dll __imp_??0TPtr8@@QAE@PAEHH@Z
+00404194 EUSER.dll __imp_?Free@User@@SAXPAX@Z
+00404198 EUSER.dll __imp_?AtC@TDesC16@@IBEABGH@Z
+0040419c EUSER.dll __imp_?Create@RProcess@@QAEHABVTDesC16@@0W4TOwnerType@@@Z
+004041a0 EUSER.dll __imp_?Resume@RProcess@@QAEXXZ
+004041a4 EUSER.dll __imp_?Close@RHandleBase@@QAEXXZ
+004041a8 EUSER.dll __imp_??0TPtrC16@@QAE@PBG@Z
+004041ac EUSER.dll __imp_?BlockThreads@UserSvr@@SAXW4TBlockType@@@Z
+004041b0 EUSER.dll __imp_?__DllAttachProcess@UpWins@@SAXXZ
+004041b4 EUSER.dll __imp_?__FileServer@UpWins@@SAP6AHPAX@ZXZ
+004041b8 EUSER.dll __imp_?Create@RThread@@QAEHABVTDesC16@@P6AHPAX@ZHHH1W4TOwnerType@@@Z
+004041bc EUSER.dll __imp_?SetPriority@RThread@@QBEXW4TThreadPriority@@@Z
+004041c0 EUSER.dll __imp_?SetSystem@RThread@@QBEXH@Z
+004041c4 EUSER.dll __imp_?SetProtected@RThread@@QBEXH@Z
+004041c8 EUSER.dll __imp_?Resume@RThread@@QBEXXZ
+004041cc EUSER.dll __imp_?__Synchronize@UpWins@@SAXXZ
+004041d0 EUSER.dll __imp_?__ReleaseInitThreads@UpWins@@SAXXZ
+004041d4 EUSER.dll __imp_?__WindowServer@UpWins@@SAP6AHPAX@ZXZ
+004041d8 EUSER.dll __imp_?__WireKernel@UpWins@@SAXXZ
+004041dc EUSER.dll __imp_?KernelStartup@UserSvr@@SAXP6AHPAX@Z@Z
+004041e0 EUSER.dll EUSER_NULL_THUNK_DATA
+004041e4 HAL.dll __imp_?Get@HAL@@SAHW4TAttribute@HALData@@AAH@Z
+004041e8 HAL.dll __imp_?Set@HAL@@SAHW4TAttribute@HALData@@H@Z
+004041ec HAL.dll HAL_NULL_THUNK_DATA
+00405000 UP_EXE.obj ?__xc_a@@3PAP6AXXZA
+00405008 UP_EXE.obj ?__xc_z@@3PAP6AXXZA
+00405010 UP_EXE.obj ?__xi_a@@3PAP6AXXZA
+00405018 UP_EXE.obj ?__xi_z@@3PAP6AXXZA
+00405020 UP_EXE.obj ?__xp_a@@3PAP6AXXZA
+00405028 UP_EXE.obj ?__xp_z@@3PAP6AXXZA
+00405030 UP_EXE.obj ?__xt_a@@3PAP6AXXZA
+00405038 UP_EXE.obj ?__xt_z@@3PAP6AXXZA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/Preprocessed_text/IRCOMM.rpp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+# 1 "W:\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS"
+// IRCOMM.RSS
+//
+// Copyright (c) 1998 Symbian Ltd. All rights reserved.
+//
+
+# 1 "ircomm.rls" 1
+rls_string STRING_r_irccsy_info1 "Infrared"
+# 6 "W:\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS" 2
+
+# 1 "..\\INC\\csy.rh" 1
+// CSY.RH
+//
+// Copyright (c) 1998 Symbian Ltd. All rights reserved.
+//
+
+
+STRUCT CSY_INFORMATION
+ {
+ LTEXT humanreadablename;
+ }
+# 7 "W:\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS" 2
+
+
+RESOURCE CSY_INFORMATION r_irccsy_info
+ {
+ humanreadablename=STRING_r_irccsy_info1;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/SGML_file/allclasses-frame.html Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Tue Jul 15 18:05:14 BST 2003 -->
+<TITLE>
+All Classes
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/symbian/sdk/util/assertion/Assert.html" TARGET="classFrame">Assert</A>
+<BR>
+<A HREF="com/symbian/sdk/util/assertion/AssertionException.html" TARGET="classFrame">AssertionException</A>
+<BR>
+<A HREF="com/symbian/sdk/util/assertion/JniOutOfMemoryError.html" TARGET="classFrame">JniOutOfMemoryError</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
Binary file bintools/evalid/left/ok/ZIP_file/aifapp_ResourceBundles.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left/ok/identical/console.ini Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Console.ini
+# Copyright (c) 1997-2001 Symbian Ltd. All rights reserved.
+#
+ScreenWidth 640
+ScreenHeight 240
+
+PhysicalScreenWidth 0
+PhysicalScreenHeight 0
+
+fasciabitmap console.bmp
+
+ScreenOffsetX 0
+ScreenOffsetY 0
+
+
+# could be decreased to reflect the amount of memory available on Brutus
+MegabytesOfFreeMemory 16
+
+
Binary file bintools/evalid/right/fail/CHM_file/content/file.chm has changed
Binary file bintools/evalid/right/fail/CHM_file/less_files/filelist.chm has changed
Binary file bintools/evalid/right/fail/CHM_file/more_files/filelist.chm has changed
Binary file bintools/evalid/right/fail/Intel_DLL/wins/udeb/C32.DLL has changed
Binary file bintools/evalid/right/fail/Intel_DLL/wins/urel/BAFL.DLL has changed
Binary file bintools/evalid/right/fail/Intel_DLL/winscw_data.dll has changed
Binary file bintools/evalid/right/fail/Intel_DLL/winscw_export.dll has changed
Binary file bintools/evalid/right/fail/Intel_DLL/winscw_import.dll has changed
Binary file bintools/evalid/right/fail/Intel_DLL/winscw_rdata.dll has changed
Binary file bintools/evalid/right/fail/Intel_DLL/winscw_text.dll has changed
Binary file bintools/evalid/right/fail/Intel_DLL/winscw_uid.dll has changed
Binary file bintools/evalid/right/fail/Intel_EXE/winscw_data.exe has changed
Binary file bintools/evalid/right/fail/Intel_EXE/winscw_import.exe has changed
Binary file bintools/evalid/right/fail/Intel_EXE/winscw_rdata.exe has changed
Binary file bintools/evalid/right/fail/Intel_EXE/winscw_text.exe has changed
Binary file bintools/evalid/right/fail/Intel_EXE/winscw_uid.exe has changed
Binary file bintools/evalid/right/fail/Intel_library/symbol.lib has changed
Binary file bintools/evalid/right/fail/Intel_object/symbol.obj has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/fail/MAP_file/offset.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o) (_head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o) (_________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o) (_head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o) (____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001004 0x318 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ 0x10001050 TASShdAlarm::InternalizeL(RReadStream &)
+ 0x10001264 TASShdAlarm::Reset(void)
+ 0x10001004 TASShdAlarm::TASShdAlarm(void)
+ 0x10001174 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000131c 0x8 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ 0x1000131c E32Dll(TDllReason)
+ .text 0x10001324 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x10001324 TBufBase16::TBufBase16(int)
+ .text 0x10001330 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x10001330 Time::NullTTime(void)
+ .text 0x1000133c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x1000133c TDes16::Copy(TDesC16 const &)
+ .text 0x10001348 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x10001348 RReadStream::ReadUint16L(void)
+ .text 0x10001354 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x10001354 RReadStream::ReadInt8L(void)
+ .text 0x10001360 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x10001360 RReadStream::ReadInt32L(void)
+ .text 0x1000136c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x1000136c InternalizeL(TInt64 &, RReadStream &)
+ .text 0x10001378 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x10001378 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x10001384 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x10001384 RReadStream::ReadInt16L(void)
+ .text 0x10001390 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x10001390 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x1000139c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x1000139c RWriteStream::WriteInt8L(int)
+ .text 0x100013a8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100013a8 RWriteStream::WriteInt32L(long)
+ .text 0x100013b4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x100013b4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013c0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x100013c0 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x100013cc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x100013cc RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x100013d8 ___CTOR_LIST__=.
+ 0x100013d8 __CTOR_LIST__=.
+ 0x100013d8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x100013dc 0x4 LONG 0x0
+ 0x100013e0 ___DTOR_LIST__=.
+ 0x100013e0 __DTOR_LIST__=.
+ 0x100013e0 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x100013e4 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x100013e8 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x100013e8 0x8 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ 0x10003000 _head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ 0x10003014 _head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ 0x10003104 ____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ 0x10003124 _________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/fail/MAP_file/size.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o) (_head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o) (_________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o) (_head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o) (____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001004 0x318 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ 0x10001048 TASShdAlarm::InternalizeL(RReadStream &)
+ 0x10001264 TASShdAlarm::Reset(void)
+ 0x10001004 TASShdAlarm::TASShdAlarm(void)
+ 0x10001174 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000131c 0x8 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ 0x1000131c E32Dll(TDllReason)
+ .text 0x10001324 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x10001324 TBufBase16::TBufBase16(int)
+ .text 0x10001330 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x10001330 Time::NullTTime(void)
+ .text 0x1000133c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x1000133c TDes16::Copy(TDesC16 const &)
+ .text 0x10001348 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x10001348 RReadStream::ReadUint16L(void)
+ .text 0x10001354 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x10001354 RReadStream::ReadInt8L(void)
+ .text 0x10001360 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x10001360 RReadStream::ReadInt32L(void)
+ .text 0x1000136c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x1000136c InternalizeL(TInt64 &, RReadStream &)
+ .text 0x10001378 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x10001378 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x10001384 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x10001384 RReadStream::ReadInt16L(void)
+ .text 0x10001390 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x10001390 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x1000139c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x1000139c RWriteStream::WriteInt8L(int)
+ .text 0x100013a8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100013a8 RWriteStream::WriteInt32L(long)
+ .text 0x100013b4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x100013b4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013c0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x100013c0 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x100013cc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x100013cc RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x100013d8 ___CTOR_LIST__=.
+ 0x100013d8 __CTOR_LIST__=.
+ 0x100013d8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x100013dc 0x4 LONG 0x0
+ 0x100013e0 ___DTOR_LIST__=.
+ 0x100013e0 __DTOR_LIST__=.
+ 0x100013e0 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x100013e4 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x100013e8 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x100013e8 0x8 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x64 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ 0x10003000 _head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ 0x10003014 _head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ 0x10003104 ____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ 0x10003124 _________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/fail/MAP_file/symbol.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o) (_head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o) (_________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o) (_head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o) (____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001004 0x318 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ 0x10001048 TASShdAlarm::InternaliseL(RReadStream &)
+ 0x10001264 TASShdAlarm::Reset(void)
+ 0x10001004 TASShdAlarm::TASShdAlarm(void)
+ 0x10001174 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000131c 0x8 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ 0x1000131c E32Dll(TDllReason)
+ .text 0x10001324 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x10001324 TBufBase16::TBufBase16(int)
+ .text 0x10001330 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x10001330 Time::NullTTime(void)
+ .text 0x1000133c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x1000133c TDes16::Copy(TDesC16 const &)
+ .text 0x10001348 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x10001348 RReadStream::ReadUint16L(void)
+ .text 0x10001354 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x10001354 RReadStream::ReadInt8L(void)
+ .text 0x10001360 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x10001360 RReadStream::ReadInt32L(void)
+ .text 0x1000136c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x1000136c InternalizeL(TInt64 &, RReadStream &)
+ .text 0x10001378 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x10001378 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x10001384 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x10001384 RReadStream::ReadInt16L(void)
+ .text 0x10001390 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x10001390 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x1000139c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x1000139c RWriteStream::WriteInt8L(int)
+ .text 0x100013a8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100013a8 RWriteStream::WriteInt32L(long)
+ .text 0x100013b4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x100013b4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013c0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x100013c0 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x100013cc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x100013cc RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x100013d8 ___CTOR_LIST__=.
+ 0x100013d8 __CTOR_LIST__=.
+ 0x100013d8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x100013dc 0x4 LONG 0x0
+ 0x100013e0 ___DTOR_LIST__=.
+ 0x100013e0 __DTOR_LIST__=.
+ 0x100013e0 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x100013e4 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x100013e8 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x100013e8 0x8 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ 0x10003000 _head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ 0x10003014 _head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ 0x10003104 ____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ 0x10003124 _________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/fail/MAP_file/winscw_offset.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,145 @@
+Address Size Name Subname Module
+
+40701000 0000003d .text ASSHDALARM.o(??0TASShdAlarm@@QAE@XZ)
+4070103d 00000107 .text ASSHDALARM.o(?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z)
+40701144 000000dc .text ASSHDALARM.o(?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z)
+40701220 000000a0 .text ASSHDALARM.o(?Reset@TASShdAlarm@@QAEXXZ)
+407012c0 00000005 .text ASSHDDLL.o(?E32Dll@@YAHW4TDllReason@@@Z)
+407012c6 00000006 .text EUSER.dll(??0TBufBase16@@IAE@H@Z)
+407012cc 00000006 .text ESTOR.dll(?ReadUint16L@RReadStream@@QAEGXZ)
+407012d2 00000006 .text ESTOR.dll(?ReadInt8L@RReadStream@@QAECXZ)
+407012d8 00000006 .text ESTOR.dll(?ReadInt32L@RReadStream@@QAEJXZ)
+407012de 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+407012e4 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+407012ea 00000006 .text ESTOR.dll(?ReadInt16L@RReadStream@@QAEFXZ)
+407012f0 00000006 .text ESTOR.dll(?WriteUint16L@RWriteStream@@QAEXI@Z)
+407012f6 00000006 .text ESTOR.dll(?WriteInt8L@RWriteStream@@QAEXH@Z)
+407012fc 00000006 .text ESTOR.dll(?WriteInt32L@RWriteStream@@QAEXJ@Z)
+40701302 00000006 .text ESTOR.dll(?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+40701308 00000006 .text ESTOR.dll(?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+4070130e 00000006 .text ESTOR.dll(?WriteInt16L@RWriteStream@@QAEXH@Z)
+40701314 00000006 .text EUSER.dll(?NullTTime@Time@@SA?AVTTime@@XZ)
+4070131a 00000006 .text EUSER.dll(?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+40701320 00000020 .text UP_DLL.obj(?initTable@@YAXPAP6AXXZ0@Z)
+40701340 000000a7 .text UP_DLL.obj(?_E32Dll@@YGHPAXI0@Z)
+407013e8 00000006 .text EUSER.dll(?__WireKernel@UpWins@@SAXXZ)
+40702000 0000001c .data ASSHDALARM.o
+40702020 00000018 .data ASSHDDLL.o
+40702038 00000018 .data uid.o
+40702050 00000018 .data UP_DLL.obj
+40702068 00000010 .data UP_DLL.obj
+40703000 0000000c .E32_UID uid.o
+40704000 00000014 .idata $2 ESTOR.dll
+40704014 00000014 .idata $2 EUSER.dll
+40704028 00000014 .idata $3 EUSER.dll
+4070403c 00000004 .idata $4 ESTOR.dll
+40704040 00000004 .idata $4 ESTOR.dll
+40704044 00000004 .idata $4 ESTOR.dll
+40704048 00000004 .idata $4 ESTOR.dll
+4070404c 00000004 .idata $4 ESTOR.dll
+40704050 00000004 .idata $4 ESTOR.dll
+40704054 00000004 .idata $4 ESTOR.dll
+40704058 00000004 .idata $4 ESTOR.dll
+4070405c 00000004 .idata $4 ESTOR.dll
+40704060 00000004 .idata $4 ESTOR.dll
+40704064 00000004 .idata $4 ESTOR.dll
+40704068 00000004 .idata $4 ESTOR.dll
+4070406c 00000004 .idata $4 ESTOR.dll
+40704070 00000004 .idata $4 EUSER.dll
+40704074 00000004 .idata $4 EUSER.dll
+40704078 00000004 .idata $4 EUSER.dll
+4070407c 00000004 .idata $4 EUSER.dll
+40704080 00000004 .idata $4 EUSER.dll
+40704084 00000004 .idata $5 ESTOR.dll(__imp_?ReadUint16L@RReadStream@@QAEGXZ)
+40704088 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt8L@RReadStream@@QAECXZ)
+4070408c 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt32L@RReadStream@@QAEJXZ)
+40704090 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+40704094 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+40704098 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt16L@RReadStream@@QAEFXZ)
+4070409c 00000004 .idata $5 ESTOR.dll(__imp_?WriteUint16L@RWriteStream@@QAEXI@Z)
+407040a0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt8L@RWriteStream@@QAEXH@Z)
+407040a4 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt32L@RWriteStream@@QAEXJ@Z)
+407040a8 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+407040ac 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+407040b0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt16L@RWriteStream@@QAEXH@Z)
+407040b4 00000004 .idata $5 ESTOR.dll
+407040b8 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@H@Z)
+407040bc 00000004 .idata $5 EUSER.dll(__imp_?NullTTime@Time@@SA?AVTTime@@XZ)
+407040c0 00000004 .idata $5 EUSER.dll(__imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+407040c4 00000004 .idata $5 EUSER.dll(__imp_?__WireKernel@UpWins@@SAXXZ)
+407040c8 00000004 .idata $5 EUSER.dll
+407040cc 0000000a .idata $6 ESTOR.dll
+407040d6 0000000a .idata $6 EUSER.dll
+40705000 00000004 .CRT $XCA UP_DLL.obj
+40705008 00000004 .CRT $XCZ UP_DLL.obj
+40705010 00000004 .CRT $XIA UP_DLL.obj
+40705018 00000004 .CRT $XIZ UP_DLL.obj
+40705020 00000004 .CRT $XPA UP_DLL.obj
+40705028 00000004 .CRT $XPZ UP_DLL.obj
+40705030 00000004 .CRT $XTA UP_DLL.obj
+40705038 00000004 .CRT $XTZ UP_DLL.obj
+40706000 00000012 .bss ASSHDALARM.o
+40706018 00000008 .bss ASSHDDLL.o
+40706020 00000008 .bss uid.o
+40706028 00000008 .bss UP_DLL.obj
+40706030 00000004 .bss
+
+--------------
+Public Symbols
+--------------
+
+Address Module Name
+-------- -------------------- ----
+40701000 ASSHDALARM.o ??0TASShdAlarm@@QAE@XZ
+4070103d ASSHDALARM.o ?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z
+40701144 ASSHDALARM.o ?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z
+40701220 ASSHDALARM.o ?Reset@TASShdAlarm@@QAEXXZ
+407012c0 ASSHDDLL.o ?E32Dll@@YAHW4TDllReason@@@Z
+407012c6 EUSER.dll ??0TBufBase16@@IAE@H@Z
+407012cc ESTOR.dll ?ReadUint16L@RReadStream@@QAEGXZ
+407012d2 ESTOR.dll ?ReadInt8L@RReadStream@@QAECXZ
+407012d8 ESTOR.dll ?ReadInt32L@RReadStream@@QAEJXZ
+407012de ESTOR.dll ?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+407012e4 ESTOR.dll ?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+407012ea ESTOR.dll ?ReadInt16L@RReadStream@@QAEFXZ
+407012f0 ESTOR.dll ?WriteUint16L@RWriteStream@@QAEXI@Z
+407012f6 ESTOR.dll ?WriteInt8L@RWriteStream@@QAEXH@Z
+407012fc ESTOR.dll ?WriteInt32L@RWriteStream@@QAEXJ@Z
+40701302 ESTOR.dll ?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+40701308 ESTOR.dll ?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+4070130e ESTOR.dll ?WriteInt16L@RWriteStream@@QAEXH@Z
+40701314 EUSER.dll ?NullTTime@Time@@SA?AVTTime@@XZ
+4070131a EUSER.dll ?Copy@TDes16@@QAEXABVTDesC16@@@Z
+40701340 UP_DLL.obj ?_E32Dll@@YGHPAXI0@Z
+407013e8 EUSER.dll ?__WireKernel@UpWins@@SAXXZ
+40703000 uid.o ?uid@@3PAVTUid@@A
+40704000 ESTOR.dll __IMPORT_DESCRIPTOR_ESTOR
+40704014 EUSER.dll __IMPORT_DESCRIPTOR_EUSER
+40704028 EUSER.dll __NULL_IMPORT_DESCRIPTOR
+40704084 ESTOR.dll __imp_?ReadUint16L@RReadStream@@QAEGXZ
+40704088 ESTOR.dll __imp_?ReadInt8L@RReadStream@@QAECXZ
+4070408c ESTOR.dll __imp_?ReadInt32L@RReadStream@@QAEJXZ
+40704090 ESTOR.dll __imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+40704094 ESTOR.dll __imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+40704098 ESTOR.dll __imp_?ReadInt16L@RReadStream@@QAEFXZ
+4070409c ESTOR.dll __imp_?WriteUint16L@RWriteStream@@QAEXI@Z
+407040a0 ESTOR.dll __imp_?WriteInt8L@RWriteStream@@QAEXH@Z
+407040a4 ESTOR.dll __imp_?WriteInt32L@RWriteStream@@QAEXJ@Z
+407040a8 ESTOR.dll __imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+407040ac ESTOR.dll __imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+407040b0 ESTOR.dll __imp_?WriteInt16L@RWriteStream@@QAEXH@Z
+407040b4 ESTOR.dll ESTOR_NULL_THUNK_DATA
+407040b8 EUSER.dll __imp_??0TBufBase16@@IAE@H@Z
+407040bc EUSER.dll __imp_?NullTTime@Time@@SA?AVTTime@@XZ
+407040c0 EUSER.dll __imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z
+407040c4 EUSER.dll __imp_?__WireKernel@UpWins@@SAXXZ
+407040c8 EUSER.dll EUSER_NULL_THUNK_DATA
+40705000 UP_DLL.obj ?__xc_a@@3PAP6AXXZA
+40705008 UP_DLL.obj ?__xc_z@@3PAP6AXXZA
+40705010 UP_DLL.obj ?__xi_a@@3PAP6AXXZA
+40705018 UP_DLL.obj ?__xi_z@@3PAP6AXXZA
+40705020 UP_DLL.obj ?__xp_a@@3PAP6AXXZA
+40705028 UP_DLL.obj ?__xp_z@@3PAP6AXXZA
+40705030 UP_DLL.obj ?__xt_a@@3PAP6AXXZA
+40705038 UP_DLL.obj ?__xt_z@@3PAP6AXXZA
+40706030 common ?_initialised@@3HA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/fail/MAP_file/winscw_symbol.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,145 @@
+Address Size Name Subname Module
+
+40701000 0000003d .text ASSHDALARM.o(??0TASShdAlarm@@QAE@XZ)
+4070103d 00000107 .text ASSHDALARM.o(?InternaliseL@TASShdAlarm@@QAEXAAVRReadStream@@@Z)
+40701144 000000dc .text ASSHDALARM.o(?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z)
+40701220 000000a2 .text ASSHDALARM.o(?Reset@TASShdAlarm@@QAEXXZ)
+407012c2 00000003 .text ASSHDDLL.o(?E32Dll@@YAHW4TDllReason@@@Z)
+407012c6 00000006 .text EUSER.dll(??0TBufBase16@@IAE@H@Z)
+407012cc 00000006 .text ESTOR.dll(?ReadUint16L@RReadStream@@QAEGXZ)
+407012d2 00000006 .text ESTOR.dll(?ReadInt8L@RReadStream@@QAECXZ)
+407012d8 00000006 .text ESTOR.dll(?ReadInt32L@RReadStream@@QAEJXZ)
+407012de 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+407012e4 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+407012ea 00000006 .text ESTOR.dll(?ReadInt16L@RReadStream@@QAEFXZ)
+407012f0 00000006 .text ESTOR.dll(?WriteUint16L@RWriteStream@@QAEXI@Z)
+407012f6 00000006 .text ESTOR.dll(?WriteInt8L@RWriteStream@@QAEXH@Z)
+407012fc 00000006 .text ESTOR.dll(?WriteInt32L@RWriteStream@@QAEXJ@Z)
+40701302 00000006 .text ESTOR.dll(?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+40701308 00000006 .text ESTOR.dll(?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+4070130e 00000006 .text ESTOR.dll(?WriteInt16L@RWriteStream@@QAEXH@Z)
+40701314 00000006 .text EUSER.dll(?NullTTime@Time@@SA?AVTTime@@XZ)
+4070131a 00000006 .text EUSER.dll(?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+40701320 00000020 .text UP_DLL.obj(?initTable@@YAXPAP6AXXZ0@Z)
+40701340 000000a7 .text UP_DLL.obj(?_E32Dll@@YGHPAXI0@Z)
+407013e8 00000006 .text EUSER.dll(?__WireKernel@UpWins@@SAXXZ)
+40702000 0000001c .data ASSHDALARM.o
+40702020 00000018 .data ASSHDDLL.o
+40702038 00000018 .data uid.o
+40702050 00000018 .data UP_DLL.obj
+40702068 00000010 .data UP_DLL.obj
+40703000 0000000c .E32_UID uid.o
+40704000 00000014 .idata $2 ESTOR.dll
+40704014 00000014 .idata $2 EUSER.dll
+40704028 00000014 .idata $3 EUSER.dll
+4070403c 00000004 .idata $4 ESTOR.dll
+40704040 00000004 .idata $4 ESTOR.dll
+40704044 00000004 .idata $4 ESTOR.dll
+40704048 00000004 .idata $4 ESTOR.dll
+4070404c 00000004 .idata $4 ESTOR.dll
+40704050 00000004 .idata $4 ESTOR.dll
+40704054 00000004 .idata $4 ESTOR.dll
+40704058 00000004 .idata $4 ESTOR.dll
+4070405c 00000004 .idata $4 ESTOR.dll
+40704060 00000004 .idata $4 ESTOR.dll
+40704064 00000004 .idata $4 ESTOR.dll
+40704068 00000004 .idata $4 ESTOR.dll
+4070406c 00000004 .idata $4 ESTOR.dll
+40704070 00000004 .idata $4 EUSER.dll
+40704074 00000004 .idata $4 EUSER.dll
+40704078 00000004 .idata $4 EUSER.dll
+4070407c 00000004 .idata $4 EUSER.dll
+40704080 00000004 .idata $4 EUSER.dll
+40704084 00000004 .idata $5 ESTOR.dll(__imp_?ReadUint16L@RReadStream@@QAEGXZ)
+40704088 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt8L@RReadStream@@QAECXZ)
+4070408c 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt32L@RReadStream@@QAEJXZ)
+40704090 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+40704094 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+40704098 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt16L@RReadStream@@QAEFXZ)
+4070409c 00000004 .idata $5 ESTOR.dll(__imp_?WriteUint16L@RWriteStream@@QAEXI@Z)
+407040a0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt8L@RWriteStream@@QAEXH@Z)
+407040a4 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt32L@RWriteStream@@QAEXJ@Z)
+407040a8 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+407040ac 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+407040b0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt16L@RWriteStream@@QAEXH@Z)
+407040b4 00000004 .idata $5 ESTOR.dll
+407040b8 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@H@Z)
+407040bc 00000004 .idata $5 EUSER.dll(__imp_?NullTTime@Time@@SA?AVTTime@@XZ)
+407040c0 00000004 .idata $5 EUSER.dll(__imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+407040c4 00000004 .idata $5 EUSER.dll(__imp_?__WireKernel@UpWins@@SAXXZ)
+407040c8 00000004 .idata $5 EUSER.dll
+407040cc 0000000a .idata $6 ESTOR.dll
+407040d6 0000000a .idata $6 EUSER.dll
+40705000 00000004 .CRT $XCA UP_DLL.obj
+40705008 00000004 .CRT $XCZ UP_DLL.obj
+40705010 00000004 .CRT $XIA UP_DLL.obj
+40705018 00000004 .CRT $XIZ UP_DLL.obj
+40705020 00000004 .CRT $XPA UP_DLL.obj
+40705028 00000004 .CRT $XPZ UP_DLL.obj
+40705030 00000004 .CRT $XTA UP_DLL.obj
+40705038 00000004 .CRT $XTZ UP_DLL.obj
+40706000 00000012 .bss ASSHDALARM.o
+40706018 00000008 .bss ASSHDDLL.o
+40706020 00000008 .bss uid.o
+40706028 00000008 .bss UP_DLL.obj
+40706030 00000004 .bss
+
+--------------
+Public Symbols
+--------------
+
+Address Module Name
+-------- -------------------- ----
+40701000 ASSHDALARM.o ??0TASShdAlarm@@QAE@XZ
+4070103d ASSHDALARM.o ?InternaliseL@TASShdAlarm@@QAEXAAVRReadStream@@@Z
+40701144 ASSHDALARM.o ?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z
+40701220 ASSHDALARM.o ?Reset@TASShdAlarm@@QAEXXZ
+407012c2 ASSHDDLL.o ?E32Dll@@YAHW4TDllReason@@@Z
+407012c6 EUSER.dll ??0TBufBase16@@IAE@H@Z
+407012cc ESTOR.dll ?ReadUint16L@RReadStream@@QAEGXZ
+407012d2 ESTOR.dll ?ReadInt8L@RReadStream@@QAECXZ
+407012d8 ESTOR.dll ?ReadInt32L@RReadStream@@QAEJXZ
+407012de ESTOR.dll ?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+407012e4 ESTOR.dll ?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+407012ea ESTOR.dll ?ReadInt16L@RReadStream@@QAEFXZ
+407012f0 ESTOR.dll ?WriteUint16L@RWriteStream@@QAEXI@Z
+407012f6 ESTOR.dll ?WriteInt8L@RWriteStream@@QAEXH@Z
+407012fc ESTOR.dll ?WriteInt32L@RWriteStream@@QAEXJ@Z
+40701302 ESTOR.dll ?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+40701308 ESTOR.dll ?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+4070130e ESTOR.dll ?WriteInt16L@RWriteStream@@QAEXH@Z
+40701314 EUSER.dll ?NullTTime@Time@@SA?AVTTime@@XZ
+4070131a EUSER.dll ?Copy@TDes16@@QAEXABVTDesC16@@@Z
+40701340 UP_DLL.obj ?_E32Dll@@YGHPAXI0@Z
+407013e8 EUSER.dll ?__WireKernel@UpWins@@SAXXZ
+40703000 uid.o ?uid@@3PAVTUid@@A
+40704000 ESTOR.dll __IMPORT_DESCRIPTOR_ESTOR
+40704014 EUSER.dll __IMPORT_DESCRIPTOR_EUSER
+40704028 EUSER.dll __NULL_IMPORT_DESCRIPTOR
+40704084 ESTOR.dll __imp_?ReadUint16L@RReadStream@@QAEGXZ
+40704088 ESTOR.dll __imp_?ReadInt8L@RReadStream@@QAECXZ
+4070408c ESTOR.dll __imp_?ReadInt32L@RReadStream@@QAEJXZ
+40704090 ESTOR.dll __imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+40704094 ESTOR.dll __imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+40704098 ESTOR.dll __imp_?ReadInt16L@RReadStream@@QAEFXZ
+4070409c ESTOR.dll __imp_?WriteUint16L@RWriteStream@@QAEXI@Z
+407040a0 ESTOR.dll __imp_?WriteInt8L@RWriteStream@@QAEXH@Z
+407040a4 ESTOR.dll __imp_?WriteInt32L@RWriteStream@@QAEXJ@Z
+407040a8 ESTOR.dll __imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+407040ac ESTOR.dll __imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+407040b0 ESTOR.dll __imp_?WriteInt16L@RWriteStream@@QAEXH@Z
+407040b4 ESTOR.dll ESTOR_NULL_THUNK_DATA
+407040b8 EUSER.dll __imp_??0TBufBase16@@IAE@H@Z
+407040bc EUSER.dll __imp_?NullTTime@Time@@SA?AVTTime@@XZ
+407040c0 EUSER.dll __imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z
+407040c4 EUSER.dll __imp_?__WireKernel@UpWins@@SAXXZ
+407040c8 EUSER.dll EUSER_NULL_THUNK_DATA
+40705000 UP_DLL.obj ?__xc_a@@3PAP6AXXZA
+40705008 UP_DLL.obj ?__xc_z@@3PAP6AXXZA
+40705010 UP_DLL.obj ?__xi_a@@3PAP6AXXZA
+40705018 UP_DLL.obj ?__xi_z@@3PAP6AXXZA
+40705020 UP_DLL.obj ?__xp_a@@3PAP6AXXZA
+40705028 UP_DLL.obj ?__xp_z@@3PAP6AXXZA
+40705030 UP_DLL.obj ?__xt_a@@3PAP6AXXZA
+40705038 UP_DLL.obj ?__xt_z@@3PAP6AXXZA
+40706030 common ?_initialised@@3HA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/fail/Preprocessed_text/content.rpp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+# 1 "M:\\SRC\\COMMON\\GENERIC\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS"
+// IRCOMM.RSS
+//
+// Copyright (c) 1998 Symbian Ltd. All rights reserved.
+//
+
+# 1 "ircomm.rls" 1
+rls_string STRING_r_irccsy_info1 "Infrared"
+# 6 "M:\\SRC\\COMMON\\GENERIC\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS" 2
+
+# 1 "..\\INC\\csy.rh" 1
+// CSY.RH
+//
+// Copyright (c) 2003 Symbian Ltd. All rights reserved.
+//
+
+
+STRUCT CSY_INFORMATION
+ {
+ LTEXT humanreadablename;
+ }
+# 7 "M:\\SRC\\COMMON\\GENERIC\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS" 2
+
+
+RESOURCE CSY_INFORMATION r_irccsy_info
+ {
+ humanreadablename=STRING_r_irccsy_info1;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/fail/SGML_file/content.html Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Jul 16 16:53:16 BST 2003 -->
+<TITLE>
+All Classes
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>Not Same...</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/symbian/sdk/util/assertion/Assert.html" TARGET="classFrame">Assert</A>
+<BR>
+<A HREF="com/symbian/sdk/util/assertion/AssertionException.html" TARGET="classFrame">AssertionException</A>
+<BR>
+<A HREF="com/symbian/sdk/util/assertion/JniOutOfMemoryError.html" TARGET="classFrame">JniOutOfMemoryError</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
Binary file bintools/evalid/right/fail/SIS_file/release/armi/urel/gdbstub.sis has changed
Binary file bintools/evalid/right/fail/ZIP_file/content.zip has changed
Binary file bintools/evalid/right/fail/ZIP_file/order.zip has changed
Binary file bintools/evalid/right/fail/ZIP_file/size.zip has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/fail/unknown_format/data/BuildInfo.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,3 @@
+DeviceFamily 100
+DeviceFamilyRev 0x700
+ManufacturerSoftwareBuild 03062_beech
Binary file bintools/evalid/right/fail/unknown_format/ksa/layout.bin has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/missing/rightonlydir/file.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1 @@
+right only dir
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/missing/rightonlyfile.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1 @@
+right only file
Binary file bintools/evalid/right/ok/ARM_library/arm4/udeb/EEXE.LIB has changed
Binary file bintools/evalid/right/ok/ARM_library/arm4/urel/ALARMSHARED.LIB has changed
Binary file bintools/evalid/right/ok/ARM_library/arm4/urel/EEXE.LIB has changed
Binary file bintools/evalid/right/ok/ARM_library/thumb/udeb/EEXE.LIB has changed
Binary file bintools/evalid/right/ok/ARM_library/thumb/urel/ALARMSHARED.LIB has changed
Binary file bintools/evalid/right/ok/ARM_library/thumb/urel/EEXE.LIB has changed
Binary file bintools/evalid/right/ok/CHM_file/identical/file.chm has changed
Binary file bintools/evalid/right/ok/CHM_file/rebuilt/file.chm has changed
Binary file bintools/evalid/right/ok/Compressed_E32_DLL/arm4/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/Compressed_E32_DLL/arm4/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/Compressed_E32_DLL/thumb/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/Compressed_E32_DLL/thumb/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/Compressed_E32_EXE/arm4/udeb/E32STRT.EXE has changed
Binary file bintools/evalid/right/ok/Compressed_E32_EXE/arm4/urel/E32STRT.EXE has changed
Binary file bintools/evalid/right/ok/Compressed_E32_EXE/thumb/udeb/E32STRT.EXE has changed
Binary file bintools/evalid/right/ok/Compressed_E32_EXE/thumb/urel/E32STRT.EXE has changed
Binary file bintools/evalid/right/ok/E32_DLL/arm4/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/E32_DLL/arm4/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/E32_DLL/thumb/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/E32_DLL/thumb/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/E32_EXE/arm4/udeb/ALARMSERVER.EXE has changed
Binary file bintools/evalid/right/ok/E32_EXE/arm4/urel/ALARMSERVER.EXE has changed
Binary file bintools/evalid/right/ok/E32_EXE/case_diff/armv5/udeb/USESTATICDLL.EXE has changed
Binary file bintools/evalid/right/ok/E32_EXE/case_diff/armv5/urel/USESTATICDLL.EXE has changed
Binary file bintools/evalid/right/ok/E32_EXE/thumb/udeb/ALARMSERVER.EXE has changed
Binary file bintools/evalid/right/ok/E32_EXE/thumb/urel/ALARMSERVER.EXE has changed
Binary file bintools/evalid/right/ok/ELF_library/case_diff/armv5/CREATESTATICDLL.LIB has changed
Binary file bintools/evalid/right/ok/Intel_DLL/wins/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/Intel_DLL/wins/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/Intel_DLL/winscw/udeb/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/Intel_DLL/winscw/urel/ALARMSHARED.DLL has changed
Binary file bintools/evalid/right/ok/Intel_EXE/wins/urel/E32STRT.EXE has changed
Binary file bintools/evalid/right/ok/Intel_EXE/winscw/udeb/AlarmServer.exe has changed
Binary file bintools/evalid/right/ok/Intel_EXE/winscw/urel/E32STRT.EXE has changed
Binary file bintools/evalid/right/ok/Intel_library/wins/udeb/ALARMSHARED.LIB has changed
Binary file bintools/evalid/right/ok/Intel_library/wins/udeb/EEXE.LIB has changed
Binary file bintools/evalid/right/ok/Intel_library/wins/urel/EEXE.LIB has changed
Binary file bintools/evalid/right/ok/Intel_library/winscw/udeb/ALARMSHARED.LIB has changed
Binary file bintools/evalid/right/ok/Intel_library/winscw/udeb/EEXE.LIB has changed
Binary file bintools/evalid/right/ok/Intel_library/winscw/urel/EEXE.LIB has changed
Binary file bintools/evalid/right/ok/Intel_object/FNTTRAN.exp has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/arm4/udeb/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,301 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UDEB/UP_DLL.o)
+ (_E32Dll)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o) (_head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o) (_________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o) (_head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o) (____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLLSTUB.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x600
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UDEB/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001014 0x338 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o)
+ 0x10001060 TASShdAlarm::InternalizeL(RReadStream &)
+ 0x10001290 TASShdAlarm::Reset(void)
+ 0x10001014 TASShdAlarm::TASShdAlarm(void)
+ 0x10001198 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000134c 0x14 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDDLL.o)
+ 0x1000134c E32Dll(TDllReason)
+ .text 0x10001360 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x10001360 TBufBase16::TBufBase16(int)
+ .text 0x1000136c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x1000136c Time::NullTTime(void)
+ .text 0x10001378 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x10001378 TDes16::Copy(TDesC16 const &)
+ .text 0x10001384 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x10001384 RReadStream::ReadUint16L(void)
+ .text 0x10001390 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x10001390 RReadStream::ReadInt8L(void)
+ .text 0x1000139c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x1000139c RReadStream::ReadInt32L(void)
+ .text 0x100013a8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x100013a8 InternalizeL(TInt64 &, RReadStream &)
+ .text 0x100013b4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x100013b4 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x100013c0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x100013c0 RReadStream::ReadInt16L(void)
+ .text 0x100013cc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x100013cc RWriteStream::WriteUint16L(unsigned int)
+ .text 0x100013d8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x100013d8 RWriteStream::WriteInt8L(int)
+ .text 0x100013e4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100013e4 RWriteStream::WriteInt32L(long)
+ .text 0x100013f0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x100013f0 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013fc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x100013fc ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x10001408 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x10001408 RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x10001414 ___CTOR_LIST__=.
+ 0x10001414 __CTOR_LIST__=.
+ 0x10001414 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x10001418 0x4 LONG 0x0
+ 0x1000141c ___DTOR_LIST__=.
+ 0x1000141c __DTOR_LIST__=.
+ 0x1000141c 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x10001420 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x10001424 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x10001424 0x8 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ 0x10003000 _head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ 0x10003014 _head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ 0x10003104 ____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ 0x10003124 _________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab 0x10005000 0x4a00
+ *(.stab)
+ .stab 0x10005000 0x1d94 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UDEB/UP_DLL.o)
+ .stab 0x10006d94 0x2928 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDALARM.o)
+ 0x2934 (size before relaxing)
+ .stab 0x100096bc 0x1bc ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UDEB/ASSHDDLL.o)
+ 0xd74 (size before relaxing)
+
+.stabstr 0x1000a000 0x53400
+ *(.stabstr)
+ .stabstr 0x1000a000 0x532c3 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UDEB/UP_DLL.o)
+ 0x0 (size before relaxing)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UDEB\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/arm4/udeb/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,458 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ (_E32Startup)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TFindFile::TFindFile(RFs &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TFindFile::FindByDir(TDesC16 const &, TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TParseBase::FullName(void) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFile::Open(RFs &, TDesC16 const &, unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFile::Read(TDes8 &, int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFsBase::Close(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFs::Connect(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFile::Size(int &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFile::Read(TDes8 &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RFs::DriveList(TBuf8<26> &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o) (_head___________________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o) (____________________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TLocale::TLocale(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TBufBase16::TBufBase16(TDesC16 const &, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TDes16::AppendNumFixedWidth(unsigned int, TRadix, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TPtr8::TPtr8(unsigned char *, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TLocale::Set(void) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TCurrencySymbol::TCurrencySymbol(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (User::SetCurrencySymbol(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (UserHal::SetXYInputCalibration(TDigitizerCalibration const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (User::Panic(TDesC16 const &, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (User::Alloc(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TPtr8::TPtr8(unsigned char *, int, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (User::Free(void *))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TBufBase8::TBufBase8(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TDesC8::AtC(int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (TDesC16::AtC(int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RProcess::Resume(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (RHandleBase::Close(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o) (_head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o) (_________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (HAL::Get(HALData::TAttribute, int &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o) (HAL::Set(HALData::TAttribute, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o) (_head________________EPOC32_RELEASE_ARM4_UREL_HAL_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o) (_________________EPOC32_RELEASE_ARM4_UREL_HAL_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x00400000 __image_base__=0x400000
+ 0x00000000 __dll__=0x0
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB
+
+.text 0x00401000 0xa00
+ *(.init)
+ *(.text)
+ .text 0x00401000 0xac ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ 0x0040109c atexit
+ 0x00401000 _E32Startup
+ .text 0x004010ac 0x540 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o)
+ 0x00401328 E32Main(void)
+ .text 0x004015ec 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ 0x004015ec TFindFile::TFindFile(RFs &)
+ .text 0x004015f8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ 0x004015f8 TFindFile::FindByDir(TDesC16 const &, TDesC16 const &)
+ .text 0x00401604 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ 0x00401604 TParseBase::FullName(void) const
+ .text 0x00401610 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ 0x00401610 RFile::Open(RFs &, TDesC16 const &, unsigned int)
+ .text 0x0040161c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ 0x0040161c RFile::Read(TDes8 &, int) const
+ .text 0x00401628 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ 0x00401628 RFsBase::Close(void)
+ .text 0x00401634 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ 0x00401634 RFs::Connect(int)
+ .text 0x00401640 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ 0x00401640 RFile::Size(int &) const
+ .text 0x0040164c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ 0x0040164c RFile::Read(TDes8 &) const
+ .text 0x00401658 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ 0x00401658 RFs::DriveList(TBuf8<26> &) const
+ .text 0x00401664 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ 0x00401664 TLocale::TLocale(void)
+ .text 0x00401670 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ 0x00401670 TBufBase16::TBufBase16(TDesC16 const &, int)
+ .text 0x0040167c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ 0x0040167c TDes16::AppendNumFixedWidth(unsigned int, TRadix, int)
+ .text 0x00401688 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x00401688 TDes16::Copy(TDesC16 const &)
+ .text 0x00401694 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ 0x00401694 TPtr8::TPtr8(unsigned char *, int)
+ .text 0x004016a0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ 0x004016a0 TLocale::Set(void) const
+ .text 0x004016ac 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ 0x004016ac TCurrencySymbol::TCurrencySymbol(void)
+ .text 0x004016b8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ 0x004016b8 User::SetCurrencySymbol(TDesC16 const &)
+ .text 0x004016c4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x004016c4 TBufBase16::TBufBase16(int)
+ .text 0x004016d0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ 0x004016d0 UserHal::SetXYInputCalibration(TDigitizerCalibration const &)
+ .text 0x004016dc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ 0x004016dc User::Panic(TDesC16 const &, int)
+ .text 0x004016e8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ 0x004016e8 User::Alloc(int)
+ .text 0x004016f4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ 0x004016f4 TPtr8::TPtr8(unsigned char *, int, int)
+ .text 0x00401700 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ 0x00401700 User::Free(void *)
+ .text 0x0040170c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ 0x0040170c TBufBase8::TBufBase8(int)
+ .text 0x00401718 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ 0x00401718 TDesC8::AtC(int) const
+ .text 0x00401724 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ 0x00401724 TDesC16::AtC(int) const
+ .text 0x00401730 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ 0x00401730 RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .text 0x0040173c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ 0x0040173c RProcess::Resume(void)
+ .text 0x00401748 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ 0x00401748 RHandleBase::Close(void)
+ .text 0x00401754 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ 0x00401754 HAL::Get(HALData::TAttribute, int &)
+ .text 0x00401760 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ 0x00401760 HAL::Set(HALData::TAttribute, int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x0040176c ___CTOR_LIST__=.
+ 0x0040176c __CTOR_LIST__=.
+ 0x0040176c 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x00401770 0x4 LONG 0x0
+ 0x00401774 ___DTOR_LIST__=.
+ 0x00401774 __DTOR_LIST__=.
+ 0x00401774 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x00401778 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x0040177c etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x0040177c 0xe0 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x00402000 0x0
+ 0x00402000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x00402000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x00402000 0x0
+ 0x00402000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x00402000 __bss_end__=.
+
+.edata
+ *(.edata)
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x00402000 0x400
+ SORT(*)(.idata$2)
+ .idata$2 0x00402000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o)
+ 0x00402000 _head___________________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB
+ .idata$2 0x00402014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ 0x00402014 _head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ .idata$2 0x00402028 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o)
+ 0x00402028 _head________________EPOC32_RELEASE_ARM4_UREL_HAL_LIB
+ SORT(*)(.idata$3)
+ .idata$3 0x0040203c 0x20 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ 0x0040205c 0x4 LONG 0x0
+ 0x00402060 0x4 LONG 0x0
+ 0x00402064 0x4 LONG 0x0
+ 0x00402068 0x4 LONG 0x0
+ 0x0040206c 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x00402070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o)
+ .idata$4 0x00402074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ .idata$4 0x00402078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ .idata$4 0x0040207c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ .idata$4 0x00402080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ .idata$4 0x00402084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ .idata$4 0x00402088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ .idata$4 0x0040208c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ .idata$4 0x00402090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ .idata$4 0x00402094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ .idata$4 0x00402098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ .idata$4 0x0040209c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177t.o)
+ .idata$4 0x004020a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$4 0x004020a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ .idata$4 0x004020a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ .idata$4 0x004020ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ .idata$4 0x004020b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ .idata$4 0x004020b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ .idata$4 0x004020b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$4 0x004020bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ .idata$4 0x004020c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ .idata$4 0x004020c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ .idata$4 0x004020c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ .idata$4 0x004020cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ .idata$4 0x004020d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ .idata$4 0x004020d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ .idata$4 0x004020d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ .idata$4 0x004020dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$4 0x004020e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ .idata$4 0x004020e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ .idata$4 0x004020e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ .idata$4 0x004020ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ .idata$4 0x004020f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ .idata$4 0x004020f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ .idata$4 0x004020f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o)
+ .idata$4 0x004020fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ .idata$4 0x00402100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ .idata$4 0x00402104 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x00402108 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o)
+ .idata$5 0x0040210c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ 0x0040210c _imp__Close__7RFsBase
+ 0x0040210c RFsBase::__imp_Close(void)
+ .idata$5 0x00402110 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ 0x00402110 _imp__Connect__3RFsi
+ 0x00402110 RFs::__imp_Connect(int)
+ .idata$5 0x00402114 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ 0x00402114 RFs::__imp_DriveList(TBuf8<26> &) const
+ 0x00402114 _imp__DriveList__C3RFsRt5TBuf81i26
+ .idata$5 0x00402118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ 0x00402118 _imp__FindByDir__9TFindFileRC7TDesC16T1
+ 0x00402118 TFindFile::__imp_FindByDir(TDesC16 const &, TDesC16 const &)
+ .idata$5 0x0040211c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ 0x0040211c _imp__FullName__C10TParseBase
+ 0x0040211c TParseBase::__imp_FullName(void) const
+ .idata$5 0x00402120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ 0x00402120 RFile::__imp_Open(RFs &, TDesC16 const &, unsigned int)
+ 0x00402120 _imp__Open__5RFileR3RFsRC7TDesC16Ui
+ .idata$5 0x00402124 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ 0x00402124 _imp__Read__C5RFileR5TDes8
+ 0x00402124 RFile::__imp_Read(TDes8 &) const
+ .idata$5 0x00402128 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ 0x00402128 _imp__Read__C5RFileR5TDes8i
+ 0x00402128 RFile::__imp_Read(TDes8 &, int) const
+ .idata$5 0x0040212c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ 0x0040212c RFile::__imp_Size(int &) const
+ 0x0040212c _imp__Size__C5RFileRi
+ .idata$5 0x00402130 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ 0x00402130 TFindFile::_imp__(RFs &)
+ 0x00402130 __imp___9TFindFileR3RFs
+ .idata$5 0x00402134 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177t.o)
+ .idata$5 0x00402138 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$5 0x0040213c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ 0x0040213c User::__imp_Alloc(int)
+ 0x0040213c _imp__Alloc__4Useri
+ .idata$5 0x00402140 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ 0x00402140 _imp__AppendNumFixedWidth__6TDes16Ui6TRadixi
+ 0x00402140 TDes16::__imp_AppendNumFixedWidth(unsigned int, TRadix, int)
+ .idata$5 0x00402144 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ 0x00402144 TDesC8::__imp_AtC(int) const
+ 0x00402144 _imp__AtC__C6TDesC8i
+ .idata$5 0x00402148 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ 0x00402148 _imp__AtC__C7TDesC16i
+ 0x00402148 TDesC16::__imp_AtC(int) const
+ .idata$5 0x0040214c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ 0x0040214c RHandleBase::__imp_Close(void)
+ 0x0040214c _imp__Close__11RHandleBase
+ .idata$5 0x00402150 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x00402150 _imp__Copy__6TDes16RC7TDesC16
+ 0x00402150 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x00402154 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ 0x00402154 _imp__Create__8RProcessRC7TDesC16T110TOwnerType
+ 0x00402154 RProcess::__imp_Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .idata$5 0x00402158 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ 0x00402158 _imp__Free__4UserPv
+ 0x00402158 User::__imp_Free(void *)
+ .idata$5 0x0040215c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ 0x0040215c _imp__Panic__4UserRC7TDesC16i
+ 0x0040215c User::__imp_Panic(TDesC16 const &, int)
+ .idata$5 0x00402160 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ 0x00402160 _imp__Resume__8RProcess
+ 0x00402160 RProcess::__imp_Resume(void)
+ .idata$5 0x00402164 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ 0x00402164 _imp__SetCurrencySymbol__4UserRC7TDesC16
+ 0x00402164 User::__imp_SetCurrencySymbol(TDesC16 const &)
+ .idata$5 0x00402168 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ 0x00402168 _imp__SetXYInputCalibration__7UserHalRC21TDigitizerCalibration
+ 0x00402168 UserHal::__imp_SetXYInputCalibration(TDigitizerCalibration const &)
+ .idata$5 0x0040216c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ 0x0040216c _imp__Set__C7TLocale
+ 0x0040216c TLocale::__imp_Set(void) const
+ .idata$5 0x00402170 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ 0x00402170 TBufBase16::_imp__(TDesC16 const &, int)
+ 0x00402170 __imp___10TBufBase16RC7TDesC16i
+ .idata$5 0x00402174 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x00402174 TBufBase16::_imp__(int)
+ 0x00402174 __imp___10TBufBase16i
+ .idata$5 0x00402178 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ 0x00402178 __imp___15TCurrencySymbol
+ 0x00402178 TCurrencySymbol::_imp__(void)
+ .idata$5 0x0040217c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ 0x0040217c TPtr8::_imp__(unsigned char *, int)
+ 0x0040217c __imp___5TPtr8PUci
+ .idata$5 0x00402180 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ 0x00402180 __imp___5TPtr8PUcii
+ 0x00402180 TPtr8::_imp__(unsigned char *, int, int)
+ .idata$5 0x00402184 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ 0x00402184 TLocale::_imp__(void)
+ 0x00402184 __imp___7TLocale
+ .idata$5 0x00402188 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ 0x00402188 __imp___9TBufBase8i
+ 0x00402188 TBufBase8::_imp__(int)
+ .idata$5 0x0040218c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ .idata$5 0x00402190 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o)
+ .idata$5 0x00402194 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ 0x00402194 HAL::__imp_Get(HALData::TAttribute, int &)
+ 0x00402194 _imp__Get__3HALQ27HALData10TAttributeRi
+ .idata$5 0x00402198 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ 0x00402198 _imp__Set__3HALQ27HALData10TAttributei
+ 0x00402198 HAL::__imp_Set(HALData::TAttribute, int)
+ .idata$5 0x0040219c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x004021a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ .idata$7 0x004021a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ .idata$7 0x004021a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ .idata$7 0x004021ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ .idata$7 0x004021b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ .idata$7 0x004021b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ .idata$7 0x004021b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ .idata$7 0x004021bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ .idata$7 0x004021c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ .idata$7 0x004021c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ .idata$7 0x004021c8 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177t.o)
+ 0x004021c8 ____________________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB_iname
+ .idata$7 0x004021dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ .idata$7 0x004021e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ .idata$7 0x004021e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ .idata$7 0x004021e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ .idata$7 0x004021ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ .idata$7 0x004021f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$7 0x004021f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ .idata$7 0x004021f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ .idata$7 0x004021fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ .idata$7 0x00402200 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ .idata$7 0x00402204 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ .idata$7 0x00402208 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ .idata$7 0x0040220c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ .idata$7 0x00402210 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ .idata$7 0x00402214 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$7 0x00402218 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ .idata$7 0x0040221c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ .idata$7 0x00402220 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ .idata$7 0x00402224 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ .idata$7 0x00402228 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ .idata$7 0x0040222c 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ 0x0040222c _________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+ .idata$7 0x00402240 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ .idata$7 0x00402244 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ .idata$7 0x00402248 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301t.o)
+ 0x00402248 _________________EPOC32_RELEASE_ARM4_UREL_HAL_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x00403000 0x0
+ 0x00403000 end=.
+ 0x00403000 _end=.
+ 0x00403000 __end__=.
+
+.reloc 0x00403000 0x200
+ *(.reloc)
+ .reloc 0x00403000 0x60 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab 0x00404000 0x4600
+ *(.stab)
+ .stab 0x00404000 0xe34 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ .stab 0x00404e34 0x3618 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UDEB/ESTART.o)
+ 0x3624 (size before relaxing)
+
+.stabstr 0x00409000 0x34000
+ *(.stabstr)
+ .stabstr 0x00409000 0x33ff2 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/ARM4/UDEB/UC_EXE.o)
+ 0x0 (size before relaxing)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UDEB\E32STRT.EXE epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/arm4/urel/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o) (_head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o) (_________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o) (_head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o) (____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/ARM4/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x10001004 0x318 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ 0x10001048 TASShdAlarm::InternalizeL(RReadStream &)
+ 0x10001264 TASShdAlarm::Reset(void)
+ 0x10001004 TASShdAlarm::TASShdAlarm(void)
+ 0x10001174 TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x1000131c 0x8 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDDLL.o)
+ 0x1000131c E32Dll(TDllReason)
+ .text 0x10001324 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x10001324 TBufBase16::TBufBase16(int)
+ .text 0x10001330 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x10001330 Time::NullTTime(void)
+ .text 0x1000133c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x1000133c TDes16::Copy(TDesC16 const &)
+ .text 0x10001348 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x10001348 RReadStream::ReadUint16L(void)
+ .text 0x10001354 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x10001354 RReadStream::ReadInt8L(void)
+ .text 0x10001360 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x10001360 RReadStream::ReadInt32L(void)
+ .text 0x1000136c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x1000136c InternalizeL(TInt64 &, RReadStream &)
+ .text 0x10001378 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x10001378 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x10001384 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x10001384 RReadStream::ReadInt16L(void)
+ .text 0x10001390 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x10001390 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x1000139c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x1000139c RWriteStream::WriteInt8L(int)
+ .text 0x100013a8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100013a8 RWriteStream::WriteInt32L(long)
+ .text 0x100013b4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x100013b4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x100013c0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x100013c0 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x100013cc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x100013cc RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x100013d8 ___CTOR_LIST__=.
+ 0x100013d8 __CTOR_LIST__=.
+ 0x100013d8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x100013dc 0x4 LONG 0x0
+ 0x100013e0 ___DTOR_LIST__=.
+ 0x100013e0 __DTOR_LIST__=.
+ 0x100013e0 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x100013e4 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x100013e8 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x100013e8 0x8 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/ARM4/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ 0x10003000 _head___________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ 0x10003014 _head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1112t.o)
+ 0x10003104 ____________________EPOC32_RELEASE_ARM4_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ 0x10003124 _________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x28 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\ARM4\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/arm4/urel/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,453 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/ARM4/UREL/UC_EXE.o)
+ (_E32Startup)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TFindFile::TFindFile(RFs &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TFindFile::FindByDir(TDesC16 const &, TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TParseBase::FullName(void) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFile::Open(RFs &, TDesC16 const &, unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFile::Read(TDes8 &, int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFsBase::Close(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFs::Connect(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFile::Size(int &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFile::Read(TDes8 &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RFs::DriveList(TBuf8<26> &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o) (_head___________________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o) (____________________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TLocale::TLocale(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TBufBase16::TBufBase16(TDesC16 const &, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TDes16::AppendNumFixedWidth(unsigned int, TRadix, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TPtr8::TPtr8(unsigned char *, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TLocale::Set(void) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TCurrencySymbol::TCurrencySymbol(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (User::SetCurrencySymbol(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (UserHal::SetXYInputCalibration(TDigitizerCalibration const &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (User::Panic(TDesC16 const &, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (User::Alloc(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TPtr8::TPtr8(unsigned char *, int, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (User::Free(void *))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TBufBase8::TBufBase8(int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TDesC8::AtC(int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (TDesC16::AtC(int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RProcess::Resume(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (RHandleBase::Close(void))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o) (_head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o) (_________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (HAL::Get(HALData::TAttribute, int &))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o) (HAL::Set(HALData::TAttribute, int))
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o) (_head________________EPOC32_RELEASE_ARM4_UREL_HAL_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o) (_________________EPOC32_RELEASE_ARM4_UREL_HAL_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x00400000 __image_base__=0x400000
+ 0x00000000 __dll__=0x0
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EEXE.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB
+
+.text 0x00401000 0x800
+ *(.init)
+ *(.text)
+ .text 0x00401000 0x98 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/ARM4/UREL/UC_EXE.o)
+ 0x00401094 atexit
+ 0x00401000 _E32Startup
+ .text 0x00401098 0x4e0 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o)
+ 0x004012dc E32Main(void)
+ .text 0x00401578 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ 0x00401578 TFindFile::TFindFile(RFs &)
+ .text 0x00401584 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ 0x00401584 TFindFile::FindByDir(TDesC16 const &, TDesC16 const &)
+ .text 0x00401590 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ 0x00401590 TParseBase::FullName(void) const
+ .text 0x0040159c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ 0x0040159c RFile::Open(RFs &, TDesC16 const &, unsigned int)
+ .text 0x004015a8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ 0x004015a8 RFile::Read(TDes8 &, int) const
+ .text 0x004015b4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ 0x004015b4 RFsBase::Close(void)
+ .text 0x004015c0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ 0x004015c0 RFs::Connect(int)
+ .text 0x004015cc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ 0x004015cc RFile::Size(int &) const
+ .text 0x004015d8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ 0x004015d8 RFile::Read(TDes8 &) const
+ .text 0x004015e4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ 0x004015e4 RFs::DriveList(TBuf8<26> &) const
+ .text 0x004015f0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ 0x004015f0 TLocale::TLocale(void)
+ .text 0x004015fc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ 0x004015fc TBufBase16::TBufBase16(TDesC16 const &, int)
+ .text 0x00401608 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ 0x00401608 TDes16::AppendNumFixedWidth(unsigned int, TRadix, int)
+ .text 0x00401614 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x00401614 TDes16::Copy(TDesC16 const &)
+ .text 0x00401620 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ 0x00401620 TPtr8::TPtr8(unsigned char *, int)
+ .text 0x0040162c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ 0x0040162c TLocale::Set(void) const
+ .text 0x00401638 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ 0x00401638 TCurrencySymbol::TCurrencySymbol(void)
+ .text 0x00401644 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ 0x00401644 User::SetCurrencySymbol(TDesC16 const &)
+ .text 0x00401650 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x00401650 TBufBase16::TBufBase16(int)
+ .text 0x0040165c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ 0x0040165c UserHal::SetXYInputCalibration(TDigitizerCalibration const &)
+ .text 0x00401668 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ 0x00401668 User::Panic(TDesC16 const &, int)
+ .text 0x00401674 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ 0x00401674 User::Alloc(int)
+ .text 0x00401680 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ 0x00401680 TPtr8::TPtr8(unsigned char *, int, int)
+ .text 0x0040168c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ 0x0040168c User::Free(void *)
+ .text 0x00401698 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ 0x00401698 TBufBase8::TBufBase8(int)
+ .text 0x004016a4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ 0x004016a4 TDesC8::AtC(int) const
+ .text 0x004016b0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ 0x004016b0 TDesC16::AtC(int) const
+ .text 0x004016bc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ 0x004016bc RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .text 0x004016c8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ 0x004016c8 RProcess::Resume(void)
+ .text 0x004016d4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ 0x004016d4 RHandleBase::Close(void)
+ .text 0x004016e0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ 0x004016e0 HAL::Get(HALData::TAttribute, int &)
+ .text 0x004016ec 0xc ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ 0x004016ec HAL::Set(HALData::TAttribute, int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x004016f8 ___CTOR_LIST__=.
+ 0x004016f8 __CTOR_LIST__=.
+ 0x004016f8 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x004016fc 0x4 LONG 0x0
+ 0x00401700 ___DTOR_LIST__=.
+ 0x00401700 __DTOR_LIST__=.
+ 0x00401700 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x00401704 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x00401708 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x00401708 0xe0 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/ARM4/UREL/ESTART.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x00402000 0x0
+ 0x00402000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x00402000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x00402000 0x0
+ 0x00402000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x00402000 __bss_end__=.
+
+.edata
+ *(.edata)
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x00402000 0x400
+ SORT(*)(.idata$2)
+ .idata$2 0x00402000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o)
+ 0x00402000 _head___________________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB
+ .idata$2 0x00402014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ 0x00402014 _head________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB
+ .idata$2 0x00402028 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o)
+ 0x00402028 _head________________EPOC32_RELEASE_ARM4_UREL_HAL_LIB
+ SORT(*)(.idata$3)
+ .idata$3 0x0040203c 0x20 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/ARM4/UREL/UC_EXE.o)
+ 0x0040205c 0x4 LONG 0x0
+ 0x00402060 0x4 LONG 0x0
+ 0x00402064 0x4 LONG 0x0
+ 0x00402068 0x4 LONG 0x0
+ 0x0040206c 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x00402070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o)
+ .idata$4 0x00402074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ .idata$4 0x00402078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ .idata$4 0x0040207c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ .idata$4 0x00402080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ .idata$4 0x00402084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ .idata$4 0x00402088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ .idata$4 0x0040208c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ .idata$4 0x00402090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ .idata$4 0x00402094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ .idata$4 0x00402098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ .idata$4 0x0040209c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177t.o)
+ .idata$4 0x004020a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$4 0x004020a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ .idata$4 0x004020a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ .idata$4 0x004020ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ .idata$4 0x004020b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ .idata$4 0x004020b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ .idata$4 0x004020b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$4 0x004020bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ .idata$4 0x004020c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ .idata$4 0x004020c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ .idata$4 0x004020c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ .idata$4 0x004020cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ .idata$4 0x004020d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ .idata$4 0x004020d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ .idata$4 0x004020d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ .idata$4 0x004020dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$4 0x004020e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ .idata$4 0x004020e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ .idata$4 0x004020e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ .idata$4 0x004020ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ .idata$4 0x004020f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ .idata$4 0x004020f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ .idata$4 0x004020f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o)
+ .idata$4 0x004020fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ .idata$4 0x00402100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ .idata$4 0x00402104 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x00402108 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177h.o)
+ .idata$5 0x0040210c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ 0x0040210c _imp__Close__7RFsBase
+ 0x0040210c RFsBase::__imp_Close(void)
+ .idata$5 0x00402110 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ 0x00402110 _imp__Connect__3RFsi
+ 0x00402110 RFs::__imp_Connect(int)
+ .idata$5 0x00402114 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ 0x00402114 RFs::__imp_DriveList(TBuf8<26> &) const
+ 0x00402114 _imp__DriveList__C3RFsRt5TBuf81i26
+ .idata$5 0x00402118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ 0x00402118 _imp__FindByDir__9TFindFileRC7TDesC16T1
+ 0x00402118 TFindFile::__imp_FindByDir(TDesC16 const &, TDesC16 const &)
+ .idata$5 0x0040211c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ 0x0040211c _imp__FullName__C10TParseBase
+ 0x0040211c TParseBase::__imp_FullName(void) const
+ .idata$5 0x00402120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ 0x00402120 RFile::__imp_Open(RFs &, TDesC16 const &, unsigned int)
+ 0x00402120 _imp__Open__5RFileR3RFsRC7TDesC16Ui
+ .idata$5 0x00402124 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ 0x00402124 _imp__Read__C5RFileR5TDes8
+ 0x00402124 RFile::__imp_Read(TDes8 &) const
+ .idata$5 0x00402128 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ 0x00402128 _imp__Read__C5RFileR5TDes8i
+ 0x00402128 RFile::__imp_Read(TDes8 &, int) const
+ .idata$5 0x0040212c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ 0x0040212c RFile::__imp_Size(int &) const
+ 0x0040212c _imp__Size__C5RFileRi
+ .idata$5 0x00402130 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ 0x00402130 TFindFile::_imp__(RFs &)
+ 0x00402130 __imp___9TFindFileR3RFs
+ .idata$5 0x00402134 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177t.o)
+ .idata$5 0x00402138 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102h.o)
+ .idata$5 0x0040213c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ 0x0040213c User::__imp_Alloc(int)
+ 0x0040213c _imp__Alloc__4Useri
+ .idata$5 0x00402140 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ 0x00402140 _imp__AppendNumFixedWidth__6TDes16Ui6TRadixi
+ 0x00402140 TDes16::__imp_AppendNumFixedWidth(unsigned int, TRadix, int)
+ .idata$5 0x00402144 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ 0x00402144 TDesC8::__imp_AtC(int) const
+ 0x00402144 _imp__AtC__C6TDesC8i
+ .idata$5 0x00402148 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ 0x00402148 _imp__AtC__C7TDesC16i
+ 0x00402148 TDesC16::__imp_AtC(int) const
+ .idata$5 0x0040214c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ 0x0040214c RHandleBase::__imp_Close(void)
+ 0x0040214c _imp__Close__11RHandleBase
+ .idata$5 0x00402150 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ 0x00402150 _imp__Copy__6TDes16RC7TDesC16
+ 0x00402150 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x00402154 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ 0x00402154 _imp__Create__8RProcessRC7TDesC16T110TOwnerType
+ 0x00402154 RProcess::__imp_Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .idata$5 0x00402158 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ 0x00402158 _imp__Free__4UserPv
+ 0x00402158 User::__imp_Free(void *)
+ .idata$5 0x0040215c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ 0x0040215c _imp__Panic__4UserRC7TDesC16i
+ 0x0040215c User::__imp_Panic(TDesC16 const &, int)
+ .idata$5 0x00402160 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ 0x00402160 _imp__Resume__8RProcess
+ 0x00402160 RProcess::__imp_Resume(void)
+ .idata$5 0x00402164 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ 0x00402164 _imp__SetCurrencySymbol__4UserRC7TDesC16
+ 0x00402164 User::__imp_SetCurrencySymbol(TDesC16 const &)
+ .idata$5 0x00402168 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ 0x00402168 _imp__SetXYInputCalibration__7UserHalRC21TDigitizerCalibration
+ 0x00402168 UserHal::__imp_SetXYInputCalibration(TDigitizerCalibration const &)
+ .idata$5 0x0040216c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ 0x0040216c _imp__Set__C7TLocale
+ 0x0040216c TLocale::__imp_Set(void) const
+ .idata$5 0x00402170 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ 0x00402170 TBufBase16::_imp__(TDesC16 const &, int)
+ 0x00402170 __imp___10TBufBase16RC7TDesC16i
+ .idata$5 0x00402174 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ 0x00402174 TBufBase16::_imp__(int)
+ 0x00402174 __imp___10TBufBase16i
+ .idata$5 0x00402178 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ 0x00402178 __imp___15TCurrencySymbol
+ 0x00402178 TCurrencySymbol::_imp__(void)
+ .idata$5 0x0040217c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ 0x0040217c TPtr8::_imp__(unsigned char *, int)
+ 0x0040217c __imp___5TPtr8PUci
+ .idata$5 0x00402180 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ 0x00402180 __imp___5TPtr8PUcii
+ 0x00402180 TPtr8::_imp__(unsigned char *, int, int)
+ .idata$5 0x00402184 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ 0x00402184 TLocale::_imp__(void)
+ 0x00402184 __imp___7TLocale
+ .idata$5 0x00402188 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ 0x00402188 __imp___9TBufBase8i
+ 0x00402188 TBufBase8::_imp__(int)
+ .idata$5 0x0040218c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ .idata$5 0x00402190 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301h.o)
+ .idata$5 0x00402194 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ 0x00402194 HAL::__imp_Get(HALData::TAttribute, int &)
+ 0x00402194 _imp__Get__3HALQ27HALData10TAttributeRi
+ .idata$5 0x00402198 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ 0x00402198 _imp__Set__3HALQ27HALData10TAttributei
+ 0x00402198 HAL::__imp_Set(HALData::TAttribute, int)
+ .idata$5 0x0040219c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x004021a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00015.o)
+ .idata$7 0x004021a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00018.o)
+ .idata$7 0x004021a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00034.o)
+ .idata$7 0x004021ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00044.o)
+ .idata$7 0x004021b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00051.o)
+ .idata$7 0x004021b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00121.o)
+ .idata$7 0x004021b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00136.o)
+ .idata$7 0x004021bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00138.o)
+ .idata$7 0x004021c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00185.o)
+ .idata$7 0x004021c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177s_00217.o)
+ .idata$7 0x004021c8 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1177t.o)
+ 0x004021c8 ____________________EPOC32_RELEASE_ARM4_UREL_EFSRV_LIB_iname
+ .idata$7 0x004021dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00045.o)
+ .idata$7 0x004021e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00068.o)
+ .idata$7 0x004021e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00098.o)
+ .idata$7 0x004021e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00099.o)
+ .idata$7 0x004021ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00172.o)
+ .idata$7 0x004021f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00251.o)
+ .idata$7 0x004021f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00292.o)
+ .idata$7 0x004021f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00476.o)
+ .idata$7 0x004021fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00809.o)
+ .idata$7 0x00402200 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00953.o)
+ .idata$7 0x00402204 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_00981.o)
+ .idata$7 0x00402208 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01039.o)
+ .idata$7 0x0040220c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01074.o)
+ .idata$7 0x00402210 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01282.o)
+ .idata$7 0x00402214 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01283.o)
+ .idata$7 0x00402218 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01336.o)
+ .idata$7 0x0040221c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01366.o)
+ .idata$7 0x00402220 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01367.o)
+ .idata$7 0x00402224 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01405.o)
+ .idata$7 0x00402228 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102s_01431.o)
+ .idata$7 0x0040222c 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1102t.o)
+ 0x0040222c _________________EPOC32_RELEASE_ARM4_UREL_EUSER_LIB_iname
+ .idata$7 0x00402240 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00001.o)
+ .idata$7 0x00402244 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301s_00002.o)
+ .idata$7 0x00402248 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\ARM4\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1301t.o)
+ 0x00402248 _________________EPOC32_RELEASE_ARM4_UREL_HAL_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x00403000 0x0
+ 0x00403000 end=.
+ 0x00403000 _end=.
+ 0x00403000 __end__=.
+
+.reloc 0x00403000 0x200
+ *(.reloc)
+ .reloc 0x00403000 0x60 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\ARM4\UREL\E32STRT.EXE epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/thumb/udeb/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,301 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/THUMB/UDEB/UP_DLL.o)
+ (_E32Dll)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o) (_head________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o) (_________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o) (_head___________________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o) (____________________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLLSTUB.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/THUMB/UDEB/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x1000100c 0x254 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o)
+ 0x1000104c TASShdAlarm::InternalizeL(RReadStream &)
+ 0x100011d8 TASShdAlarm::Reset(void)
+ 0x1000100c TASShdAlarm::TASShdAlarm(void)
+ 0x1000111c TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x10001260 0x4 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDDLL.o)
+ 0x10001260 E32Dll(TDllReason)
+ .text 0x10001264 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ 0x10001264 TBufBase16::TBufBase16(int)
+ .text 0x10001270 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ 0x10001270 Time::NullTTime(void)
+ .text 0x1000127c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ 0x1000127c TDes16::Copy(TDesC16 const &)
+ .text 0x10001288 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ 0x10001288 RReadStream::ReadUint16L(void)
+ .text 0x10001294 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ 0x10001294 RReadStream::ReadInt8L(void)
+ .text 0x100012a0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ 0x100012a0 RReadStream::ReadInt32L(void)
+ .text 0x100012ac 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ 0x100012ac InternalizeL(TInt64 &, RReadStream &)
+ .text 0x100012b8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ 0x100012b8 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x100012c4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ 0x100012c4 RReadStream::ReadInt16L(void)
+ .text 0x100012d0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ 0x100012d0 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x100012dc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ 0x100012dc RWriteStream::WriteInt8L(int)
+ .text 0x100012e8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ 0x100012e8 RWriteStream::WriteInt32L(long)
+ .text 0x100012f4 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ 0x100012f4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x10001304 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ 0x10001304 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x10001310 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ 0x10001310 RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x1000131c ___CTOR_LIST__=.
+ 0x1000131c __CTOR_LIST__=.
+ 0x1000131c 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x10001320 0x4 LONG 0x0
+ 0x10001324 ___DTOR_LIST__=.
+ 0x10001324 __DTOR_LIST__=.
+ 0x10001324 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x10001328 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x1000132c etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x1000132c 0xc ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o)
+ 0x10003000 _head___________________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ 0x10003014 _head________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968t.o)
+ 0x10003104 ____________________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ 0x10003124 _________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x2c ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab 0x10005000 0x4a00
+ *(.stab)
+ .stab 0x10005000 0x1da0 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/THUMB/UDEB/UP_DLL.o)
+ .stab 0x10006da0 0x29ac ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDALARM.o)
+ 0x29b8 (size before relaxing)
+ .stab 0x1000974c 0x1bc ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UDEB/ASSHDDLL.o)
+ 0xd74 (size before relaxing)
+
+.stabstr 0x1000a000 0x53400
+ *(.stabstr)
+ .stabstr 0x1000a000 0x5335a ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/THUMB/UDEB/UP_DLL.o)
+ 0x0 (size before relaxing)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UDEB\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/thumb/udeb/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,478 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ (_E32Startup)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EPOC/EGCC/THUMB/UDEB/UP_GCC.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o) (_call_via_r0)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TFindFile::TFindFile(RFs &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TFindFile::FindByDir(TDesC16 const &, TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TParseBase::FullName(void) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFile::Open(RFs &, TDesC16 const &, unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFile::Read(TDes8 &, int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFsBase::Close(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFs::Connect(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFile::Size(int &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFile::Read(TDes8 &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RFs::DriveList(TBuf8<26> &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o) (_head___________________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o) (____________________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TLocale::TLocale(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TBufBase16::TBufBase16(TDesC16 const &, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TDes16::AppendNumFixedWidth(unsigned int, TRadix, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TPtr8::TPtr8(unsigned char *, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TLocale::Set(void) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TCurrencySymbol::TCurrencySymbol(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (User::SetCurrencySymbol(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (UserHal::SetXYInputCalibration(TDigitizerCalibration const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (User::Panic(TDesC16 const &, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (User::Alloc(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TPtr8::TPtr8(unsigned char *, int, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (User::Free(void *))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TBufBase8::TBufBase8(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TDesC8::AtC(int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (TDesC16::AtC(int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RProcess::Resume(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (RHandleBase::Close(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o) (_head________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o) (_________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (HAL::Get(HALData::TAttribute, int &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o) (HAL::Set(HALData::TAttribute, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o) (_head________________EPOC32_RELEASE_THUMB_UREL_HAL_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o) (_________________EPOC32_RELEASE_THUMB_UREL_HAL_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x00400000 __image_base__=0x400000
+ 0x00000000 __dll__=0x0
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB
+
+.text 0x00401000 0x800
+ *(.init)
+ *(.text)
+ .text 0x00401000 0x60 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ 0x0040105c atexit
+ 0x00401000 _E32Startup
+ .text 0x00401060 0x438 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o)
+ 0x00401244 E32Main(void)
+ .text 0x00401498 0x38 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EPOC/EGCC/THUMB/UDEB/UP_GCC.o)
+ 0x004014a0 _call_via_r2
+ 0x004014b0 _call_via_r6
+ 0x004014ac _call_via_r5
+ 0x004014a4 _call_via_r3
+ 0x004014c4 _call_via_fp
+ 0x004014b8 _call_via_r8
+ 0x004014b4 _call_via_r7
+ 0x00401498 _call_via_r0
+ 0x004014c0 _call_via_sl
+ 0x004014bc _call_via_r9
+ 0x004014a8 _call_via_r4
+ 0x0040149c _call_via_r1
+ 0x004014c8 _call_via_ip
+ 0x004014cc _call_via_lr
+ .text 0x004014d0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ 0x004014d0 TFindFile::TFindFile(RFs &)
+ .text 0x004014dc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ 0x004014dc TFindFile::FindByDir(TDesC16 const &, TDesC16 const &)
+ .text 0x004014e8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ 0x004014e8 TParseBase::FullName(void) const
+ .text 0x004014f4 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ 0x004014f4 RFile::Open(RFs &, TDesC16 const &, unsigned int)
+ .text 0x00401504 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ 0x00401504 RFile::Read(TDes8 &, int) const
+ .text 0x00401510 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ 0x00401510 RFsBase::Close(void)
+ .text 0x0040151c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ 0x0040151c RFs::Connect(int)
+ .text 0x00401528 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ 0x00401528 RFile::Size(int &) const
+ .text 0x00401534 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ 0x00401534 RFile::Read(TDes8 &) const
+ .text 0x00401540 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ 0x00401540 RFs::DriveList(TBuf8<26> &) const
+ .text 0x0040154c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ 0x0040154c TLocale::TLocale(void)
+ .text 0x00401558 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ 0x00401558 TBufBase16::TBufBase16(TDesC16 const &, int)
+ .text 0x00401564 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ 0x00401564 TDes16::AppendNumFixedWidth(unsigned int, TRadix, int)
+ .text 0x00401574 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ 0x00401574 TDes16::Copy(TDesC16 const &)
+ .text 0x00401580 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ 0x00401580 TPtr8::TPtr8(unsigned char *, int)
+ .text 0x0040158c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ 0x0040158c TLocale::Set(void) const
+ .text 0x00401598 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ 0x00401598 TCurrencySymbol::TCurrencySymbol(void)
+ .text 0x004015a4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ 0x004015a4 User::SetCurrencySymbol(TDesC16 const &)
+ .text 0x004015b0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ 0x004015b0 TBufBase16::TBufBase16(int)
+ .text 0x004015bc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ 0x004015bc UserHal::SetXYInputCalibration(TDigitizerCalibration const &)
+ .text 0x004015c8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ 0x004015c8 User::Panic(TDesC16 const &, int)
+ .text 0x004015d4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ 0x004015d4 User::Alloc(int)
+ .text 0x004015e0 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ 0x004015e0 TPtr8::TPtr8(unsigned char *, int, int)
+ .text 0x004015f0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ 0x004015f0 User::Free(void *)
+ .text 0x004015fc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ 0x004015fc TBufBase8::TBufBase8(int)
+ .text 0x00401608 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ 0x00401608 TDesC8::AtC(int) const
+ .text 0x00401614 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ 0x00401614 TDesC16::AtC(int) const
+ .text 0x00401620 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ 0x00401620 RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .text 0x00401630 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ 0x00401630 RProcess::Resume(void)
+ .text 0x0040163c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ 0x0040163c RHandleBase::Close(void)
+ .text 0x00401648 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ 0x00401648 HAL::Get(HALData::TAttribute, int &)
+ .text 0x00401654 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ 0x00401654 HAL::Set(HALData::TAttribute, int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x00401660 ___CTOR_LIST__=.
+ 0x00401660 __CTOR_LIST__=.
+ 0x00401660 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x00401664 0x4 LONG 0x0
+ 0x00401668 ___DTOR_LIST__=.
+ 0x00401668 __DTOR_LIST__=.
+ 0x00401668 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x0040166c 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x00401670 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x00401670 0x8 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ .rdata 0x00401678 0x108 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x00402000 0x0
+ 0x00402000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x00402000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x00402000 0x0
+ 0x00402000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x00402000 __bss_end__=.
+
+.edata
+ *(.edata)
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x00402000 0x400
+ SORT(*)(.idata$2)
+ .idata$2 0x00402000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o)
+ 0x00402000 _head___________________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB
+ .idata$2 0x00402014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ 0x00402014 _head________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB
+ .idata$2 0x00402028 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o)
+ 0x00402028 _head________________EPOC32_RELEASE_THUMB_UREL_HAL_LIB
+ SORT(*)(.idata$3)
+ .idata$3 0x0040203c 0x20 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ 0x0040205c 0x4 LONG 0x0
+ 0x00402060 0x4 LONG 0x0
+ 0x00402064 0x4 LONG 0x0
+ 0x00402068 0x4 LONG 0x0
+ 0x0040206c 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x00402070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o)
+ .idata$4 0x00402074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ .idata$4 0x00402078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ .idata$4 0x0040207c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ .idata$4 0x00402080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ .idata$4 0x00402084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ .idata$4 0x00402088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ .idata$4 0x0040208c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ .idata$4 0x00402090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ .idata$4 0x00402094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ .idata$4 0x00402098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ .idata$4 0x0040209c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583t.o)
+ .idata$4 0x004020a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$4 0x004020a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ .idata$4 0x004020a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ .idata$4 0x004020ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ .idata$4 0x004020b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ .idata$4 0x004020b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ .idata$4 0x004020b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ .idata$4 0x004020bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ .idata$4 0x004020c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ .idata$4 0x004020c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ .idata$4 0x004020c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ .idata$4 0x004020cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ .idata$4 0x004020d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ .idata$4 0x004020d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ .idata$4 0x004020d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ .idata$4 0x004020dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ .idata$4 0x004020e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ .idata$4 0x004020e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ .idata$4 0x004020e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ .idata$4 0x004020ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ .idata$4 0x004020f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ .idata$4 0x004020f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ .idata$4 0x004020f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o)
+ .idata$4 0x004020fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ .idata$4 0x00402100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ .idata$4 0x00402104 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x00402108 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o)
+ .idata$5 0x0040210c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ 0x0040210c _imp__Close__7RFsBase
+ 0x0040210c RFsBase::__imp_Close(void)
+ .idata$5 0x00402110 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ 0x00402110 _imp__Connect__3RFsi
+ 0x00402110 RFs::__imp_Connect(int)
+ .idata$5 0x00402114 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ 0x00402114 RFs::__imp_DriveList(TBuf8<26> &) const
+ 0x00402114 _imp__DriveList__C3RFsRt5TBuf81i26
+ .idata$5 0x00402118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ 0x00402118 _imp__FindByDir__9TFindFileRC7TDesC16T1
+ 0x00402118 TFindFile::__imp_FindByDir(TDesC16 const &, TDesC16 const &)
+ .idata$5 0x0040211c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ 0x0040211c _imp__FullName__C10TParseBase
+ 0x0040211c TParseBase::__imp_FullName(void) const
+ .idata$5 0x00402120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ 0x00402120 RFile::__imp_Open(RFs &, TDesC16 const &, unsigned int)
+ 0x00402120 _imp__Open__5RFileR3RFsRC7TDesC16Ui
+ .idata$5 0x00402124 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ 0x00402124 _imp__Read__C5RFileR5TDes8
+ 0x00402124 RFile::__imp_Read(TDes8 &) const
+ .idata$5 0x00402128 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ 0x00402128 _imp__Read__C5RFileR5TDes8i
+ 0x00402128 RFile::__imp_Read(TDes8 &, int) const
+ .idata$5 0x0040212c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ 0x0040212c RFile::__imp_Size(int &) const
+ 0x0040212c _imp__Size__C5RFileRi
+ .idata$5 0x00402130 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ 0x00402130 TFindFile::_imp__(RFs &)
+ 0x00402130 __imp___9TFindFileR3RFs
+ .idata$5 0x00402134 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583t.o)
+ .idata$5 0x00402138 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$5 0x0040213c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ 0x0040213c User::__imp_Alloc(int)
+ 0x0040213c _imp__Alloc__4Useri
+ .idata$5 0x00402140 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ 0x00402140 _imp__AppendNumFixedWidth__6TDes16Ui6TRadixi
+ 0x00402140 TDes16::__imp_AppendNumFixedWidth(unsigned int, TRadix, int)
+ .idata$5 0x00402144 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ 0x00402144 TDesC8::__imp_AtC(int) const
+ 0x00402144 _imp__AtC__C6TDesC8i
+ .idata$5 0x00402148 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ 0x00402148 _imp__AtC__C7TDesC16i
+ 0x00402148 TDesC16::__imp_AtC(int) const
+ .idata$5 0x0040214c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ 0x0040214c RHandleBase::__imp_Close(void)
+ 0x0040214c _imp__Close__11RHandleBase
+ .idata$5 0x00402150 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ 0x00402150 _imp__Copy__6TDes16RC7TDesC16
+ 0x00402150 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x00402154 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ 0x00402154 _imp__Create__8RProcessRC7TDesC16T110TOwnerType
+ 0x00402154 RProcess::__imp_Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .idata$5 0x00402158 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ 0x00402158 _imp__Free__4UserPv
+ 0x00402158 User::__imp_Free(void *)
+ .idata$5 0x0040215c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ 0x0040215c _imp__Panic__4UserRC7TDesC16i
+ 0x0040215c User::__imp_Panic(TDesC16 const &, int)
+ .idata$5 0x00402160 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ 0x00402160 _imp__Resume__8RProcess
+ 0x00402160 RProcess::__imp_Resume(void)
+ .idata$5 0x00402164 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ 0x00402164 _imp__SetCurrencySymbol__4UserRC7TDesC16
+ 0x00402164 User::__imp_SetCurrencySymbol(TDesC16 const &)
+ .idata$5 0x00402168 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ 0x00402168 _imp__SetXYInputCalibration__7UserHalRC21TDigitizerCalibration
+ 0x00402168 UserHal::__imp_SetXYInputCalibration(TDigitizerCalibration const &)
+ .idata$5 0x0040216c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ 0x0040216c _imp__Set__C7TLocale
+ 0x0040216c TLocale::__imp_Set(void) const
+ .idata$5 0x00402170 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ 0x00402170 TBufBase16::_imp__(TDesC16 const &, int)
+ 0x00402170 __imp___10TBufBase16RC7TDesC16i
+ .idata$5 0x00402174 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ 0x00402174 TBufBase16::_imp__(int)
+ 0x00402174 __imp___10TBufBase16i
+ .idata$5 0x00402178 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ 0x00402178 __imp___15TCurrencySymbol
+ 0x00402178 TCurrencySymbol::_imp__(void)
+ .idata$5 0x0040217c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ 0x0040217c TPtr8::_imp__(unsigned char *, int)
+ 0x0040217c __imp___5TPtr8PUci
+ .idata$5 0x00402180 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ 0x00402180 __imp___5TPtr8PUcii
+ 0x00402180 TPtr8::_imp__(unsigned char *, int, int)
+ .idata$5 0x00402184 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ 0x00402184 TLocale::_imp__(void)
+ 0x00402184 __imp___7TLocale
+ .idata$5 0x00402188 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ 0x00402188 __imp___9TBufBase8i
+ 0x00402188 TBufBase8::_imp__(int)
+ .idata$5 0x0040218c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ .idata$5 0x00402190 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o)
+ .idata$5 0x00402194 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ 0x00402194 HAL::__imp_Get(HALData::TAttribute, int &)
+ 0x00402194 _imp__Get__3HALQ27HALData10TAttributeRi
+ .idata$5 0x00402198 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ 0x00402198 _imp__Set__3HALQ27HALData10TAttributei
+ 0x00402198 HAL::__imp_Set(HALData::TAttribute, int)
+ .idata$5 0x0040219c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x004021a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ .idata$7 0x004021a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ .idata$7 0x004021a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ .idata$7 0x004021ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ .idata$7 0x004021b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ .idata$7 0x004021b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ .idata$7 0x004021b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ .idata$7 0x004021bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ .idata$7 0x004021c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ .idata$7 0x004021c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ .idata$7 0x004021c8 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583t.o)
+ 0x004021c8 ____________________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB_iname
+ .idata$7 0x004021dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ .idata$7 0x004021e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ .idata$7 0x004021e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ .idata$7 0x004021e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ .idata$7 0x004021ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ .idata$7 0x004021f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ .idata$7 0x004021f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ .idata$7 0x004021f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ .idata$7 0x004021fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ .idata$7 0x00402200 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ .idata$7 0x00402204 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ .idata$7 0x00402208 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ .idata$7 0x0040220c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ .idata$7 0x00402210 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ .idata$7 0x00402214 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ .idata$7 0x00402218 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ .idata$7 0x0040221c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ .idata$7 0x00402220 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ .idata$7 0x00402224 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ .idata$7 0x00402228 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ .idata$7 0x0040222c 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ 0x0040222c _________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname
+ .idata$7 0x00402240 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ .idata$7 0x00402244 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ .idata$7 0x00402248 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643t.o)
+ 0x00402248 _________________EPOC32_RELEASE_THUMB_UREL_HAL_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x00403000 0x0
+ 0x00403000 end=.
+ 0x00403000 _end=.
+ 0x00403000 __end__=.
+
+.reloc 0x00403000 0x200
+ *(.reloc)
+ .reloc 0x00403000 0x78 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab 0x00404000 0x5400
+ *(.stab)
+ .stab 0x00404000 0xe34 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ .stab 0x00404e34 0x369c ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UDEB/ESTART.o)
+ 0x36a8 (size before relaxing)
+ .stab 0x004084d0 0xd38 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EGCC.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EPOC/EGCC/THUMB/UDEB/UP_GCC.o)
+ 0x18f0 (size before relaxing)
+
+.stabstr 0x0040a000 0x47e00
+ *(.stabstr)
+ .stabstr 0x0040a000 0x47d20 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UDEB\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UDEB/UC_EXE.o)
+ 0x0 (size before relaxing)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UDEB\E32STRT.EXE epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/thumb/urel/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/THUMB/UREL/UP_DLL.o)
+ (_E32Dll)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDDLL.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (Time::NullTTime(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o) (_head________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o) (_________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RReadStream::ReadUint16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RReadStream::ReadInt8L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RReadStream::ReadInt32L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (InternalizeL(TInt64 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (InternalizeL(TDes16 &, RReadStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RReadStream::ReadInt16L(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RWriteStream::WriteUint16L(unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RWriteStream::WriteInt8L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RWriteStream::WriteInt32L(long))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (ExternalizeL(TInt64, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (ExternalizeL(TDesC16 const &, RWriteStream &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o) (RWriteStream::WriteInt16L(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o) (_head___________________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o) (____________________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x10000000 __image_base__=0x10000000
+ 0x00000001 __dll__=0x1
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EDLL.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EDLLSTUB.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB
+
+.text 0x10001000 0x400
+ *(.init)
+ *(.text)
+ .text 0x10001000 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EDLL.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EDLL/THUMB/UREL/UP_DLL.o)
+ 0x10001000 _E32Dll
+ .text 0x1000100c 0x254 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o)
+ 0x1000104c TASShdAlarm::InternalizeL(RReadStream &)
+ 0x100011d8 TASShdAlarm::Reset(void)
+ 0x1000100c TASShdAlarm::TASShdAlarm(void)
+ 0x1000111c TASShdAlarm::ExternalizeL(RWriteStream &) const
+ .text 0x10001260 0x4 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDDLL.o)
+ 0x10001260 E32Dll(TDllReason)
+ .text 0x10001264 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ 0x10001264 TBufBase16::TBufBase16(int)
+ .text 0x10001270 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ 0x10001270 Time::NullTTime(void)
+ .text 0x1000127c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ 0x1000127c TDes16::Copy(TDesC16 const &)
+ .text 0x10001288 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ 0x10001288 RReadStream::ReadUint16L(void)
+ .text 0x10001294 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ 0x10001294 RReadStream::ReadInt8L(void)
+ .text 0x100012a0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ 0x100012a0 RReadStream::ReadInt32L(void)
+ .text 0x100012ac 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ 0x100012ac InternalizeL(TInt64 &, RReadStream &)
+ .text 0x100012b8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ 0x100012b8 InternalizeL(TDes16 &, RReadStream &)
+ .text 0x100012c4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ 0x100012c4 RReadStream::ReadInt16L(void)
+ .text 0x100012d0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ 0x100012d0 RWriteStream::WriteUint16L(unsigned int)
+ .text 0x100012dc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ 0x100012dc RWriteStream::WriteInt8L(int)
+ .text 0x100012e8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ 0x100012e8 RWriteStream::WriteInt32L(long)
+ .text 0x100012f4 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ 0x100012f4 ExternalizeL(TInt64, RWriteStream &)
+ .text 0x10001304 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ 0x10001304 ExternalizeL(TDesC16 const &, RWriteStream &)
+ .text 0x10001310 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ 0x10001310 RWriteStream::WriteInt16L(int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x1000131c ___CTOR_LIST__=.
+ 0x1000131c __CTOR_LIST__=.
+ 0x1000131c 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x10001320 0x4 LONG 0x0
+ 0x10001324 ___DTOR_LIST__=.
+ 0x10001324 __DTOR_LIST__=.
+ 0x10001324 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x10001328 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x1000132c etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x1000132c 0xc ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.in(../../../../../../EPOC32/BUILD/SRC/COMMON/GENERIC/APP-SERVICES/ALARMSERVER/GROUP/ALARMSHARED/THUMB/UREL/ASSHDALARM.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x10002000 0x0
+ 0x10002000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x10002000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x10002000 0x0
+ 0x10002000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x10002000 __bss_end__=.
+
+.edata 0x10002000 0x200
+ *(.edata)
+ .edata 0x10002000 0x60 ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.exp
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x10003000 0x200
+ SORT(*)(.idata$2)
+ .idata$2 0x10003000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o)
+ 0x10003000 _head___________________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB
+ .idata$2 0x10003014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ 0x10003014 _head________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB
+ SORT(*)(.idata$3)
+ 0x10003028 0x4 LONG 0x0
+ 0x1000302c 0x4 LONG 0x0
+ 0x10003030 0x4 LONG 0x0
+ 0x10003034 0x4 LONG 0x0
+ 0x10003038 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x1000303c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o)
+ .idata$4 0x10003040 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ .idata$4 0x10003044 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ .idata$4 0x10003048 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ .idata$4 0x1000304c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ .idata$4 0x10003050 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ .idata$4 0x10003054 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ .idata$4 0x10003058 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ .idata$4 0x1000305c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ .idata$4 0x10003060 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ .idata$4 0x10003064 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ .idata$4 0x10003068 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ .idata$4 0x1000306c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ .idata$4 0x10003070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968t.o)
+ .idata$4 0x10003074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$4 0x10003078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ .idata$4 0x1000307c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ .idata$4 0x10003080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ .idata$4 0x10003084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x10003088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968h.o)
+ .idata$5 0x1000308c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ 0x1000308c _imp__ExternalizeL__FG6TInt64R12RWriteStream
+ 0x1000308c __imp_ExternalizeL(TInt64, RWriteStream &)
+ .idata$5 0x10003090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ 0x10003090 _imp__ExternalizeL__FRC7TDesC16R12RWriteStream
+ 0x10003090 __imp_ExternalizeL(TDesC16 const &, RWriteStream &)
+ .idata$5 0x10003094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ 0x10003094 _imp__InternalizeL__FR6TDes16R11RReadStream
+ 0x10003094 __imp_InternalizeL(TDes16 &, RReadStream &)
+ .idata$5 0x10003098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ 0x10003098 __imp_InternalizeL(TInt64 &, RReadStream &)
+ 0x10003098 _imp__InternalizeL__FR6TInt64R11RReadStream
+ .idata$5 0x1000309c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ 0x1000309c _imp__ReadInt16L__11RReadStream
+ 0x1000309c RReadStream::__imp_ReadInt16L(void)
+ .idata$5 0x100030a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ 0x100030a0 _imp__ReadInt32L__11RReadStream
+ 0x100030a0 RReadStream::__imp_ReadInt32L(void)
+ .idata$5 0x100030a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ 0x100030a4 _imp__ReadInt8L__11RReadStream
+ 0x100030a4 RReadStream::__imp_ReadInt8L(void)
+ .idata$5 0x100030a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ 0x100030a8 _imp__ReadUint16L__11RReadStream
+ 0x100030a8 RReadStream::__imp_ReadUint16L(void)
+ .idata$5 0x100030ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ 0x100030ac _imp__WriteInt16L__12RWriteStreami
+ 0x100030ac RWriteStream::__imp_WriteInt16L(int)
+ .idata$5 0x100030b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ 0x100030b0 _imp__WriteInt32L__12RWriteStreaml
+ 0x100030b0 RWriteStream::__imp_WriteInt32L(long)
+ .idata$5 0x100030b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ 0x100030b4 _imp__WriteInt8L__12RWriteStreami
+ 0x100030b4 RWriteStream::__imp_WriteInt8L(int)
+ .idata$5 0x100030b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ 0x100030b8 _imp__WriteUint16L__12RWriteStreamUi
+ 0x100030b8 RWriteStream::__imp_WriteUint16L(unsigned int)
+ .idata$5 0x100030bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968t.o)
+ .idata$5 0x100030c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$5 0x100030c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ 0x100030c4 _imp__Copy__6TDes16RC7TDesC16
+ 0x100030c4 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x100030c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ 0x100030c8 _imp__NullTTime__4Time
+ 0x100030c8 Time::__imp_NullTTime(void)
+ .idata$5 0x100030cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ 0x100030cc TBufBase16::_imp__(int)
+ 0x100030cc __imp___10TBufBase16i
+ .idata$5 0x100030d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x100030d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00190.o)
+ .idata$7 0x100030d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00195.o)
+ .idata$7 0x100030dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00251.o)
+ .idata$7 0x100030e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00252.o)
+ .idata$7 0x100030e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00348.o)
+ .idata$7 0x100030e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00349.o)
+ .idata$7 0x100030ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00350.o)
+ .idata$7 0x100030f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00366.o)
+ .idata$7 0x100030f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00442.o)
+ .idata$7 0x100030f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00443.o)
+ .idata$7 0x100030fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00444.o)
+ .idata$7 0x10003100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968s_00460.o)
+ .idata$7 0x10003104 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\ESTOR.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1968t.o)
+ 0x10003104 ____________________EPOC32_RELEASE_THUMB_UREL_ESTOR_LIB_iname
+ .idata$7 0x10003118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ .idata$7 0x1000311c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00769.o)
+ .idata$7 0x10003120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ .idata$7 0x10003124 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ 0x10003124 _________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x10004000 0x0
+ 0x10004000 end=.
+ 0x10004000 _end=.
+ 0x10004000 __end__=.
+
+.reloc 0x10004000 0x200
+ *(.reloc)
+ .reloc 0x10004000 0x2c ..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\COMMON\GENERIC\APP-SERVICES\ALARMSERVER\GROUP\ALARMSHARED\THUMB\UREL\ALARMSHARED.DLL epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/thumb/urel/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,471 @@
+Archive member included because of file (symbol)
+
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o)
+ (_E32Startup)
+..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o)
+ (--whole-archive)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EGCC.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EPOC/EGCC/THUMB/UREL/UP_GCC.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o) (_call_via_r0)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TFindFile::TFindFile(RFs &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TFindFile::FindByDir(TDesC16 const &, TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TParseBase::FullName(void) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFile::Open(RFs &, TDesC16 const &, unsigned int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFile::Read(TDes8 &, int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFsBase::Close(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFs::Connect(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFile::Size(int &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFile::Read(TDes8 &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RFs::DriveList(TBuf8<26> &) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o) (_head___________________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o) (____________________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TLocale::TLocale(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TBufBase16::TBufBase16(TDesC16 const &, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TDes16::AppendNumFixedWidth(unsigned int, TRadix, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TDes16::Copy(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TPtr8::TPtr8(unsigned char *, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TLocale::Set(void) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TCurrencySymbol::TCurrencySymbol(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (User::SetCurrencySymbol(TDesC16 const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TBufBase16::TBufBase16(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (UserHal::SetXYInputCalibration(TDigitizerCalibration const &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (User::Panic(TDesC16 const &, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (User::Alloc(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TPtr8::TPtr8(unsigned char *, int, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (User::Free(void *))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TBufBase8::TBufBase8(int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TDesC8::AtC(int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (TDesC16::AtC(int) const)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RProcess::Resume(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (RHandleBase::Close(void))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o) (_head________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o) (_________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (HAL::Get(HALData::TAttribute, int &))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o) (HAL::Set(HALData::TAttribute, int))
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o) (_head________________EPOC32_RELEASE_THUMB_UREL_HAL_LIB)
+..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643t.o)
+ ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o) (_________________EPOC32_RELEASE_THUMB_UREL_HAL_LIB_iname)
+
+Memory Configuration
+
+Name Origin Length Attributes
+*default* 0x00000000 0xffffffff
+
+Linker script and memory map
+
+ 0x00400000 __image_base__=0x400000
+ 0x00000000 __dll__=0x0
+ 0x00001000 __section_alignment__=0x1000
+ 0x00000200 __file_alignment__=0x200
+ 0x00000004 __major_os_version__=0x4
+ 0x00000000 __minor_os_version__=0x0
+ 0x00000001 __major_image_version__=0x1
+ 0x00000000 __minor_image_version__=0x0
+ 0x00000004 __major_subsystem_version__=0x4
+ 0x00000000 __minor_subsystem_version__=0x0
+ 0x00000003 __subsystem__=0x3
+ 0x02000000 __size_of_stack_reserve__=0x2000000
+ 0x00001000 __size_of_stack_commit__=0x1000
+ 0x00100000 __size_of_heap_reserve__=0x100000
+ 0x00001000 __size_of_heap_commit__=0x1000
+ 0x00000000 __loader_flags__=0x0
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.exp
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB
+LOAD ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EGCC.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB
+LOAD ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB
+
+.text 0x00401000 0x800
+ *(.init)
+ *(.text)
+ .text 0x00401000 0x60 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o)
+ 0x0040105c atexit
+ 0x00401000 _E32Startup
+ .text 0x00401060 0x438 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o)
+ 0x00401244 E32Main(void)
+ .text 0x00401498 0x38 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EGCC.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EPOC/EGCC/THUMB/UREL/UP_GCC.o)
+ 0x004014a0 _call_via_r2
+ 0x004014b0 _call_via_r6
+ 0x004014ac _call_via_r5
+ 0x004014a4 _call_via_r3
+ 0x004014c4 _call_via_fp
+ 0x004014b8 _call_via_r8
+ 0x004014b4 _call_via_r7
+ 0x00401498 _call_via_r0
+ 0x004014c0 _call_via_sl
+ 0x004014bc _call_via_r9
+ 0x004014a8 _call_via_r4
+ 0x0040149c _call_via_r1
+ 0x004014c8 _call_via_ip
+ 0x004014cc _call_via_lr
+ .text 0x004014d0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ 0x004014d0 TFindFile::TFindFile(RFs &)
+ .text 0x004014dc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ 0x004014dc TFindFile::FindByDir(TDesC16 const &, TDesC16 const &)
+ .text 0x004014e8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ 0x004014e8 TParseBase::FullName(void) const
+ .text 0x004014f4 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ 0x004014f4 RFile::Open(RFs &, TDesC16 const &, unsigned int)
+ .text 0x00401504 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ 0x00401504 RFile::Read(TDes8 &, int) const
+ .text 0x00401510 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ 0x00401510 RFsBase::Close(void)
+ .text 0x0040151c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ 0x0040151c RFs::Connect(int)
+ .text 0x00401528 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ 0x00401528 RFile::Size(int &) const
+ .text 0x00401534 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ 0x00401534 RFile::Read(TDes8 &) const
+ .text 0x00401540 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ 0x00401540 RFs::DriveList(TBuf8<26> &) const
+ .text 0x0040154c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ 0x0040154c TLocale::TLocale(void)
+ .text 0x00401558 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ 0x00401558 TBufBase16::TBufBase16(TDesC16 const &, int)
+ .text 0x00401564 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ 0x00401564 TDes16::AppendNumFixedWidth(unsigned int, TRadix, int)
+ .text 0x00401574 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ 0x00401574 TDes16::Copy(TDesC16 const &)
+ .text 0x00401580 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ 0x00401580 TPtr8::TPtr8(unsigned char *, int)
+ .text 0x0040158c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ 0x0040158c TLocale::Set(void) const
+ .text 0x00401598 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ 0x00401598 TCurrencySymbol::TCurrencySymbol(void)
+ .text 0x004015a4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ 0x004015a4 User::SetCurrencySymbol(TDesC16 const &)
+ .text 0x004015b0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ 0x004015b0 TBufBase16::TBufBase16(int)
+ .text 0x004015bc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ 0x004015bc UserHal::SetXYInputCalibration(TDigitizerCalibration const &)
+ .text 0x004015c8 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ 0x004015c8 User::Panic(TDesC16 const &, int)
+ .text 0x004015d4 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ 0x004015d4 User::Alloc(int)
+ .text 0x004015e0 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ 0x004015e0 TPtr8::TPtr8(unsigned char *, int, int)
+ .text 0x004015f0 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ 0x004015f0 User::Free(void *)
+ .text 0x004015fc 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ 0x004015fc TBufBase8::TBufBase8(int)
+ .text 0x00401608 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ 0x00401608 TDesC8::AtC(int) const
+ .text 0x00401614 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ 0x00401614 TDesC16::AtC(int) const
+ .text 0x00401620 0x10 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ 0x00401620 RProcess::Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .text 0x00401630 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ 0x00401630 RProcess::Resume(void)
+ .text 0x0040163c 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ 0x0040163c RHandleBase::Close(void)
+ .text 0x00401648 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ 0x00401648 HAL::Get(HALData::TAttribute, int &)
+ .text 0x00401654 0xc ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ 0x00401654 HAL::Set(HALData::TAttribute, int)
+ *(SORT(.text$*))
+ *(.glue_7t)
+ *(.glue_7)
+ 0x00401660 ___CTOR_LIST__=.
+ 0x00401660 __CTOR_LIST__=.
+ 0x00401660 0x4 LONG 0xffffffff
+ *(.ctors)
+ *(.ctor)
+ 0x00401664 0x4 LONG 0x0
+ 0x00401668 ___DTOR_LIST__=.
+ 0x00401668 __DTOR_LIST__=.
+ 0x00401668 0x4 LONG 0xffffffff
+ *(.dtors)
+ *(.dtor)
+ 0x0040166c 0x4 LONG 0x0
+ *(.fini)
+ *(.gcc_exc)
+ 0x00401670 etext=.
+ *(.gcc_except_table)
+ *(.rdata)
+ .rdata 0x00401670 0x8 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o)
+ .rdata 0x00401678 0x108 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.in(../../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/F32/GROUP/ESTART/THUMB/UREL/ESTART.o)
+ *(SORT(.rdata$*))
+ *(.eh_frame)
+
+.data 0x00402000 0x0
+ 0x00402000 __data_start__=.
+ *(.data)
+ *(.data2)
+ *(SORT(.data$*))
+ 0x00402000 __data_end__=.
+ *(.data_cygwin_nocopy)
+
+.bss 0x00402000 0x0
+ 0x00402000 __bss_start__=.
+ *(.bss)
+ *(COMMON)
+ 0x00402000 __bss_end__=.
+
+.edata
+ *(.edata)
+
+/DISCARD/
+ *(.debug$S)
+ *(.debug$T)
+ *(.debug$F)
+ *(.drectve)
+
+.idata 0x00402000 0x400
+ SORT(*)(.idata$2)
+ .idata$2 0x00402000 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o)
+ 0x00402000 _head___________________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB
+ .idata$2 0x00402014 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ 0x00402014 _head________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB
+ .idata$2 0x00402028 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o)
+ 0x00402028 _head________________EPOC32_RELEASE_THUMB_UREL_HAL_LIB
+ SORT(*)(.idata$3)
+ .idata$3 0x0040203c 0x20 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EEXE.LIB(../../../../../EPOC32/BUILD/SRC/BEECH/GENERIC/BASE/E32/EUSER/EEXE/THUMB/UREL/UC_EXE.o)
+ 0x0040205c 0x4 LONG 0x0
+ 0x00402060 0x4 LONG 0x0
+ 0x00402064 0x4 LONG 0x0
+ 0x00402068 0x4 LONG 0x0
+ 0x0040206c 0x4 LONG 0x0
+ SORT(*)(.idata$4)
+ .idata$4 0x00402070 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o)
+ .idata$4 0x00402074 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ .idata$4 0x00402078 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ .idata$4 0x0040207c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ .idata$4 0x00402080 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ .idata$4 0x00402084 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ .idata$4 0x00402088 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ .idata$4 0x0040208c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ .idata$4 0x00402090 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ .idata$4 0x00402094 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ .idata$4 0x00402098 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ .idata$4 0x0040209c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583t.o)
+ .idata$4 0x004020a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$4 0x004020a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ .idata$4 0x004020a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ .idata$4 0x004020ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ .idata$4 0x004020b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ .idata$4 0x004020b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ .idata$4 0x004020b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ .idata$4 0x004020bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ .idata$4 0x004020c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ .idata$4 0x004020c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ .idata$4 0x004020c8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ .idata$4 0x004020cc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ .idata$4 0x004020d0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ .idata$4 0x004020d4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ .idata$4 0x004020d8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ .idata$4 0x004020dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ .idata$4 0x004020e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ .idata$4 0x004020e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ .idata$4 0x004020e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ .idata$4 0x004020ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ .idata$4 0x004020f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ .idata$4 0x004020f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ .idata$4 0x004020f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o)
+ .idata$4 0x004020fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ .idata$4 0x00402100 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ .idata$4 0x00402104 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643t.o)
+ SORT(*)(.idata$5)
+ .idata$5 0x00402108 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583h.o)
+ .idata$5 0x0040210c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ 0x0040210c _imp__Close__7RFsBase
+ 0x0040210c RFsBase::__imp_Close(void)
+ .idata$5 0x00402110 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ 0x00402110 _imp__Connect__3RFsi
+ 0x00402110 RFs::__imp_Connect(int)
+ .idata$5 0x00402114 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ 0x00402114 RFs::__imp_DriveList(TBuf8<26> &) const
+ 0x00402114 _imp__DriveList__C3RFsRt5TBuf81i26
+ .idata$5 0x00402118 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ 0x00402118 _imp__FindByDir__9TFindFileRC7TDesC16T1
+ 0x00402118 TFindFile::__imp_FindByDir(TDesC16 const &, TDesC16 const &)
+ .idata$5 0x0040211c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ 0x0040211c _imp__FullName__C10TParseBase
+ 0x0040211c TParseBase::__imp_FullName(void) const
+ .idata$5 0x00402120 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ 0x00402120 RFile::__imp_Open(RFs &, TDesC16 const &, unsigned int)
+ 0x00402120 _imp__Open__5RFileR3RFsRC7TDesC16Ui
+ .idata$5 0x00402124 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ 0x00402124 _imp__Read__C5RFileR5TDes8
+ 0x00402124 RFile::__imp_Read(TDes8 &) const
+ .idata$5 0x00402128 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ 0x00402128 _imp__Read__C5RFileR5TDes8i
+ 0x00402128 RFile::__imp_Read(TDes8 &, int) const
+ .idata$5 0x0040212c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ 0x0040212c RFile::__imp_Size(int &) const
+ 0x0040212c _imp__Size__C5RFileRi
+ .idata$5 0x00402130 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ 0x00402130 TFindFile::_imp__(RFs &)
+ 0x00402130 __imp___9TFindFileR3RFs
+ .idata$5 0x00402134 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583t.o)
+ .idata$5 0x00402138 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559h.o)
+ .idata$5 0x0040213c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ 0x0040213c User::__imp_Alloc(int)
+ 0x0040213c _imp__Alloc__4Useri
+ .idata$5 0x00402140 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ 0x00402140 _imp__AppendNumFixedWidth__6TDes16Ui6TRadixi
+ 0x00402140 TDes16::__imp_AppendNumFixedWidth(unsigned int, TRadix, int)
+ .idata$5 0x00402144 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ 0x00402144 TDesC8::__imp_AtC(int) const
+ 0x00402144 _imp__AtC__C6TDesC8i
+ .idata$5 0x00402148 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ 0x00402148 _imp__AtC__C7TDesC16i
+ 0x00402148 TDesC16::__imp_AtC(int) const
+ .idata$5 0x0040214c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ 0x0040214c RHandleBase::__imp_Close(void)
+ 0x0040214c _imp__Close__11RHandleBase
+ .idata$5 0x00402150 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ 0x00402150 _imp__Copy__6TDes16RC7TDesC16
+ 0x00402150 TDes16::__imp_Copy(TDesC16 const &)
+ .idata$5 0x00402154 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ 0x00402154 _imp__Create__8RProcessRC7TDesC16T110TOwnerType
+ 0x00402154 RProcess::__imp_Create(TDesC16 const &, TDesC16 const &, TOwnerType)
+ .idata$5 0x00402158 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ 0x00402158 _imp__Free__4UserPv
+ 0x00402158 User::__imp_Free(void *)
+ .idata$5 0x0040215c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ 0x0040215c _imp__Panic__4UserRC7TDesC16i
+ 0x0040215c User::__imp_Panic(TDesC16 const &, int)
+ .idata$5 0x00402160 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ 0x00402160 _imp__Resume__8RProcess
+ 0x00402160 RProcess::__imp_Resume(void)
+ .idata$5 0x00402164 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ 0x00402164 _imp__SetCurrencySymbol__4UserRC7TDesC16
+ 0x00402164 User::__imp_SetCurrencySymbol(TDesC16 const &)
+ .idata$5 0x00402168 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ 0x00402168 _imp__SetXYInputCalibration__7UserHalRC21TDigitizerCalibration
+ 0x00402168 UserHal::__imp_SetXYInputCalibration(TDigitizerCalibration const &)
+ .idata$5 0x0040216c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ 0x0040216c _imp__Set__C7TLocale
+ 0x0040216c TLocale::__imp_Set(void) const
+ .idata$5 0x00402170 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ 0x00402170 TBufBase16::_imp__(TDesC16 const &, int)
+ 0x00402170 __imp___10TBufBase16RC7TDesC16i
+ .idata$5 0x00402174 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ 0x00402174 TBufBase16::_imp__(int)
+ 0x00402174 __imp___10TBufBase16i
+ .idata$5 0x00402178 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ 0x00402178 __imp___15TCurrencySymbol
+ 0x00402178 TCurrencySymbol::_imp__(void)
+ .idata$5 0x0040217c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ 0x0040217c TPtr8::_imp__(unsigned char *, int)
+ 0x0040217c __imp___5TPtr8PUci
+ .idata$5 0x00402180 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ 0x00402180 __imp___5TPtr8PUcii
+ 0x00402180 TPtr8::_imp__(unsigned char *, int, int)
+ .idata$5 0x00402184 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ 0x00402184 TLocale::_imp__(void)
+ 0x00402184 __imp___7TLocale
+ .idata$5 0x00402188 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ 0x00402188 __imp___9TBufBase8i
+ 0x00402188 TBufBase8::_imp__(int)
+ .idata$5 0x0040218c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ .idata$5 0x00402190 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643h.o)
+ .idata$5 0x00402194 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ 0x00402194 HAL::__imp_Get(HALData::TAttribute, int &)
+ 0x00402194 _imp__Get__3HALQ27HALData10TAttributeRi
+ .idata$5 0x00402198 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ 0x00402198 _imp__Set__3HALQ27HALData10TAttributei
+ 0x00402198 HAL::__imp_Set(HALData::TAttribute, int)
+ .idata$5 0x0040219c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643t.o)
+ SORT(*)(.idata$6)
+ SORT(*)(.idata$7)
+ .idata$7 0x004021a0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00015.o)
+ .idata$7 0x004021a4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00018.o)
+ .idata$7 0x004021a8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00034.o)
+ .idata$7 0x004021ac 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00044.o)
+ .idata$7 0x004021b0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00051.o)
+ .idata$7 0x004021b4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00121.o)
+ .idata$7 0x004021b8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00136.o)
+ .idata$7 0x004021bc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00138.o)
+ .idata$7 0x004021c0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00185.o)
+ .idata$7 0x004021c4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583s_00217.o)
+ .idata$7 0x004021c8 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EFSRV.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1583t.o)
+ 0x004021c8 ____________________EPOC32_RELEASE_THUMB_UREL_EFSRV_LIB_iname
+ .idata$7 0x004021dc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00045.o)
+ .idata$7 0x004021e0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00068.o)
+ .idata$7 0x004021e4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00098.o)
+ .idata$7 0x004021e8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00099.o)
+ .idata$7 0x004021ec 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00172.o)
+ .idata$7 0x004021f0 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00251.o)
+ .idata$7 0x004021f4 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00292.o)
+ .idata$7 0x004021f8 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00476.o)
+ .idata$7 0x004021fc 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00809.o)
+ .idata$7 0x00402200 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00953.o)
+ .idata$7 0x00402204 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_00981.o)
+ .idata$7 0x00402208 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01039.o)
+ .idata$7 0x0040220c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01074.o)
+ .idata$7 0x00402210 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01282.o)
+ .idata$7 0x00402214 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01283.o)
+ .idata$7 0x00402218 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01336.o)
+ .idata$7 0x0040221c 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01366.o)
+ .idata$7 0x00402220 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01367.o)
+ .idata$7 0x00402224 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01405.o)
+ .idata$7 0x00402228 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559s_01431.o)
+ .idata$7 0x0040222c 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\EUSER.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1559t.o)
+ 0x0040222c _________________EPOC32_RELEASE_THUMB_UREL_EUSER_LIB_iname
+ .idata$7 0x00402240 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00001.o)
+ .idata$7 0x00402244 0x4 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643s_00002.o)
+ .idata$7 0x00402248 0x14 ..\..\..\..\..\..\EPOC32\RELEASE\THUMB\UREL\HAL.LIB(C:/DOCUME~1/SIBUIL~1/LOCALS~1/Temp/d1643t.o)
+ 0x00402248 _________________EPOC32_RELEASE_THUMB_UREL_HAL_LIB_iname
+
+.CRT
+ *(SORT(.CRT$*))
+
+.endjunk 0x00403000 0x0
+ 0x00403000 end=.
+ 0x00403000 _end=.
+ 0x00403000 __end__=.
+
+.reloc 0x00403000 0x200
+ *(.reloc)
+ .reloc 0x00403000 0x78 ..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.exp
+
+.rsrc
+ *(.rsrc)
+ *(SORT(.rsrc$*))
+
+.stab
+ *(.stab)
+
+.stabstr
+ *(.stabstr)
+OUTPUT(..\..\..\..\..\..\EPOC32\BUILD\SRC\BEECH\GENERIC\BASE\F32\GROUP\ESTART\THUMB\UREL\E32STRT.EXE epoc-pei-arm-little)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/winscw/urel/ALARMSHARED.DLL.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,145 @@
+Address Size Name Subname Module
+
+40701000 0000003d .text ASSHDALARM.o(??0TASShdAlarm@@QAE@XZ)
+4070103d 00000107 .text ASSHDALARM.o(?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z)
+40701144 000000dc .text ASSHDALARM.o(?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z)
+40701220 000000a2 .text ASSHDALARM.o(?Reset@TASShdAlarm@@QAEXXZ)
+407012c2 00000003 .text ASSHDDLL.o(?E32Dll@@YAHW4TDllReason@@@Z)
+407012c6 00000006 .text EUSER.dll(??0TBufBase16@@IAE@H@Z)
+407012cc 00000006 .text ESTOR.dll(?ReadUint16L@RReadStream@@QAEGXZ)
+407012d2 00000006 .text ESTOR.dll(?ReadInt8L@RReadStream@@QAECXZ)
+407012d8 00000006 .text ESTOR.dll(?ReadInt32L@RReadStream@@QAEJXZ)
+407012de 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+407012e4 00000006 .text ESTOR.dll(?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+407012ea 00000006 .text ESTOR.dll(?ReadInt16L@RReadStream@@QAEFXZ)
+407012f0 00000006 .text ESTOR.dll(?WriteUint16L@RWriteStream@@QAEXI@Z)
+407012f6 00000006 .text ESTOR.dll(?WriteInt8L@RWriteStream@@QAEXH@Z)
+407012fc 00000006 .text ESTOR.dll(?WriteInt32L@RWriteStream@@QAEXJ@Z)
+40701302 00000006 .text ESTOR.dll(?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+40701308 00000006 .text ESTOR.dll(?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+4070130e 00000006 .text ESTOR.dll(?WriteInt16L@RWriteStream@@QAEXH@Z)
+40701314 00000006 .text EUSER.dll(?NullTTime@Time@@SA?AVTTime@@XZ)
+4070131a 00000006 .text EUSER.dll(?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+40701320 00000020 .text UP_DLL.obj(?initTable@@YAXPAP6AXXZ0@Z)
+40701340 000000a7 .text UP_DLL.obj(?_E32Dll@@YGHPAXI0@Z)
+407013e8 00000006 .text EUSER.dll(?__WireKernel@UpWins@@SAXXZ)
+40702000 0000001c .data ASSHDALARM.o
+40702020 00000018 .data ASSHDDLL.o
+40702038 00000018 .data uid.o
+40702050 00000018 .data UP_DLL.obj
+40702068 00000010 .data UP_DLL.obj
+40703000 0000000c .E32_UID uid.o
+40704000 00000014 .idata $2 ESTOR.dll
+40704014 00000014 .idata $2 EUSER.dll
+40704028 00000014 .idata $3 EUSER.dll
+4070403c 00000004 .idata $4 ESTOR.dll
+40704040 00000004 .idata $4 ESTOR.dll
+40704044 00000004 .idata $4 ESTOR.dll
+40704048 00000004 .idata $4 ESTOR.dll
+4070404c 00000004 .idata $4 ESTOR.dll
+40704050 00000004 .idata $4 ESTOR.dll
+40704054 00000004 .idata $4 ESTOR.dll
+40704058 00000004 .idata $4 ESTOR.dll
+4070405c 00000004 .idata $4 ESTOR.dll
+40704060 00000004 .idata $4 ESTOR.dll
+40704064 00000004 .idata $4 ESTOR.dll
+40704068 00000004 .idata $4 ESTOR.dll
+4070406c 00000004 .idata $4 ESTOR.dll
+40704070 00000004 .idata $4 EUSER.dll
+40704074 00000004 .idata $4 EUSER.dll
+40704078 00000004 .idata $4 EUSER.dll
+4070407c 00000004 .idata $4 EUSER.dll
+40704080 00000004 .idata $4 EUSER.dll
+40704084 00000004 .idata $5 ESTOR.dll(__imp_?ReadUint16L@RReadStream@@QAEGXZ)
+40704088 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt8L@RReadStream@@QAECXZ)
+4070408c 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt32L@RReadStream@@QAEJXZ)
+40704090 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z)
+40704094 00000004 .idata $5 ESTOR.dll(__imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z)
+40704098 00000004 .idata $5 ESTOR.dll(__imp_?ReadInt16L@RReadStream@@QAEFXZ)
+4070409c 00000004 .idata $5 ESTOR.dll(__imp_?WriteUint16L@RWriteStream@@QAEXI@Z)
+407040a0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt8L@RWriteStream@@QAEXH@Z)
+407040a4 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt32L@RWriteStream@@QAEXJ@Z)
+407040a8 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z)
+407040ac 00000004 .idata $5 ESTOR.dll(__imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z)
+407040b0 00000004 .idata $5 ESTOR.dll(__imp_?WriteInt16L@RWriteStream@@QAEXH@Z)
+407040b4 00000004 .idata $5 ESTOR.dll
+407040b8 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@H@Z)
+407040bc 00000004 .idata $5 EUSER.dll(__imp_?NullTTime@Time@@SA?AVTTime@@XZ)
+407040c0 00000004 .idata $5 EUSER.dll(__imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+407040c4 00000004 .idata $5 EUSER.dll(__imp_?__WireKernel@UpWins@@SAXXZ)
+407040c8 00000004 .idata $5 EUSER.dll
+407040cc 0000000a .idata $6 ESTOR.dll
+407040d6 0000000a .idata $6 EUSER.dll
+40705000 00000004 .CRT $XCA UP_DLL.obj
+40705008 00000004 .CRT $XCZ UP_DLL.obj
+40705010 00000004 .CRT $XIA UP_DLL.obj
+40705018 00000004 .CRT $XIZ UP_DLL.obj
+40705020 00000004 .CRT $XPA UP_DLL.obj
+40705028 00000004 .CRT $XPZ UP_DLL.obj
+40705030 00000004 .CRT $XTA UP_DLL.obj
+40705038 00000004 .CRT $XTZ UP_DLL.obj
+40706000 00000012 .bss ASSHDALARM.o
+40706018 00000008 .bss ASSHDDLL.o
+40706020 00000008 .bss uid.o
+40706028 00000008 .bss UP_DLL.obj
+40706030 00000004 .bss
+
+--------------
+Public Symbols
+--------------
+
+Address Module Name
+-------- -------------------- ----
+40701000 ASSHDALARM.o ??0TASShdAlarm@@QAE@XZ
+4070103d ASSHDALARM.o ?InternalizeL@TASShdAlarm@@QAEXAAVRReadStream@@@Z
+40701144 ASSHDALARM.o ?ExternalizeL@TASShdAlarm@@QBEXAAVRWriteStream@@@Z
+40701220 ASSHDALARM.o ?Reset@TASShdAlarm@@QAEXXZ
+407012c2 ASSHDDLL.o ?E32Dll@@YAHW4TDllReason@@@Z
+407012c6 EUSER.dll ??0TBufBase16@@IAE@H@Z
+407012cc ESTOR.dll ?ReadUint16L@RReadStream@@QAEGXZ
+407012d2 ESTOR.dll ?ReadInt8L@RReadStream@@QAECXZ
+407012d8 ESTOR.dll ?ReadInt32L@RReadStream@@QAEJXZ
+407012de ESTOR.dll ?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+407012e4 ESTOR.dll ?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+407012ea ESTOR.dll ?ReadInt16L@RReadStream@@QAEFXZ
+407012f0 ESTOR.dll ?WriteUint16L@RWriteStream@@QAEXI@Z
+407012f6 ESTOR.dll ?WriteInt8L@RWriteStream@@QAEXH@Z
+407012fc ESTOR.dll ?WriteInt32L@RWriteStream@@QAEXJ@Z
+40701302 ESTOR.dll ?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+40701308 ESTOR.dll ?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+4070130e ESTOR.dll ?WriteInt16L@RWriteStream@@QAEXH@Z
+40701314 EUSER.dll ?NullTTime@Time@@SA?AVTTime@@XZ
+4070131a EUSER.dll ?Copy@TDes16@@QAEXABVTDesC16@@@Z
+40701340 UP_DLL.obj ?_E32Dll@@YGHPAXI0@Z
+407013e8 EUSER.dll ?__WireKernel@UpWins@@SAXXZ
+40703000 uid.o ?uid@@3PAVTUid@@A
+40704000 ESTOR.dll __IMPORT_DESCRIPTOR_ESTOR
+40704014 EUSER.dll __IMPORT_DESCRIPTOR_EUSER
+40704028 EUSER.dll __NULL_IMPORT_DESCRIPTOR
+40704084 ESTOR.dll __imp_?ReadUint16L@RReadStream@@QAEGXZ
+40704088 ESTOR.dll __imp_?ReadInt8L@RReadStream@@QAECXZ
+4070408c ESTOR.dll __imp_?ReadInt32L@RReadStream@@QAEJXZ
+40704090 ESTOR.dll __imp_?InternalizeL@@YAXAAVTInt64@@AAVRReadStream@@@Z
+40704094 ESTOR.dll __imp_?InternalizeL@@YAXAAVTDes16@@AAVRReadStream@@@Z
+40704098 ESTOR.dll __imp_?ReadInt16L@RReadStream@@QAEFXZ
+4070409c ESTOR.dll __imp_?WriteUint16L@RWriteStream@@QAEXI@Z
+407040a0 ESTOR.dll __imp_?WriteInt8L@RWriteStream@@QAEXH@Z
+407040a4 ESTOR.dll __imp_?WriteInt32L@RWriteStream@@QAEXJ@Z
+407040a8 ESTOR.dll __imp_?ExternalizeL@@YAXVTInt64@@AAVRWriteStream@@@Z
+407040ac ESTOR.dll __imp_?ExternalizeL@@YAXABVTDesC16@@AAVRWriteStream@@@Z
+407040b0 ESTOR.dll __imp_?WriteInt16L@RWriteStream@@QAEXH@Z
+407040b4 ESTOR.dll ESTOR_NULL_THUNK_DATA
+407040b8 EUSER.dll __imp_??0TBufBase16@@IAE@H@Z
+407040bc EUSER.dll __imp_?NullTTime@Time@@SA?AVTTime@@XZ
+407040c0 EUSER.dll __imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z
+407040c4 EUSER.dll __imp_?__WireKernel@UpWins@@SAXXZ
+407040c8 EUSER.dll EUSER_NULL_THUNK_DATA
+40705000 UP_DLL.obj ?__xc_a@@3PAP6AXXZA
+40705008 UP_DLL.obj ?__xc_z@@3PAP6AXXZA
+40705010 UP_DLL.obj ?__xi_a@@3PAP6AXXZA
+40705018 UP_DLL.obj ?__xi_z@@3PAP6AXXZA
+40705020 UP_DLL.obj ?__xp_a@@3PAP6AXXZA
+40705028 UP_DLL.obj ?__xp_z@@3PAP6AXXZA
+40705030 UP_DLL.obj ?__xt_a@@3PAP6AXXZA
+40705038 UP_DLL.obj ?__xt_z@@3PAP6AXXZA
+40706030 common ?_initialised@@3HA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/MAP_file/winscw/urel/E32STRT.EXE.map Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,311 @@
+Address Size Name Subname Module
+
+00401000 00000179 .text ESTART.o(?LoadLocale@@YAXAAVRFs@@@Z)
+00401179 0000011b .text ESTART.o(?InitialiseScreenCalibration@@YAXAAVRFs@@@Z)
+00401294 0000008a .text ESTART.o(?LocalFSInitialisation@@YAXAAVRFs@@@Z)
+0040131e 000002d7 .text ESTART.o(?E32Main@@YAHXZ)
+004015f6 00000006 .text EUSER.dll(??0TLocale@@QAE@XZ)
+004015fc 00000006 .text EFSRV.dll(??0TFindFile@@QAE@AAVRFs@@@Z)
+00401602 00000006 .text EUSER.dll(??0TBufBase16@@IAE@ABVTDesC16@@H@Z)
+00401608 00000006 .text HAL.dll(?Get@HAL@@SAHW4TAttribute@HALData@@AAH@Z)
+0040160e 00000006 .text EUSER.dll(?AppendNumFixedWidth@TDes16@@QAEXIW4TRadix@@H@Z)
+00401614 00000006 .text HAL.dll(?Set@HAL@@SAHW4TAttribute@HALData@@H@Z)
+0040161a 00000006 .text EFSRV.dll(?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z)
+00401620 00000006 .text EFSRV.dll(?FullName@TParseBase@@QBEABVTDesC16@@XZ)
+00401626 00000006 .text EUSER.dll(?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+0040162c 00000006 .text EFSRV.dll(?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z)
+00401632 00000006 .text EUSER.dll(??0TPtr8@@QAE@PAEH@Z)
+00401638 00000006 .text EFSRV.dll(?Read@RFile@@QBEHAAVTDes8@@H@Z)
+0040163e 00000006 .text EUSER.dll(?Set@TLocale@@QBEXXZ)
+00401644 00000006 .text EUSER.dll(??0TCurrencySymbol@@QAE@XZ)
+0040164a 00000006 .text EUSER.dll(?SetCurrencySymbol@User@@SAXABVTDesC16@@@Z)
+00401650 00000006 .text EFSRV.dll(?Close@RFsBase@@QAEXXZ)
+00401656 00000006 .text EUSER.dll(??0TBufBase16@@IAE@H@Z)
+0040165c 00000006 .text EUSER.dll(?SetXYInputCalibration@UserHal@@SAHABVTDigitizerCalibration@@@Z)
+00401662 00000006 .text EUSER.dll(??0TBufBase8@@IAE@H@Z)
+00401668 00000006 .text EFSRV.dll(?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z)
+0040166e 00000006 .text EUSER.dll(?Panic@User@@SAXABVTDesC16@@H@Z)
+00401674 00000006 .text EUSER.dll(?AtC@TDesC8@@IBEABEH@Z)
+0040167a 00000006 .text EFSRV.dll(?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z)
+00401680 00000006 .text EFSRV.dll(?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z)
+00401686 00000006 .text EUSER.dll(?WaitForRequest@User@@SAXAAVTRequestStatus@@@Z)
+0040168c 00000006 .text EFSRV.dll(?Connect@RFs@@QAEHH@Z)
+00401692 00000006 .text EFSRV.dll(?Size@RFile@@QBEHAAH@Z)
+00401698 00000006 .text EFSRV.dll(?Read@RFile@@QBEHAAVTDes8@@@Z)
+0040169e 00000006 .text EUSER.dll(?Alloc@User@@SAPAXH@Z)
+004016a4 00000006 .text EUSER.dll(??0TPtr8@@QAE@PAEHH@Z)
+004016aa 00000006 .text EUSER.dll(?Free@User@@SAXPAX@Z)
+004016b0 00000006 .text EUSER.dll(?AtC@TDesC16@@IBEABGH@Z)
+004016b6 00000006 .text EUSER.dll(?Create@RProcess@@QAEHABVTDesC16@@0W4TOwnerType@@@Z)
+004016bc 00000006 .text EUSER.dll(?Resume@RProcess@@QAEXXZ)
+004016c2 00000006 .text EUSER.dll(?Close@RHandleBase@@QAEXXZ)
+004016c8 00000020 .text UP_EXE.obj(?initTable@@YAXPAP6AXXZ0@Z)
+004016e8 00000021 .text UP_EXE.obj(?Panic@@YAXW4TStatPanic@@@Z)
+00401709 00000177 .text UP_EXE.obj(?startupThread@@YAHXZ)
+00401880 00000011 .text UP_EXE.obj(?_E32Startup@@YGXXZ)
+00401892 00000006 .text EUSER.dll(??0TPtrC16@@QAE@PBG@Z)
+00401898 00000006 .text EUSER.dll(?BlockThreads@UserSvr@@SAXW4TBlockType@@@Z)
+0040189e 00000006 .text EUSER.dll(?__DllAttachProcess@UpWins@@SAXXZ)
+004018a4 00000006 .text EUSER.dll(?__FileServer@UpWins@@SAP6AHPAX@ZXZ)
+004018aa 00000006 .text EUSER.dll(?Create@RThread@@QAEHABVTDesC16@@P6AHPAX@ZHHH1W4TOwnerType@@@Z)
+004018b0 00000006 .text EUSER.dll(?SetPriority@RThread@@QBEXW4TThreadPriority@@@Z)
+004018b6 00000006 .text EUSER.dll(?SetSystem@RThread@@QBEXH@Z)
+004018bc 00000006 .text EUSER.dll(?SetProtected@RThread@@QBEXH@Z)
+004018c2 00000006 .text EUSER.dll(?Resume@RThread@@QBEXXZ)
+004018c8 00000006 .text EUSER.dll(?__Synchronize@UpWins@@SAXXZ)
+004018ce 00000006 .text EUSER.dll(?__ReleaseInitThreads@UpWins@@SAXXZ)
+004018d4 00000006 .text EUSER.dll(?__WindowServer@UpWins@@SAP6AHPAX@ZXZ)
+004018da 00000006 .text EUSER.dll(?__WireKernel@UpWins@@SAXXZ)
+004018e0 00000006 .text EUSER.dll(?KernelStartup@UserSvr@@SAXP6AHPAX@Z@Z)
+00402000 0000019c .data ESTART.o
+004021a0 00000018 .data uid.o
+004021b8 00000018 .data UP_EXE.obj
+004021d0 00000040 .data UP_EXE.obj
+00403000 0000000c .E32_UID uid.o
+00404000 00000014 .idata $2 EFSRV.dll
+00404014 00000014 .idata $2 EUSER.dll
+00404028 00000014 .idata $2 HAL.dll
+0040403c 00000014 .idata $3 EFSRV.dll
+00404050 00000004 .idata $4 EFSRV.dll
+00404054 00000004 .idata $4 EFSRV.dll
+00404058 00000004 .idata $4 EFSRV.dll
+0040405c 00000004 .idata $4 EFSRV.dll
+00404060 00000004 .idata $4 EFSRV.dll
+00404064 00000004 .idata $4 EFSRV.dll
+00404068 00000004 .idata $4 EFSRV.dll
+0040406c 00000004 .idata $4 EFSRV.dll
+00404070 00000004 .idata $4 EFSRV.dll
+00404074 00000004 .idata $4 EFSRV.dll
+00404078 00000004 .idata $4 EFSRV.dll
+0040407c 00000004 .idata $4 EFSRV.dll
+00404080 00000004 .idata $4 EFSRV.dll
+00404084 00000004 .idata $4 EUSER.dll
+00404088 00000004 .idata $4 EUSER.dll
+0040408c 00000004 .idata $4 EUSER.dll
+00404090 00000004 .idata $4 EUSER.dll
+00404094 00000004 .idata $4 EUSER.dll
+00404098 00000004 .idata $4 EUSER.dll
+0040409c 00000004 .idata $4 EUSER.dll
+004040a0 00000004 .idata $4 EUSER.dll
+004040a4 00000004 .idata $4 EUSER.dll
+004040a8 00000004 .idata $4 EUSER.dll
+004040ac 00000004 .idata $4 EUSER.dll
+004040b0 00000004 .idata $4 EUSER.dll
+004040b4 00000004 .idata $4 EUSER.dll
+004040b8 00000004 .idata $4 EUSER.dll
+004040bc 00000004 .idata $4 EUSER.dll
+004040c0 00000004 .idata $4 EUSER.dll
+004040c4 00000004 .idata $4 EUSER.dll
+004040c8 00000004 .idata $4 EUSER.dll
+004040cc 00000004 .idata $4 EUSER.dll
+004040d0 00000004 .idata $4 EUSER.dll
+004040d4 00000004 .idata $4 EUSER.dll
+004040d8 00000004 .idata $4 EUSER.dll
+004040dc 00000004 .idata $4 EUSER.dll
+004040e0 00000004 .idata $4 EUSER.dll
+004040e4 00000004 .idata $4 EUSER.dll
+004040e8 00000004 .idata $4 EUSER.dll
+004040ec 00000004 .idata $4 EUSER.dll
+004040f0 00000004 .idata $4 EUSER.dll
+004040f4 00000004 .idata $4 EUSER.dll
+004040f8 00000004 .idata $4 EUSER.dll
+004040fc 00000004 .idata $4 EUSER.dll
+00404100 00000004 .idata $4 EUSER.dll
+00404104 00000004 .idata $4 EUSER.dll
+00404108 00000004 .idata $4 EUSER.dll
+0040410c 00000004 .idata $4 EUSER.dll
+00404110 00000004 .idata $4 EUSER.dll
+00404114 00000004 .idata $4 HAL.dll
+00404118 00000004 .idata $4 HAL.dll
+0040411c 00000004 .idata $4 HAL.dll
+00404120 00000004 .idata $5 EFSRV.dll(__imp_??0TFindFile@@QAE@AAVRFs@@@Z)
+00404124 00000004 .idata $5 EFSRV.dll(__imp_?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z)
+00404128 00000004 .idata $5 EFSRV.dll(__imp_?FullName@TParseBase@@QBEABVTDesC16@@XZ)
+0040412c 00000004 .idata $5 EFSRV.dll(__imp_?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z)
+00404130 00000004 .idata $5 EFSRV.dll(__imp_?Read@RFile@@QBEHAAVTDes8@@H@Z)
+00404134 00000004 .idata $5 EFSRV.dll(__imp_?Close@RFsBase@@QAEXXZ)
+00404138 00000004 .idata $5 EFSRV.dll(__imp_?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z)
+0040413c 00000004 .idata $5 EFSRV.dll(__imp_?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z)
+00404140 00000004 .idata $5 EFSRV.dll(__imp_?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z)
+00404144 00000004 .idata $5 EFSRV.dll(__imp_?Connect@RFs@@QAEHH@Z)
+00404148 00000004 .idata $5 EFSRV.dll(__imp_?Size@RFile@@QBEHAAH@Z)
+0040414c 00000004 .idata $5 EFSRV.dll(__imp_?Read@RFile@@QBEHAAVTDes8@@@Z)
+00404150 00000004 .idata $5 EFSRV.dll
+00404154 00000004 .idata $5 EUSER.dll(__imp_??0TLocale@@QAE@XZ)
+00404158 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@ABVTDesC16@@H@Z)
+0040415c 00000004 .idata $5 EUSER.dll(__imp_?AppendNumFixedWidth@TDes16@@QAEXIW4TRadix@@H@Z)
+00404160 00000004 .idata $5 EUSER.dll(__imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z)
+00404164 00000004 .idata $5 EUSER.dll(__imp_??0TPtr8@@QAE@PAEH@Z)
+00404168 00000004 .idata $5 EUSER.dll(__imp_?Set@TLocale@@QBEXXZ)
+0040416c 00000004 .idata $5 EUSER.dll(__imp_??0TCurrencySymbol@@QAE@XZ)
+00404170 00000004 .idata $5 EUSER.dll(__imp_?SetCurrencySymbol@User@@SAXABVTDesC16@@@Z)
+00404174 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase16@@IAE@H@Z)
+00404178 00000004 .idata $5 EUSER.dll(__imp_?SetXYInputCalibration@UserHal@@SAHABVTDigitizerCalibration@@@Z)
+0040417c 00000004 .idata $5 EUSER.dll(__imp_??0TBufBase8@@IAE@H@Z)
+00404180 00000004 .idata $5 EUSER.dll(__imp_?Panic@User@@SAXABVTDesC16@@H@Z)
+00404184 00000004 .idata $5 EUSER.dll(__imp_?AtC@TDesC8@@IBEABEH@Z)
+00404188 00000004 .idata $5 EUSER.dll(__imp_?WaitForRequest@User@@SAXAAVTRequestStatus@@@Z)
+0040418c 00000004 .idata $5 EUSER.dll(__imp_?Alloc@User@@SAPAXH@Z)
+00404190 00000004 .idata $5 EUSER.dll(__imp_??0TPtr8@@QAE@PAEHH@Z)
+00404194 00000004 .idata $5 EUSER.dll(__imp_?Free@User@@SAXPAX@Z)
+00404198 00000004 .idata $5 EUSER.dll(__imp_?AtC@TDesC16@@IBEABGH@Z)
+0040419c 00000004 .idata $5 EUSER.dll(__imp_?Create@RProcess@@QAEHABVTDesC16@@0W4TOwnerType@@@Z)
+004041a0 00000004 .idata $5 EUSER.dll(__imp_?Resume@RProcess@@QAEXXZ)
+004041a4 00000004 .idata $5 EUSER.dll(__imp_?Close@RHandleBase@@QAEXXZ)
+004041a8 00000004 .idata $5 EUSER.dll(__imp_??0TPtrC16@@QAE@PBG@Z)
+004041ac 00000004 .idata $5 EUSER.dll(__imp_?BlockThreads@UserSvr@@SAXW4TBlockType@@@Z)
+004041b0 00000004 .idata $5 EUSER.dll(__imp_?__DllAttachProcess@UpWins@@SAXXZ)
+004041b4 00000004 .idata $5 EUSER.dll(__imp_?__FileServer@UpWins@@SAP6AHPAX@ZXZ)
+004041b8 00000004 .idata $5 EUSER.dll(__imp_?Create@RThread@@QAEHABVTDesC16@@P6AHPAX@ZHHH1W4TOwnerType@@@Z)
+004041bc 00000004 .idata $5 EUSER.dll(__imp_?SetPriority@RThread@@QBEXW4TThreadPriority@@@Z)
+004041c0 00000004 .idata $5 EUSER.dll(__imp_?SetSystem@RThread@@QBEXH@Z)
+004041c4 00000004 .idata $5 EUSER.dll(__imp_?SetProtected@RThread@@QBEXH@Z)
+004041c8 00000004 .idata $5 EUSER.dll(__imp_?Resume@RThread@@QBEXXZ)
+004041cc 00000004 .idata $5 EUSER.dll(__imp_?__Synchronize@UpWins@@SAXXZ)
+004041d0 00000004 .idata $5 EUSER.dll(__imp_?__ReleaseInitThreads@UpWins@@SAXXZ)
+004041d4 00000004 .idata $5 EUSER.dll(__imp_?__WindowServer@UpWins@@SAP6AHPAX@ZXZ)
+004041d8 00000004 .idata $5 EUSER.dll(__imp_?__WireKernel@UpWins@@SAXXZ)
+004041dc 00000004 .idata $5 EUSER.dll(__imp_?KernelStartup@UserSvr@@SAXP6AHPAX@Z@Z)
+004041e0 00000004 .idata $5 EUSER.dll
+004041e4 00000004 .idata $5 HAL.dll(__imp_?Get@HAL@@SAHW4TAttribute@HALData@@AAH@Z)
+004041e8 00000004 .idata $5 HAL.dll(__imp_?Set@HAL@@SAHW4TAttribute@HALData@@H@Z)
+004041ec 00000004 .idata $5 HAL.dll
+004041f0 0000000a .idata $6 EFSRV.dll
+004041fa 0000000a .idata $6 EUSER.dll
+00404204 00000008 .idata $6 HAL.dll
+00405000 00000004 .CRT $XCA UP_EXE.obj
+00405008 00000004 .CRT $XCZ UP_EXE.obj
+00405010 00000004 .CRT $XIA UP_EXE.obj
+00405018 00000004 .CRT $XIZ UP_EXE.obj
+00405020 00000004 .CRT $XPA UP_EXE.obj
+00405028 00000004 .CRT $XPZ UP_EXE.obj
+00405030 00000004 .CRT $XTA UP_EXE.obj
+00405038 00000004 .CRT $XTZ UP_EXE.obj
+00406000 00000008 .bss ESTART.o
+00406008 00000008 .bss uid.o
+00406010 00000008 .bss UP_EXE.obj
+00406018 00000000 .bss
+
+--------------
+Public Symbols
+--------------
+
+Address Module Name
+-------- -------------------- ----
+0040131e ESTART.o ?E32Main@@YAHXZ
+004015f6 EUSER.dll ??0TLocale@@QAE@XZ
+004015fc EFSRV.dll ??0TFindFile@@QAE@AAVRFs@@@Z
+00401602 EUSER.dll ??0TBufBase16@@IAE@ABVTDesC16@@H@Z
+00401608 HAL.dll ?Get@HAL@@SAHW4TAttribute@HALData@@AAH@Z
+0040160e EUSER.dll ?AppendNumFixedWidth@TDes16@@QAEXIW4TRadix@@H@Z
+00401614 HAL.dll ?Set@HAL@@SAHW4TAttribute@HALData@@H@Z
+0040161a EFSRV.dll ?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z
+00401620 EFSRV.dll ?FullName@TParseBase@@QBEABVTDesC16@@XZ
+00401626 EUSER.dll ?Copy@TDes16@@QAEXABVTDesC16@@@Z
+0040162c EFSRV.dll ?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z
+00401632 EUSER.dll ??0TPtr8@@QAE@PAEH@Z
+00401638 EFSRV.dll ?Read@RFile@@QBEHAAVTDes8@@H@Z
+0040163e EUSER.dll ?Set@TLocale@@QBEXXZ
+00401644 EUSER.dll ??0TCurrencySymbol@@QAE@XZ
+0040164a EUSER.dll ?SetCurrencySymbol@User@@SAXABVTDesC16@@@Z
+00401650 EFSRV.dll ?Close@RFsBase@@QAEXXZ
+00401656 EUSER.dll ??0TBufBase16@@IAE@H@Z
+0040165c EUSER.dll ?SetXYInputCalibration@UserHal@@SAHABVTDigitizerCalibration@@@Z
+00401662 EUSER.dll ??0TBufBase8@@IAE@H@Z
+00401668 EFSRV.dll ?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z
+0040166e EUSER.dll ?Panic@User@@SAXABVTDesC16@@H@Z
+00401674 EUSER.dll ?AtC@TDesC8@@IBEABEH@Z
+0040167a EFSRV.dll ?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z
+00401680 EFSRV.dll ?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z
+00401686 EUSER.dll ?WaitForRequest@User@@SAXAAVTRequestStatus@@@Z
+0040168c EFSRV.dll ?Connect@RFs@@QAEHH@Z
+00401692 EFSRV.dll ?Size@RFile@@QBEHAAH@Z
+00401698 EFSRV.dll ?Read@RFile@@QBEHAAVTDes8@@@Z
+0040169e EUSER.dll ?Alloc@User@@SAPAXH@Z
+004016a4 EUSER.dll ??0TPtr8@@QAE@PAEHH@Z
+004016aa EUSER.dll ?Free@User@@SAXPAX@Z
+004016b0 EUSER.dll ?AtC@TDesC16@@IBEABGH@Z
+004016b6 EUSER.dll ?Create@RProcess@@QAEHABVTDesC16@@0W4TOwnerType@@@Z
+004016bc EUSER.dll ?Resume@RProcess@@QAEXXZ
+004016c2 EUSER.dll ?Close@RHandleBase@@QAEXXZ
+004016e8 UP_EXE.obj ?Panic@@YAXW4TStatPanic@@@Z
+00401880 UP_EXE.obj ?_E32Startup@@YGXXZ
+00401892 EUSER.dll ??0TPtrC16@@QAE@PBG@Z
+00401898 EUSER.dll ?BlockThreads@UserSvr@@SAXW4TBlockType@@@Z
+0040189e EUSER.dll ?__DllAttachProcess@UpWins@@SAXXZ
+004018a4 EUSER.dll ?__FileServer@UpWins@@SAP6AHPAX@ZXZ
+004018aa EUSER.dll ?Create@RThread@@QAEHABVTDesC16@@P6AHPAX@ZHHH1W4TOwnerType@@@Z
+004018b0 EUSER.dll ?SetPriority@RThread@@QBEXW4TThreadPriority@@@Z
+004018b6 EUSER.dll ?SetSystem@RThread@@QBEXH@Z
+004018bc EUSER.dll ?SetProtected@RThread@@QBEXH@Z
+004018c2 EUSER.dll ?Resume@RThread@@QBEXXZ
+004018c8 EUSER.dll ?__Synchronize@UpWins@@SAXXZ
+004018ce EUSER.dll ?__ReleaseInitThreads@UpWins@@SAXXZ
+004018d4 EUSER.dll ?__WindowServer@UpWins@@SAP6AHPAX@ZXZ
+004018da EUSER.dll ?__WireKernel@UpWins@@SAXXZ
+004018e0 EUSER.dll ?KernelStartup@UserSvr@@SAXP6AHPAX@Z@Z
+00403000 uid.o ?uid@@3PAVTUid@@A
+00404000 EFSRV.dll __IMPORT_DESCRIPTOR_EFSRV
+00404014 EUSER.dll __IMPORT_DESCRIPTOR_EUSER
+00404028 HAL.dll __IMPORT_DESCRIPTOR_HAL
+0040403c EFSRV.dll __NULL_IMPORT_DESCRIPTOR
+00404120 EFSRV.dll __imp_??0TFindFile@@QAE@AAVRFs@@@Z
+00404124 EFSRV.dll __imp_?FindByDir@TFindFile@@QAEHABVTDesC16@@0@Z
+00404128 EFSRV.dll __imp_?FullName@TParseBase@@QBEABVTDesC16@@XZ
+0040412c EFSRV.dll __imp_?Open@RFile@@QAEHAAVRFs@@ABVTDesC16@@I@Z
+00404130 EFSRV.dll __imp_?Read@RFile@@QBEHAAVTDes8@@H@Z
+00404134 EFSRV.dll __imp_?Close@RFsBase@@QAEXXZ
+00404138 EFSRV.dll __imp_?DriveList@RFs@@QBEHAAV?$TBuf8@$0BK@@@@Z
+0040413c EFSRV.dll __imp_?MountFileSystem@RFs@@QBEHABVTDesC16@@H@Z
+00404140 EFSRV.dll __imp_?StartupInitComplete@RFs@@QAEXAAVTRequestStatus@@@Z
+00404144 EFSRV.dll __imp_?Connect@RFs@@QAEHH@Z
+00404148 EFSRV.dll __imp_?Size@RFile@@QBEHAAH@Z
+0040414c EFSRV.dll __imp_?Read@RFile@@QBEHAAVTDes8@@@Z
+00404150 EFSRV.dll EFSRV_NULL_THUNK_DATA
+00404154 EUSER.dll __imp_??0TLocale@@QAE@XZ
+00404158 EUSER.dll __imp_??0TBufBase16@@IAE@ABVTDesC16@@H@Z
+0040415c EUSER.dll __imp_?AppendNumFixedWidth@TDes16@@QAEXIW4TRadix@@H@Z
+00404160 EUSER.dll __imp_?Copy@TDes16@@QAEXABVTDesC16@@@Z
+00404164 EUSER.dll __imp_??0TPtr8@@QAE@PAEH@Z
+00404168 EUSER.dll __imp_?Set@TLocale@@QBEXXZ
+0040416c EUSER.dll __imp_??0TCurrencySymbol@@QAE@XZ
+00404170 EUSER.dll __imp_?SetCurrencySymbol@User@@SAXABVTDesC16@@@Z
+00404174 EUSER.dll __imp_??0TBufBase16@@IAE@H@Z
+00404178 EUSER.dll __imp_?SetXYInputCalibration@UserHal@@SAHABVTDigitizerCalibration@@@Z
+0040417c EUSER.dll __imp_??0TBufBase8@@IAE@H@Z
+00404180 EUSER.dll __imp_?Panic@User@@SAXABVTDesC16@@H@Z
+00404184 EUSER.dll __imp_?AtC@TDesC8@@IBEABEH@Z
+00404188 EUSER.dll __imp_?WaitForRequest@User@@SAXAAVTRequestStatus@@@Z
+0040418c EUSER.dll __imp_?Alloc@User@@SAPAXH@Z
+00404190 EUSER.dll __imp_??0TPtr8@@QAE@PAEHH@Z
+00404194 EUSER.dll __imp_?Free@User@@SAXPAX@Z
+00404198 EUSER.dll __imp_?AtC@TDesC16@@IBEABGH@Z
+0040419c EUSER.dll __imp_?Create@RProcess@@QAEHABVTDesC16@@0W4TOwnerType@@@Z
+004041a0 EUSER.dll __imp_?Resume@RProcess@@QAEXXZ
+004041a4 EUSER.dll __imp_?Close@RHandleBase@@QAEXXZ
+004041a8 EUSER.dll __imp_??0TPtrC16@@QAE@PBG@Z
+004041ac EUSER.dll __imp_?BlockThreads@UserSvr@@SAXW4TBlockType@@@Z
+004041b0 EUSER.dll __imp_?__DllAttachProcess@UpWins@@SAXXZ
+004041b4 EUSER.dll __imp_?__FileServer@UpWins@@SAP6AHPAX@ZXZ
+004041b8 EUSER.dll __imp_?Create@RThread@@QAEHABVTDesC16@@P6AHPAX@ZHHH1W4TOwnerType@@@Z
+004041bc EUSER.dll __imp_?SetPriority@RThread@@QBEXW4TThreadPriority@@@Z
+004041c0 EUSER.dll __imp_?SetSystem@RThread@@QBEXH@Z
+004041c4 EUSER.dll __imp_?SetProtected@RThread@@QBEXH@Z
+004041c8 EUSER.dll __imp_?Resume@RThread@@QBEXXZ
+004041cc EUSER.dll __imp_?__Synchronize@UpWins@@SAXXZ
+004041d0 EUSER.dll __imp_?__ReleaseInitThreads@UpWins@@SAXXZ
+004041d4 EUSER.dll __imp_?__WindowServer@UpWins@@SAP6AHPAX@ZXZ
+004041d8 EUSER.dll __imp_?__WireKernel@UpWins@@SAXXZ
+004041dc EUSER.dll __imp_?KernelStartup@UserSvr@@SAXP6AHPAX@Z@Z
+004041e0 EUSER.dll EUSER_NULL_THUNK_DATA
+004041e4 HAL.dll __imp_?Get@HAL@@SAHW4TAttribute@HALData@@AAH@Z
+004041e8 HAL.dll __imp_?Set@HAL@@SAHW4TAttribute@HALData@@H@Z
+004041ec HAL.dll HAL_NULL_THUNK_DATA
+00405000 UP_EXE.obj ?__xc_a@@3PAP6AXXZA
+00405008 UP_EXE.obj ?__xc_z@@3PAP6AXXZA
+00405010 UP_EXE.obj ?__xi_a@@3PAP6AXXZA
+00405018 UP_EXE.obj ?__xi_z@@3PAP6AXXZA
+00405020 UP_EXE.obj ?__xp_a@@3PAP6AXXZA
+00405028 UP_EXE.obj ?__xp_z@@3PAP6AXXZA
+00405030 UP_EXE.obj ?__xt_a@@3PAP6AXXZA
+00405038 UP_EXE.obj ?__xt_z@@3PAP6AXXZA
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/Preprocessed_text/IRCOMM.rpp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+# 1 "M:\\SRC\\COMMON\\GENERIC\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS"
+// IRCOMM.RSS
+//
+// Copyright (c) 1998 Symbian Ltd. All rights reserved.
+//
+
+# 1 "ircomm.rls" 1
+rls_string STRING_r_irccsy_info1 "Infrared"
+# 6 "M:\\SRC\\COMMON\\GENERIC\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS" 2
+
+# 1 "..\\INC\\csy.rh" 1
+// CSY.RH
+//
+// Copyright (c) 1998 Symbian Ltd. All rights reserved.
+//
+
+
+STRUCT CSY_INFORMATION
+ {
+ LTEXT humanreadablename;
+ }
+# 7 "M:\\SRC\\COMMON\\GENERIC\\INFRA-RED\\IRDA\\GROUP\\IRCOMM.RSS" 2
+
+
+RESOURCE CSY_INFORMATION r_irccsy_info
+ {
+ humanreadablename=STRING_r_irccsy_info1;
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/SGML_file/allclasses-frame.html Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc on Wed Jul 16 16:53:16 BST 2003 -->
+<TITLE>
+All Classes
+</TITLE>
+<LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
+</HEAD>
+<BODY BGCOLOR="white">
+<FONT size="+1" CLASS="FrameHeadingFont">
+<B>All Classes</B></FONT>
+<BR>
+
+<TABLE BORDER="0" WIDTH="100%">
+<TR>
+<TD NOWRAP><FONT CLASS="FrameItemFont"><A HREF="com/symbian/sdk/util/assertion/Assert.html" TARGET="classFrame">Assert</A>
+<BR>
+<A HREF="com/symbian/sdk/util/assertion/AssertionException.html" TARGET="classFrame">AssertionException</A>
+<BR>
+<A HREF="com/symbian/sdk/util/assertion/JniOutOfMemoryError.html" TARGET="classFrame">JniOutOfMemoryError</A>
+<BR>
+</FONT></TD>
+</TR>
+</TABLE>
+
+</BODY>
+</HTML>
Binary file bintools/evalid/right/ok/ZIP_file/aifapp_ResourceBundles.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right/ok/identical/console.ini Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Console.ini
+# Copyright (c) 1997-2001 Symbian Ltd. All rights reserved.
+#
+ScreenWidth 640
+ScreenHeight 240
+
+PhysicalScreenWidth 0
+PhysicalScreenHeight 0
+
+fasciabitmap console.bmp
+
+ScreenOffsetX 0
+ScreenOffsetY 0
+
+
+# could be decreased to reflect the amount of memory available on Brutus
+MegabytesOfFreeMemory 16
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/tools_evalid.history.xml.bak Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+ All rights reserved.
+ This component and the accompanying materials are made available
+ under the terms of the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ -->
+<relnotes name="EVALID">
+ <purpose>
+ </purpose>
+
+ <defect number="DEF120580" title="EVALID : x86 static library comparisons sometimes fail when they shouldn't" revision="007">
+ EVALID : x86 static library comparisons sometimes fail when they shouldn't
+ </defect>
+
+ <defect number="DEF119569" title="EVALID incorrectly passes different WINSCW binaries after recent 'nm' change" revision="006">
+ EVALID incorrectly passes different WINSCW binaries after recent "nm" change
+ </defect>
+
+ <defect number="DEF114373" title="EVALID should use OBJDUMP instead of DUMPBIN" revision="005">
+ EVALID should use OBJDUMP instead of DUMPBIN
+ </defect>
+
+ <defect number="DEF114371" title="EVALID should be using ELF2E32 instead of PETRAN" revision="004">
+ EVALID should be using ELF2E32 instead of PETRAN
+ </defect>
+
+ <defect number="DEF096631" title="EVALID doesn't process -f listfile option correctly." revision="003">
+ EVALID doesn't process -f listfile option correctly
+ </defect>
+
+ <defect number="DEF099894" title="EVALID does not ignore all debug-related info in ELF files" revision="002">
+ EVALID does not ignore all debug-related info in ELF files
+ </defect>
+
+ <defect number="DEF099893" title="EVALID does not recognise some modern E32 Image files" revision="001">
+ EVALID does not recognise some modern E32 Image files
+ </defect>
+</relnotes>
--- a/buildframework/helium/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -1,70 +1,80 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-============================================================================
-Name : build.xml
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="helium-build" default="help" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
- <description>
- Helium targets to build helium itself.
- </description>
- <property environment="env" />
-
- <property name="build.drive" location="${env.TEMP}/helium/temp_drive"/>
- <mkdir dir="${build.drive}/"/>
-
- <!--* @property helium.version
- @type string
- @scope private -->
- <property file="${helium.dir}/config/version.txt"/>
- <property name="release.label" value="${helium.version}"/>
-
- <property name="doc.src.dir" location="${basedir}/doc/src" />
- <!-- Override docs targets to do more for Helium. -->
- <target name="apidocs" depends="internal.docs.apidocs"/>
- <!-- Generate rst files for docs -->
- <target name="prep-textdocs" depends="overview-to-html,dependency-diagram,
- dependency-logs,release-diff,helium-user-graph,internal.docs.prep-textdocs,helium-prep-textdocs"/>
- <!-- generate all the user documentation for helium -->
- <target name="docs" depends="clean-docs,docs-database,apidocs,textdocs"/>
-
- <!-- Generates an Ant XML database file showing only public content.
- @scope private
- -->
- <target name="docs-database">
- <hlm:databaseMacro file="${public.database.file}" scope="public"/>
- </target>
-
- <import file="helium.ant.xml"/>
- <import file="tools/startup/antserver/antserver.ant.xml"/>
-
- <if>
- <isset property="nokia.dir"/>
- <then>
- <resources id="textdoc.paths">
- <path>
- <pathelement path="${doc.src.dir}"/>
- <pathelement path="${basedir}/extensions/nokia/doc/src"/>
- </path>
- </resources>
- </then>
- </if>
-
-</project>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-build" default="help" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>
+ Helium targets to build helium itself.
+ </description>
+ <property environment="env" />
+
+ <property name="build.drive" location="${env.TEMP}/helium/temp_drive"/>
+ <mkdir dir="${build.drive}/"/>
+
+ <!--* @property helium.version
+ @type string
+ @scope private -->
+ <property file="${helium.dir}/config/version.txt"/>
+ <property name="release.label" value="${helium.version}"/>
+
+ <property name="doc.src.dir" location="${basedir}/doc/src" />
+ <!-- Override docs targets to do more for Helium. -->
+ <target name="apidocs" depends="internal.docs.apidocs"/>
+ <!-- Generate rst files for docs -->
+ <target name="prep-textdocs">
+ <parallel>
+ <antcall target="overview-to-html"/>
+ <antcall target="dependency-diagram"/>
+ <antcall target="dependency-logs"/>
+ <antcall target="release-diff"/>
+ <antcall target="helium-user-graph"/>
+ </parallel>
+ <antcall target="internal.docs.prep-textdocs"/>
+ <antcall target="helium-prep-textdocs"/>
+ </target>
+
+ <!-- generate all the user documentation for helium -->
+ <target name="docs" depends="clean-docs,docs-database,apidocs,textdocs,docs-check-links"/>
+
+ <!-- Generates an Ant XML database file showing only public content.
+ @scope private
+ -->
+ <target name="docs-database">
+ <hlm:databaseMacro file="${public.database.file}" scope="public"/>
+ </target>
+
+ <import file="helium.ant.xml"/>
+ <import file="tools/startup/antserver/antserver.ant.xml"/>
+
+ <if>
+ <isset property="nokia.dir"/>
+ <then>
+ <resources id="textdoc.paths">
+ <path>
+ <pathelement path="${doc.src.dir}"/>
+ <pathelement path="${basedir}/extensions/nokia/doc/src"/>
+ </path>
+ </resources>
+ </then>
+ </if>
+
+</project>
+
Binary file buildframework/helium/builder/antlibs/jeldoclet.jar has changed
--- a/buildframework/helium/builder/bld.bat Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/builder/bld.bat Mon Oct 18 10:23:52 2010 +0100
@@ -28,7 +28,7 @@
set JYTHONPATH=%BUILDER_HOME%\antlibs\jython-2.5-py2.5.egg
set PATH=%JAVA_HOME%\bin;%PATH%
-ant -lib %BUILDER_HOME%\antlibs %*
+call ant -lib %BUILDER_HOME%\antlibs %*
if "%ERRORLEVEL%" neq "0" (goto error)
endlocal
goto :eof
--- a/buildframework/helium/builder/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/builder/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -20,7 +20,7 @@
============================================================================
-->
-<project name="helium-builder" default="build" xmlns:au="antlib:org.apache.ant.antunit" xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:ac="antlib:net.sf.antcontrib">
+<project name="helium-builder" default="build" xmlns:au="antlib:org.apache.ant.antunit" xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:ac="antlib:net.sf.antcontrib" xmlns:hlm="http://www.nokia.com/helium">
<property environment="env" />
<taskdef name="fmpp" classname="fmpp.tools.AntTask" />
<import file="delivery.ant.xml" />
@@ -49,6 +49,7 @@
<property name="config" value="sf" />
<property name="sf.delivery.zip" location="${build.temp.dir}/helium-sf-src.zip" />
<property name="binary.delivery.zip" location="${build.temp.dir}/helium-bin.zip" />
+ <property name="doc.build.dir" location="${build.temp.dir}/doc/api" />
<fileset id="ant.build.files" dir="${source.root.dir}">
<include name="${component.root}/${component.type}/${component}/build.xml" />
@@ -64,11 +65,24 @@
<exclude name="build/**" />
</fileset>
-
+ <!-- Add macro in order to avoid the use of failonerror="false" in the delete task -->
+ <macrodef name="deleteIfDirExists">
+ <attribute name="dir"/>
+ <sequential>
+ <ac:if>
+ <available file="@{dir}" type="dir" />
+ <then>
+ <delete dir="@{dir}" />
+ </then>
+ </ac:if>
+ </sequential>
+ </macrodef>
+
+
<target name="cleanup" description="Cleanup (delete the temp build directory)">
- <delete dir="${build.temp.dir}" failonerror="false"/>
- <delete dir="${source.root.dir}/external/antlibs2" failonerror="false" />
- <delete dir="${source.root.dir}/external/python/lib/auto" failonerror="false" />
+ <deleteIfDirExists dir="${build.temp.dir}" />
+ <deleteIfDirExists dir="${source.root.dir}/external/antlibs2" />
+ <deleteIfDirExists dir="${source.root.dir}/external/python/lib/auto" />
</target>
@@ -236,7 +250,7 @@
inline="true" type="jar"
pattern="${source.root.dir}/external/antlibs2/[artifact]-[revision].[ext]" />
<delete>
- <fileset dir="${source.root.dir}" includes="external/python/lib/auto/zipnotsafe/**" />
+ <fileset dir="${source.root.dir}" includes="external/python/lib/auto/zipnotsafe/**" />
</delete>
<ivy:retrieve sync="true" conf="default" organisation="com.nokia.helium.config"
module="helium-${config}-config" revision="1.0"
@@ -362,7 +376,7 @@
<target name="textdoc">
- <delete dir="${build.temp.dir}/doc/doctmp" failonerror="false"/>
+ <deleteIfDirExists dir="${build.temp.dir}/doc/doctmp" />
<copy todir="${build.temp.dir}/doc/doctmp" overwrite="true">
<fileset dir="${source.root.dir}/sf/doc/src"/>
</copy>
@@ -383,7 +397,7 @@
<attribute name="output" default="${build.temp.dir}/doc/text"/>
<sequential>
<property name="sphinx.lib.dir" location="${builder.dir}/tools/sphinx/Sphinx-0.5.1-py2.5.egg/sphinx" />
- <exec executable="python" failonerror="${failonerror}">
+ <exec executable="python" failonerror="true">
<env key="PYTHONPATH" path="${builder.dir}/tools/sphinx" />
<arg file="${builder.dir}/tools/sphinx/sphinx-build.py"/>
<arg value="-b" />
@@ -397,6 +411,32 @@
</exec>
</sequential>
</macrodef>
+
+ <!-- Generate Ant API documentation using jeldoclet. -->
+ <target name="jeldoclet">
+ <path id="doclet-classpath">
+ <fileset dir="${build.temp.dir}" includes="**/*.jar"/>
+ <pathelement path="${java.class.path}/"/>
+ </path>
+ <javadoc destdir="${build.temp.dir}"
+ docletpathref="doclet-classpath"
+ useexternalfile="true"
+ failonerror="true">
+ <sourcepath>
+ <dirset dir="${source.root.dir}">
+ <include name="*/java/*/src"/>
+ </dirset>
+ </sourcepath>
+ <doclet name="com.jeldoclet.JELDoclet"/>
+ </javadoc>
+ <fmpp sourceFile="${builder.dir}/tools/antdoclet/doclet_list.rst.ftl"
+ outputFile="${build.temp.dir}/temp/doc/helium-antlib/tasks.rst">
+ <data expandProperties="yes">
+ doc: xml(${build.temp.dir}/jel.xml)
+ ant: antProperties()
+ </data>
+ </fmpp>
+ </target>
</project>
--- a/buildframework/helium/builder/java/macros.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/builder/java/macros.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -291,10 +291,11 @@
<arg line="/c build.bat unittest " />
<arg value="-Dbuilder.dir=${builder.dir}" />
</exec>
- <exec osfamily="unix" executable="./bld.sh" dir="${basedir}/tests" failonerror="true">
+ <exec osfamily="unix" executable="/bin/bash" dir="${basedir}/tests" failonerror="true">
<env key="ANT_ARGS" value="-lib ${lib.dir} -lib ${module.temp.dir}/backup/${ant.project.name}.jar -lib ${builder.dir}/antlibs -Dpython.path=${python.path}" />
<env key="PYTHONPATH" value="${python.path}" />
<env key="JYTHONPATH" value="${python.path}" />
+ <arg value="./bld.sh" />
<arg line="unittest" />
<arg value="-Dbuilder.dir=${builder.dir}" />
</exec>
Binary file buildframework/helium/builder/python/lib/pkg_resources.pyc has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/builder/tools/antdoclet/doclet_list.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,86 @@
+<#--
+============================================================================
+Name : doclet_list.rst.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+=======================
+Helium Ant Tasks/ Types
+=======================
+
+.. contents::
+
+<#assign lastcategory=''/>
+<#list doc.jel.jelclass as x>
+ <#list x.@superclass as superclass>
+ <#assign category=x.@package/>
+ <#assign name=x.@type/>
+ <#assign t1=''/>
+ <#assign t2=''/>
+ <#if (superclass?contains('Task') || superclass?contains('Type')) && !x.@abstract[0]??>
+ <#list x.comment.attribute as attribute>
+ <#list attribute.description?split(' ') as value>
+ <#if value?contains("category=")>
+ <#assign category=value?replace('category=', '')?replace('"', '')/>
+ <#if category != lastcategory>
+${category}
+=============
+
+ </#if>
+ <#assign lastcategory=category/>
+ </#if>
+ <#if value?contains("name=")>
+ <#assign name=value?replace('name=', '')?replace('"', '')/>
+ </#if>
+ </#list>
+ </#list>
+<#if superclass?contains('Task')>Task</#if><#if superclass?contains('Type')>Type</#if>: ${name}
+----------------------------------------------------------------------------
+ <#list x.comment.description as description>
+.. raw:: html
+
+ ${description}
+ </#list>
+
+<#list x.methods.method as method>
+ <#if method.@name?starts_with('set')>
+ <#if t1 != 'true'>
+ <#assign t1='true'/>
+.. csv-table:: Parameters
+ :header: "Attribute", "Description", "Required?"
+
+ </#if>
+ ${method.@name?replace('set', '', 'f')?uncap_first}, <#list method.comment.description as d>"${d?replace('\n', '')}"</#list>,<#list method.comment.attribute as a><#if a.@name?starts_with('@ant')>${(a.@name == '@ant.required')?string}</#if></#list>
+ </#if>
+</#list>
+
+<#list x.methods.method as method>
+ <#if method.@name?starts_with('add') && method["count(params/param)"] == 1>
+ <#if t2 != 'true'>
+ <#assign t2='true'/>
+.. csv-table:: Parameters accepted as nested elements
+ :header: "Type", "Description", "Required?"
+
+ </#if>
+ <#list method.params.param as d>"${d.@type?uncap_first}"</#list>, <#list method.comment.description as d>"${d?replace('\n', '')}"</#list>,<#list method.comment.attribute as a><#if a.@name?starts_with('@ant')>${(a.@name == '@ant.required')?string}</#if></#list>
+ </#if>
+</#list>
+
+ </#if>
+ </#list>
+</#list>
--- a/buildframework/helium/config/diamonds_config_default.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/config/diamonds_config_default.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -108,7 +108,7 @@
<hlm:fileMessage file="${diamonds.build.output.dir}/create-bom.xml" />
</hlm:targetMessageTrigger>
- <hlm:targetMessageTrigger id="post-coverity.id" target="post-coverity" >
+ <hlm:targetMessageTrigger id="post-coverity.id" target="gen-coverity-report" >
<hlm:fmppMessage sourceFile="${helium.dir}/tools/common/templates/diamonds/coverity.xml.ftl">
<data expandProperties="yes">
ant: antProperties()
@@ -182,4 +182,15 @@
</hlm:fmppMessage>
</hlm:targetMessageTrigger>
+ <!-- Declaring Diamonds sublisteners -->
+ <hlm:targetTimingMessageListener id="target.timing.message.listener" />
+ <hlm:targetMessageListener id="target.message.listener" />
+ <hlm:stageMessageListener id="stage.message.listener">
+ <hlm:fmppMessage sourceFile="${helium.dir}/tools/common/templates/diamonds/diamonds_stage.xml.ftl">
+ <data expandProperties="yes">
+ ant: antProperties()
+ </data>
+ </hlm:fmppMessage>
+ </hlm:stageMessageListener>
+
</project>
\ No newline at end of file
--- a/buildframework/helium/config/logging.conf.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-<#--
-============================================================================
-Name : logging.conf.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-[formatters]
-keys: simple,detailed
-
-[handlers]
-keys: console,syslog
-
-[loggers]
-keys: root,dp
-
-[formatter_simple]
-format: %(levelname)s:%(name)s:%(message)s
-
-[formatter_detailed]
-format: %(levelname)s:%(name)s: %(module)s:%(lineno)d: %(message)s
-
-[handler_console]
-class: StreamHandler
-args: []
-formatter: simple
-
-[handler_syslog]
-class: handlers.SysLogHandler
-args: [('myhost.mycorp.net', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER]
-formatter: detailed
-
-[logger_root]
-level: INFO
-handlers: syslog
-
-[logger_dp]
-<#if ant?keys?seq_contains("dp.debug") || ant?keys?seq_contains("debug")>
-level: DEBUG
-<#else>
-level: INFO
-</#if>
-handlers: console
-qualname: dp
\ No newline at end of file
--- a/buildframework/helium/config/metadata_filter_config_default.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/config/metadata_filter_config_default.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -60,9 +60,20 @@
<hlm:metadatafilterset id="filterset.sbs.cli">
<metadatafilter priority="error" regex="^sbs:\s+error:.*" description="sbs cli error" />
+ <metadatafilter priority="error" regex="^Error:\[ERROR\].*" description="coverity cli error" />
<metadatafilter priority="warning" regex="^sbs:\s+warning:.*" description="sbs cli warning" />
</hlm:metadatafilterset>
+ <hlm:metadatafilterset id="filterset.coverity.output.cli">
+ <metadatafilter priority="error" regex="\[ERROR\].*" description="coverity cli error" />
+ <metadatafilter priority="error" regex="\[FATAL\].*" description="coverity fatal cli error" />
+ <metadatafilter priority="error" regex="^Error:.*" description="coverity cli error" />
+ </hlm:metadatafilterset>
+
+ <hlm:metadatafilterset id="filterset.coverity.error.cli">
+ <metadatafilter priority="error" regex=".*" description="coverity cli error" />
+ </hlm:metadatafilterset>
+
<hlm:metadatafilterset id="filterset.sbs.checksource">
<metadatafilter priority="error" regex="^Actual case on disk ->.*" description="sbs checksource error" />
</hlm:metadatafilterset>
@@ -138,7 +149,7 @@
<metadatafilterset refid="filterset.common" />
</hlm:metadatafilterset>
- <hlm:metadatafilterset id="filterset.matti">
+ <hlm:metadatafilterset id="filterset.tdriver">
<metadatafilterset refid="filterset.common" />
</hlm:metadatafilterset>
--- a/buildframework/helium/config/signaling_config_default.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/config/signaling_config_default.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -159,8 +159,8 @@
<hlm:signalInput id="testAlertsSignalInput" failbuild="now" />
- <hlm:signalInput id="fotaSignalInput" failbuild="never">
- <hlm:notifierListRef refid="fotaSignalInput" />
+ <hlm:signalInput id="fotaSignalInput" failbuild="defer">
+ <hlm:notifierListRef refid="defaultFailNotifier" />
</hlm:signalInput>
<hlm:signalInput id="archivePolicyErrorSignalInput" failbuild="never">
@@ -185,6 +185,21 @@
</notifierInput>
</signalNotifierInput>
</hlm:signalListenerConfig>
+
+ <hlm:signalListenerConfig id="prepWorkAreaSignal2" target="cleanup-work-area" message="Errors during Preparing Work Area">
+ <hlm:targetCondition>
+ <hlm:hasSeverity severity="error" file="${build.cache.log.dir}/signals/${build.id}_cleanup_work_area.log.status.xml" />
+ </hlm:targetCondition>
+ <signalNotifierInput>
+ <signalInput refid="prepWorkAreaSignalInput" />
+ <notifierInput>
+ <fileset dir="${build.cache.log.dir}" >
+ <include name="signals/${build.id}_cleanup_work_area*" />
+ <include name="${build.id}_cleanup_work_area*" />
+ </fileset>
+ </notifierInput>
+ </signalNotifierInput>
+ </hlm:signalListenerConfig>
<hlm:signalListenerConfig id="preparationSignal" target="prep-fail" message="Errors during preparation">
<targetCondition>
@@ -290,15 +305,15 @@
</signalNotifierInput>
</hlm:signalListenerConfig>
- <hlm:signalListenerConfig id="mattiSignal" target="matti-test" message="ATS MATTI creation had errors">
+ <hlm:signalListenerConfig id="tDriverSignal" target="tdriver-test" message="ATS TDRIVER creation had errors">
<targetCondition>
- <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_matti.log.status.xml" />
+ <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_tdriver.log.status.xml" />
</targetCondition>
<signalNotifierInput>
<signalInput refid="atsSignalInput" />
<notifierInput>
<fileset dir="${build.log.dir}" >
- <include name="**/${build.id}_matti*" />
+ <include name="**/${build.id}_tdriver*" />
</fileset>
</notifierInput>
</signalNotifierInput>
@@ -322,7 +337,7 @@
<hlm:signalListenerConfig id="signalValidatePolicyInvalidOrMissing" target="render-validate-policy" message="Policy file validation had errors">
<targetCondition>
- <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_validate-policy.summary.status.xml" />
+ <hlm:hasSeverity severity="error" file="${build.signal.status.dir}/${build.id}_validate-policy.summary.xml.status.xml" />
</targetCondition>
<signalNotifierInput>
<signalInput refid="signalValidatePolicyInvalidOrMissingInput" />
--- a/buildframework/helium/config/stages_config_default.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/config/stages_config_default.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -26,6 +26,10 @@
</description>
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+ <!-- Registering the stage recorder. -->
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
+
<!-- Build Stage Summary configuration -->
<!-- Comment out below line to skip displaying build stage summary at end of build process -->
--- a/buildframework/helium/config/version.txt Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/config/version.txt Mon Oct 18 10:23:52 2010 +0100
@@ -1,5 +1,5 @@
#Helium version - DO NOT EDIT
#Fri Dec 18 15:07:03 EET 2009
-last.major.helium.version=10.0.0
-second.last.major.helium.version=9.0
-helium.version=11.0.0
+last.major.helium.version=11.0.0
+second.last.major.helium.version=10.0.0
+helium.version=12.0.0a
--- a/buildframework/helium/doc/api_rst/macros_list.rst.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/api_rst/macros_list.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -33,11 +33,15 @@
</#list>
.. csv-table:: Helium macros
- :header: "Macro", "Project", "Summary"
+ :header: "Macro", "Project/Antlib", "Summary"
<#list macroCache?keys?sort as name>
<#assign macro=macroCache[name]>
- ":hlm-t:`${name}`", "${macro?parent.name}", "${macro.summary?replace("^", " ", "rm")?replace("\"", "\"\"", "rm")?trim}"
+<#assign prefix = "project">
+<#if macro?parent.name?contains("antlib")>
+ <#assign prefix = "antlib">
+</#if>
+ ":hlm-t:`${name}`", "`${macro?parent.name} <${prefix}-${macro?parent.name}.html>`_", "${macro.summary?replace("^", " ", "rm")?replace("\"", "\"\"", "rm")?trim}"
</#list>
--- a/buildframework/helium/doc/api_rst/properties_list.rst.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/api_rst/properties_list.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -34,7 +34,7 @@
<#list propertyCache?keys?sort as name>
<#assign property=propertyCache[name]>
- ":hlm-t:`${name}`", "${property?parent.name}", "${property.summary?replace("^", " ", "rm")?replace("\"", "\"\"", "rm")?trim}", "<#if property.defaultValue?length < 25>${property.defaultValue}</#if>"
+ ":hlm-t:`${name}`", "`${property?parent.name} <project-${property?parent.name}.html>`_", "${property.summary?replace("^", " ", "rm")?replace("\"", "\"\"", "rm")?trim}", "<#if property.defaultValue?length < 25>${property.defaultValue}</#if>"
</#list>
--- a/buildframework/helium/doc/api_rst/targets_list.rst.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/api_rst/targets_list.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -34,7 +34,7 @@
<#list targetCache?keys?sort as name>
<#assign target=targetCache[name]>
- ":hlm-t:`${name}`", "${target?parent.name}", "${target.summary?replace("^", " ", "rm")?replace("\"", "\"\"", "rm")?trim}"
+ ":hlm-t:`${name}`", "`${target?parent.name} <project-${target?parent.name}.html>`_", "${target.summary?replace("^", " ", "rm")?replace("\"", "\"\"", "rm")?trim}"
</#list>
--- a/buildframework/helium/doc/helium_custom/api_changes.rst.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/helium_custom/api_changes.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -50,7 +50,7 @@
=============
<#list doc.apiChanges.target?sort as target>
<#if target.@state == 'added'>
-* `${target} <api/helium/target-${target}.html>`_
+* :hlm-t:`${target}`
</#if>
</#list>
@@ -66,7 +66,7 @@
================
<#list doc.apiChanges.property?sort as property>
<#if property.@state == 'added'>
-* `${property} <api/helium/property-${property}.html>`_
+* :hlm-p:`${property}`
</#if>
</#list>
@@ -82,7 +82,7 @@
============
<#list doc.apiChanges.macro?sort as macro>
<#if macro.@state == 'added'>
-* `${macro} <api/helium/macro-${macro}.html>`_
+* ${macro}
</#if>
</#list>
--- a/buildframework/helium/doc/src/.templates/indexcontent.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/.templates/indexcontent.html.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -28,10 +28,12 @@
<p class="biglink"><a class="biglink" href="{{ pathto("releasenotes/index") }}">Release notes</a><br/>
<span class="linkdescr">what's new</span></p>
</#if>
- <p class="biglink"><a class="biglink" href="{{ pathto("quick_start_guide") }}">Quick Start Guide</a><br/>
+ <p class="biglink"><a class="biglink" href="{{ pathto("quick_start_guide") }}">Quick start guide</a><br/>
<span class="linkdescr">start here</span></p>
<p class="biglink"><a class="biglink" href="{{ pathto("feature_list") }}">Feature list</a><br/>
<span class="linkdescr">what is supported</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("new_user_tutorial") }}">New user tutorial</a><br/>
+ <span class="linkdescr">covers the basics</span></p>
<p class="biglink"><a class="biglink" href="{{ pathto("manual/index") }}">Manual</a><br/>
<span class="linkdescr">reference docs</span></p>
</td><td width="50%">
--- a/buildframework/helium/doc/src/architecture.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/architecture.rst Mon Oct 18 10:23:52 2010 +0100
@@ -68,7 +68,7 @@
Practices
=========
-Files created in Ant, Perl, Python or XML syntax must follow the `Style guide <coding_conventions.html>`_.
+Files created in Ant, Perl, Python or XML syntax must follow the `Style guide <development/coding_conventions.html>`_.
.. index::
@@ -88,15 +88,8 @@
See the reference API documentation:
* `Helium API`_
-* `Java APIs`_
-* `Python APIs`_
-* `Custom Ant tasks`_
.. _`Helium API` : api/helium/index.html
-.. _`Java APIs` : api/java/index.html
-.. _`Python APIs` : api/python/index.html
-.. _`Custom Ant tasks` : api/ant/index.html
-
.. index::
single: Tools and scripts locations
--- a/buildframework/helium/doc/src/development/coding_conventions.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/development/coding_conventions.rst Mon Oct 18 10:23:52 2010 +0100
@@ -46,7 +46,7 @@
Documentation
=============
-Standalone documents like this design document and the user guide are documented in reStructuredText__ format.
+Standalone documents like this design document and the user guide are documented in reStructuredText_ format.
__ http://docutils.sourceforge.net/rst.html
@@ -73,8 +73,31 @@
"``hlm-p``", "Properties"
"``hlm-m``", "Macros"
- It is **not** possible to link to the task or anything in the Java documentation.
+
+.. note:: It is **not** possible to link to tasks or anything in the Java documentation.
+A section of RST documentation might look like this::
+
+ The :hlm-t:`foo` target requires the :hlm-p:`bar` property to be defined. It uses the :hlm-t:`bazMacro` macro.
+
+Fields from the API elements can also be embedded in the RST documentation using an index-like syntax::
+
+ :hlm-p:`bar[summary]`
+
+This would extract the ``summary`` field of the ``bar`` property and insert it into the document. The available fields are:
+
+.. csv-table:: API element fields
+ :header: "Field", "Description"
+
+ "summary", "The first sentence or section of the documentation."
+ "documentation", "The whole documentation text."
+ "scope", "The visibility scope."
+ "defaultValue", "The default value if one is defined. Properties only."
+ "type", "The type of the element. Properties only."
+ "editable", "Whether definition is required or optional. Properties only."
+ "deprecated", "Deprecation message."
+
+
Creating Index References
`````````````````````````
@@ -129,7 +152,7 @@
:header: "Tag", "Applies to", "Description"
"scope", "All elements", "The scope or visibility of the element. Valid values are ``public`` (default), ``protected`` and ``private``."
- "editable", "All types", "Whether this element should be overridden or defined by the user. Valid values are ``required`` and ``optional``"
+ "editable", "All types", "Indicates whether the property must be defined or not. Valid values are ``required`` and ``optional``. ``required`` means it must be defined for the related feature to work. The user must define it if there is no default value, i.e. it is not already defined in Helium."
"type", "Properties", "The type of the property value. Valid values are ``string`` (default), ``integer``, ``boolean``."
"deprecated", "All elements", "Documents that the element is deprecated and may be removed in a future release. The text should describe what to use instead."
@@ -341,7 +364,7 @@
* Unit tests are written for each Python module.
* They should follow the Nose_ testing framework conventions.
-* The test suite is run by calling :hlm-t:`py-unittest`.
+* The test suite is run by calling ``bld test``.
.. _Nose : http://somethingaboutorange.com/mrl/projects/nose/
@@ -364,7 +387,7 @@
* `Twisted Coding Standard`_ (but with a grain of salt):
.. _`PEP 8 - Style Guide for Python Code` : http://www.python.org/dev/peps/pep-0008/
-.. _`Twisted Coding Standard` : http://twistedmatrix.com/trac/browser/trunk/doc/development/policy/coding-standard.xhtml?format=raw
+.. _`Twisted Coding Standard` : http://twistedmatrix.com/documents/current/core/development/policy/coding-standard.html
.. index::
--- a/buildframework/helium/doc/src/development/developer_guide.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/development/developer_guide.rst Mon Oct 18 10:23:52 2010 +0100
@@ -249,7 +249,7 @@
Also all setter methods visible through Ant must be documented properly using *@ant.required*
or *@ant.not-required* javadoc style attributes.
-You can find more information on how to document Ant tasks using the doclet plugin on http://doclet.neuroning.com/.
+You can find more information on how to document Ant tasks using the doclet plugin on http://antdoclet.neuroning.com/.
General coding guidelines
-------------------------
@@ -264,7 +264,7 @@
----------------------------
In order to match as must as configurability concepts, Helium custom types and tasks must follow development guidelines as
-much as possible. You can find then on http://.apache.org/_task_guidelines.html.
+much as possible. You can find then on http://ant.apache.org/ant_task_guidelines.html.
Logging
-------
@@ -414,6 +414,15 @@
Debug logs for component tests can be found at ``/build/components/<component>/xunit``.
+Filtering Python tests using nose
+---------------------------------
+
+Python unit tests are run through the nose testing framework. To run just a single Python test module, use::
+
+ bld test -Dcomponent=pythoncore -Dnose.args=amara
+
+The value of ``nose.args`` is passed through to nose.
+
.. index::
single: Assertions
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/blocks.rst Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,110 @@
+.. ============================================================================
+ Name : blocks.rst
+ Part of : Helium
+
+ 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 the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ ============================================================================
+
+.. index::
+ module: Blocks
+
+======
+Blocks
+======
+
+.. contents::
+
+.. _`Blocks-Intro-label`:
+
+Blocks Introduction
+====================
+
+Blocks is a packaging framework, which allows you to create bundles
+with interdependencies (like rpm or deb packages) base on the outcome of the build.
+
+
+Enabling Blocks input generation
+================================
+
+The input generation consists in gathering data from build steps throughout the build to allow the generation
+of the future bundle. Not all the steps are supported, so the build engineer must keep in mind that custom
+exports or modification of the binaries after a controlled build step might lead to bundles with inconsistent content.
+
+In order to enable blocks input generation you simply need to define the **blocks.enabled** property to true. Intermediate
+configuration file will be generated under **blocks.config.dir**.
+
+e.g::
+
+ hlm -Dblocks.enabled=true....
+
+
+Currently supported steps are:
+ * SBSv2 compilation
+ * Configuration export using cMaker (only if cmaker-what is called)
+ * ROM image creation
+
+
+Bundle generation
+=================
+
+Once the data have been gathered during the build, it is then possible to create bundles. To do so you need to call the
+**blocks-create-bundles** target. Generated bundle will be created under **blocks.bundle.dir**.
+
+e.g::
+
+ hlm -Dblocks.enabled=true .... blocks-create-bundles
+
+
+Blocks workspace management with Helium
+=======================================
+
+Helium allows you to use any build environment as Blocks workspace. The :hlm-t:`blocks-create-workspace` will handle the
+automatic creation of workspace base on the current build.drive used. If the current build.drive represent an
+already existing workspace then it will reuse it. The :hlm-p:blocks.workspace.id property will contain the Blocks workspace
+id. Also when new workspace is created some repositories can be automatically added using the **blocks.repositories.id** reference
+to an hlm:blocksRepositorySet object.
+
+::
+
+ <hlm:blocksRepositorySet id="blocks.repositories.id">
+ <repository name="test-repo" url="file:E:\my-repo" />
+ </hlm:blocksRepositorySet>
+
+
+
+Installing bundles
+==================
+The :hlm-t:`blocks-install-bundles` target will allow you to install packages under the workspace, to do so, you can configure
+the following references using patternset:
+
+::
+
+ <patternset id="blocks.bundle.filter.id">
+ <include name="some.pkg.name.*" />
+ <exclude name="some.other.pkg.name.*" />
+ </patternset>
+
+ <patternset id="blocks.group.filter.id">
+ <include name="some.pkg.name.*" />
+ <exclude name="some.other.pkg.name.*" />
+ </patternset>
+
+
+The **blocks.bundle.filter.id** patternset will allow you to filter bundles based on their name. And **blocks.bundle.filter.id** patternset will allow you
+to install group selected group of bundles.
+
+Finally the workspace can be updated using the :hlm-t:`blocks-update-bundles` target.
+
--- a/buildframework/helium/doc/src/manual/configuring.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/configuring.rst Mon Oct 18 10:23:52 2010 +0100
@@ -84,7 +84,7 @@
<import file="${helium.dir}/helium.ant.xml"/>
</project>
-Note that here the default target is :hlm-t:`product-build` so this would be used for a product build configuration. In reality it would need many more properties to be complete.
+Note that here the default target is ``product-build`` so this would be used for a product build configuration. In reality it would need many more properties to be complete.
Refer to the `configuration reference`_ for a full list of all Helium Ant properties.
@@ -188,9 +188,7 @@
Viewing target dependencies
===========================
-The :hlm-t:`deps` target can be used to display a list of the target dependencies for a given target. See the `manual page`_ for more information. Also the :hlm-t:`execlist` command works in a similar way but shows a dialog showing a separated list of all the dependent targets and then just the top-level of dependencies, to help with continuing a build on the command line.
-
-.. _`manual page`: ../api/helium/target-deps.html
+The :hlm-t:`deps` target can be used to display a list of the target dependencies for a given target. Also the :hlm-t:`execlist` command works in a similar way but shows a dialog showing a separated list of all the dependent targets and then just the top-level of dependencies, to help with continuing a build on the command line.
.. index::
--- a/buildframework/helium/doc/src/manual/configuring_features.rst.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/configuring_features.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -18,12 +18,12 @@
============================================================================
-####################
+###########################
Configuring Helium Features
-####################
+###########################
Introduction
--------------------------------
+------------
This describes how to configure the Helium features.
@@ -36,15 +36,15 @@
Enabling blocks features.
Enabling to use dragonfly and many more.
-Properties need to be defined for enabling/disabling the features.
--------------------------------------------------------------
+Properties need to be defined for enabling/disabling the features
+-----------------------------------------------------------------
<#assign propertyCache = {}>
<#list doc.antDatabase.project.property as property>
<#assign propertyCache = propertyCache + {property.name: property}>
</#list>
.. csv-table:: Feature properties
- :header: "Property name", "Description", "Allowed value", "Deprecated property"
+ :header: "Property name", "Description", "Default value", "Deprecated property"
<#list propertyCache?keys?sort as name>
<#assign property=propertyCache[name]>
@@ -58,7 +58,7 @@
<#assign deprecatedMessage="${deprecatedName.deprecated}">
</#if>
</#list>
- ":hlm-p:`${name}`", "${property.summary?replace("^", " ", "rm")?replace("\"", "\"\"", "rm")?trim}", "true/false", "${deprecatedProperty}${deprecatedMessage}"
+ ":hlm-p:`${name}`", "${property.summary?replace("^", " ", "rm")?replace("\"", "\"\"", "rm")?trim}", "${property.defaultValue}", "${deprecatedProperty}${deprecatedMessage}"
</#if>
</#list>
--- a/buildframework/helium/doc/src/manual/coverity.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/coverity.rst Mon Oct 18 10:23:52 2010 +0100
@@ -217,6 +217,8 @@
machine coverity login <user name> password <password>
+.. _`.netrc file`: configuring.html?highlight=netrc#passwords
+
.. csv-table:: Coverity feature flags
:header: "Flags to set", "Action performed", "Allowed value"
--- a/buildframework/helium/doc/src/manual/documentation.rst.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/documentation.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -33,10 +33,6 @@
APIs
====
-* `Search API`_
-
-.. _`Search API`: ../api/index.html
-
* `Helium API`_
The `Helium API`_ specifies all the available Ant_ targets and their
@@ -50,19 +46,20 @@
.. _`Helium Antlib`: ../helium-antlib/index.html
+<#if !(ant?keys?seq_contains("sf"))>
+
* `Ant Tasks`_
-.. _`Ant Tasks`: ../api/ant/index.html
+.. _`Ant Tasks`: ../api/doclet/index.html
-<#if !(ant?keys?seq_contains("sf"))>
Customer APIs
-------------
* `IDO API`_
* `DFS70501 API`_
-.. _`IDO API`: ../ido/api/helium/index.html
-.. _`DFS70501 API`: ../dfs70501/api/helium/index.html
+.. _`IDO API`: http://helium.nmp.nokia.com/doc/ido/api/helium/index.html
+.. _`DFS70501 API`: http://helium.nmp.nokia.com/doc/dfs70501/api/helium/index.html
</#if>
Building custom documentation
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/final.rst Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,63 @@
+..
+ ============================================================================
+ Name : final.rst
+ Part of : Helium
+
+ 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 the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ ============================================================================
+
+.. index::
+ single: Stage - Final operations
+
+Final operations
+================
+
+Final operation are steps which could happen at the workflow completion.
+
+
+Running a target at build completion
+------------------------------------
+
+Helium offers the possibility to run a final target despite any error which could occur during the build.
+The configuration of the target is done using the **hlm.final.target** property.
+
+e.g:
+::
+
+ <property name="hlm.final.target" value="my-final-target" />
+
+
+Running action on failure
+-------------------------
+
+The signaling framework will automatically run all signalExceptionConfig in case of Ant failure at the
+end of the build.
+
+This example shows how simple task can be run in case of failure:
+::
+
+ <hlm:signalExceptionConfig id="signal.exception.config">
+ <hlm:notifierList>
+ <hlm:executeTaskNotifier>
+ <echo>Signal: ${r'$'}{signal.name}</echo>
+ <echo>Message: ${r'$'}{signal.message}</echo>
+ <runtarget target="build-log-summary" />
+ </hlm:executeTaskNotifier>
+ </hlm:notifierList>
+ </hlm:signalExceptionConfig>
+
+
+
--- a/buildframework/helium/doc/src/manual/index.rst.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/index.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -19,10 +19,15 @@
============================================================================
-->
-###################################
- Helium Manual
-###################################
+#############
+Helium Manual
+#############
+.. raw:: html
+
+ <table border="0" cellspacing="0" cellpadding="10">
+ <tr valign="top">
+ <td width="50%" style="border-right: 1px solid black">
.. toctree::
:maxdepth: 2
@@ -36,7 +41,14 @@
configuring_features
running
stages
- stage_matti
+
+.. raw:: html
+
+ </td><td width="50%">
+
+.. toctree::
+ :maxdepth: 2
+
<#if !ant?keys?seq_contains("sf")>
nokiastages
datapackage
@@ -48,7 +60,9 @@
messaging
metrics
coverity
+ final
-
-
-
+.. raw:: html
+
+ </td></tr>
+ </table>
\ No newline at end of file
--- a/buildframework/helium/doc/src/manual/introduction.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/introduction.rst Mon Oct 18 10:23:52 2010 +0100
@@ -40,7 +40,7 @@
It is recommended to read the Ant_ documentation before learning about Helium. An understanding of XML_ is also needed as Ant_ is configured using an XML_ format.
-.. _Ant: http://Ant.apache.org/
+.. _Ant: http://ant.apache.org/
.. _XML: http://www.w3.org/XML/
.. index::
--- a/buildframework/helium/doc/src/manual/metrics.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/metrics.rst Mon Oct 18 10:23:52 2010 +0100
@@ -45,7 +45,7 @@
====================
To enable logging to diamonds from Helium one needs to ensure that:
-* The properties :hlm-p:`diamonds.host` and :hlm-p:`diamonds.port` are set correctly.
+* The properties ``diamonds.host`` and ``diamonds.port`` are set correctly.
* By default they are taken from ``helium/tools/common/companyproperties.ant.xml``, but can be overridden by using:
* **Command line**
@@ -83,8 +83,8 @@
"``diamonds.host``", "Diamonds server address"
"``diamonds.port``", "Server port number"
"``diamonds.path``", "Builds path in Diamonds server"
- ":hlm-p:`build.family`", "Category of product"
- ":hlm-p:`stages`", "Start and end target of a stages with logical stage name"
+ "``build.family``", "Category of product"
+ "``stages``", "Start and end target of a stages with logical stage name"
":hlm-p:`sysdef.configurations.list`", "System definition name list to log component faults"
":hlm-p:`build.name`", "Name of product"
":hlm-p:`release.label`", "Name of release"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/stage_ats.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,712 @@
+.. ============================================================================
+ Name : stage_ats.rst.ftl
+ Part of : Helium
+
+ 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 the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ ============================================================================
+
+.. index::
+ module: Testing
+
+=======
+Testing
+=======
+
+This is a good start for Helium users who want to setup test automation using ATS4. (**ATS3 users**, please `read here`_ .)
+
+.. _`read here`: stage_ats_old.html
+
+
+
+.. contents::
+
+
+
+Helium Test Automation
+======================
+
+Helium can be used to auomate testing. For this purpose, test asset must be alligned with the standard guidelines for writing the tests.
+
+Helium supports several test frameworks including `STIF`_, `TEF`_, RTest, MTF, `SUT`_, QtTest `EUnit`_, TDriver and ASTE. (`Description of test frameworks`_)
+
+Most of the above mentioned test frameworks share common configuration to setup TA environemnet. However, there are a few exceptions, which are discussed below under the headings of every test framework.
+
+
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`STIF`: http://s60wiki.nokia.com/S60Wiki/STIF
+.. _`TEF`: http://s60wiki.nokia.com/S60Wiki/TEF_%28TestExecute_Framework%29
+.. _`EUnit`: http://s60wiki.nokia.com/S60Wiki/EUnit
+</#if>
+
+.. _`SUT`: http://developer.symbian.org/wiki/index.php/Symbian_Test_Tools#SymbianUnitTest
+.. _`Description of test frameworks`: http://developer.symbian.org/wiki/index.php/Symbian_Test_Tools
+
+
+
+Prerequisites
+-------------
+
+* `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image.
+* The reader is expected to already have a working ATS setup in which test cases can be executed. ATS server names,
+ access rights and authentication etc. is supposed to be already taken care of.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`Harmonized Test Interface (HTI)`: http://s60wiki.nokia.com/S60Wiki/HTI
+<#else>
+.. _`Harmonized Test Interface (HTI)`: http://developer.symbian.org/wiki/index.php/HTI_Tool
+</#if>
+
+
+Setting up a Test Automation Environment with Helium
+====================================================
+
+Basic Test Automation step-by-step setup guide.
+
+
+Step 0: Structuring Test-source/test-asset
+------------------------------------------
+Test source usually lives in a component's ``tsrc`` directory. Test source components are created like any other Symbian SW component;
+there is a ``group`` directory with a ``bld.inf`` file for building, ``.mmp`` files for defining the targets, and so on.
+
+The test generation code expects ``.pkg`` file in the ``group`` directory of test component to be compiled, to get the paths of the files
+(can be data, configuration, initialization, etc) to be installed and where to install on the phone.
+
+**Please note** that not all components have ``tsrc`` and ``group`` directories. For instance, Qt, ASTE and TDriver do not have similar test asset structure as STIF, TEF and other test components. It is recommended to follow the test asset guidelines prior to setting up test automation with Helium.
+
+
+Step 1: Setting up system definition file
+-----------------------------------------
+**System Definition Files supporting layers.sysdef.xml**
+ **layers** in ``layers.sysdef.xml`` file and **configuration** in ``build.sysdef.xml`` file (`Structure of System Definition files version 1.4`_).
+
+ <#if !(ant?keys?seq_contains("sf"))>
+.. _`new API test automation guidelines`: http://s60wiki.nokia.com/S60Wiki/Test_Asset_Guidelines
+.. _`Structure of System Definition files version 1.4`: http://delivery.nmp.nokia.com/trac/helium/wiki/SystemDefinitionFiles
+</#if>
+
+A template of layer in layers.sysdef.xml for system definition files
+
+.. code-block:: xml
+
+ <layer name="name_test_layer">
+ <module name="module_name_one">
+ <unit unitID="unit_id1" name="unit_name1" bldFile="path_of_tsrc_folder_to_be_built" mrp="" />
+ </module>
+
+ <module name="module_name_two">
+ <unit unitID="unit_id2" name="unit_name2" bldFile="path_of_tsrc_folder_to_be_built" mrp="" />
+ </module>
+ </layer>
+
+
+* Layer name should end with **_test_layer**
+* Two standard names for ATS test layers are being used; ``unit_test_layer`` and ``api_test_layer``. Test components (the``unit`` tags)
+ should be specified under these layers and grouped by ``module`` tag(s).
+* In the above, two modules means two drop files will be created; ``module`` may have one or more ``unit``
+* By using property ``exclude.test.layers``, complete layers can be excluded and the components inside that layer will not be included in the AtsDrop. This property is a comma (,) separated list
+
+**System Definition Files version 3.0 (SysDefs3)** (new Helium v.10.79)
+ The `structure of System Definition files version 3.0`_ is different than previous versions of system definition files. In SysDefs3, package definition files are used for components specification. Instead of layers naming conventions, filters are used to identify test components and test types, for example: "test, unit_test, !api_test" etc.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`structure of System Definition files version 3.0`: http://wikis.in.nokia.com/view/SWManageabilityTeamWiki/PkgdefUse
+<#else>
+.. _`structure of System Definition files version 3.0`: sysdef3.html
+</#if>
+
+An example template for defining test components in a package definition file.
+
+.. code-block:: xml
+
+ <package id="dummytest" name="dummytest" levels="demo">
+ <collection id="test_nested" name="test_nested" level="demo">
+
+ <component id="tc1" name="tc1" purpose="development" filter="test, unit_test">
+ <unit bldFile="test_nested/tc1/group" mrp="" />
+ </component>
+
+ <component id="tc2" name="tc2" purpose="development" filter="test">
+ <meta rel="testbuild">
+ <group name="drop_tc2_and_tc3" />
+ </meta>
+ <unit bldFile="test_nested/tc2/group" mrp="" />
+ </component>
+
+ <component id="tc3" name="tc3" purpose="development" filter="test">
+ <meta rel="testbuild">
+ <group name="drop_tc2_and_tc3" />
+ </meta>
+ <unit bldFile="test_nested/tc3/group" mrp="" />
+ </component>
+
+ </collection>
+ </package>
+
+
+* Filter "test" must be specified for every test component. If it is not specified, the component will not be considered as a test component.
+* <meta>/<group> are now used to group test components, it work in the same way as <module>...<module> in sysdef v1.4 works. The components having same group name are grouped together.
+ Separate drop files are created for different groups. In the above example, if only 'test' is selected, then two drop files will be created, one with tc1 and the other one with tc2 and tc3.
+
+
+Step 2: Configure ATS Ant properties
+---------------------------------------
+The properties are categorized as
+
+* **Common** - Valid for all test frameworks (Table-1).
+* **API/Module** - Valid for only API/Module tests like STIF, STF, EUNit etc., and hence, are shared among many test frameworks (Table-2).
+
+
+Also, the edit status of the properties can be described as
+
+* [must] - must be set by user
+* [recommended] - should be set by user but not mandatory
+* [allowed] - should **not** be set by user however, it is possible.
+
+.. csv-table:: Table-1: ATS - Common Properties
+ :header: "Property name", "Edit status", "Description"
+
+ ":hlm-p:`ats.server`", "[must]", ":hlm-p:`ats.server[documentation]`"
+ ":hlm-p:`ats.drop.location`", "[allowed]", ":hlm-p:`ats.drop.location[documentation]`"
+ ":hlm-p:`ats.product.name`", "[must]", ":hlm-p:`ats.product.name[documentation]`"
+ ":hlm-p:`ats.email.list`", "[allowed]", ":hlm-p:`ats.email.list[documentation]`"
+ ":hlm-p:`ats.report.type`", "[allowed]", ":hlm-p:`ats.report.type[documentation]`"
+ ":hlm-p:`ats.flashfiles.minlimit`", "[allowed]", ":hlm-p:`ats.flashfiles.minlimit[documentation]`"
+ ":hlm-p:`ats.plan.name`", "[allowed]", ":hlm-p:`ats.plan.name[documentation]`"
+ ":hlm-p:`ats.product.hwid`", "[allowed]", ":hlm-p:`ats.product.hwid[documentation]`"
+ ":hlm-p:`ats.script.type`", "[allowed]", ":hlm-p:`ats.script.type[documentation]`"
+ ":hlm-p:`ats.test.timeout`", "[allowed]", ":hlm-p:`ats.test.timeout[documentation]`"
+ ":hlm-p:`ats.testrun.name`", "[allowed]", ":hlm-p:`ats.testrun.name[documentation]`"
+ ":hlm-p:`ats.report.location`", "[allowed]", ":hlm-p:`ats.report.location[documentation]`"
+ ":hlm-p:`ats.diamonds.signal`", "[allowed]", ":hlm-p:`ats.diamonds.signal[documentation]`"
+
+
+An example of setting up the common properties as in table-1:
+
+.. code-block:: xml
+
+ <property name="ats.server" value="4fio00105" />
+ <property name="ats.drop.location" location="\\trwsimXX\ATS_TEST_SHARE\" />
+ <property name="ats.product.name" value="PRODUCT" />
+ <property name="ats.email.list" value="temp.user@company.com; another.email@company.com" />
+ <property name="ats.report.type" value="simplelogger" />
+ <property name="ats.flashfiles.minlimit" value="2" />
+ <property name="ats.plan.name" value="plan" />
+ <property name="ats.product.hwid" value="" />
+ <property name="ats.script.type" value="runx" />
+ <property name="ats.test.timeout" value="60" />
+ <property name="ats.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{major.version}.${r'$'}{minor.version}" />
+ <property name="ats.report.location" value="${r'$'}{publish.dir}/${r'$'}{publish.subdir}" />
+ <property name="ats.diamonds.signal" value="false" />
+
+
+.. csv-table:: Table-2: ATS - API/Module properties
+ :header: "Property name", "Edit status", "Description"
+
+ ":hlm-p:`ats.target.platform`", "[allowed]", ":hlm-p:`ats.target.platform[documentation]`"
+ ":hlm-p:`ats.obey.pkgfiles.rule`", "[allowed]", ":hlm-p:`ats.obey.pkgfiles.rule[documentation]`"
+ ":hlm-p:`ats.specific.pkg`", "[allowed]", ":hlm-p:`ats.specific.pkg[documentation]`"
+ ":hlm-p:`ats.test.filterset`", "[allowed]", ":hlm-p:`ats.test.filterset[documentation]`"
+
+
+An example of setting up API/Module testing properties as in table-2:
+
+.. code-block:: xml
+
+ <property name="ats.target.platform" value="armv5 urel" />
+ <property name="ats.obey.pkgfiles.rule" value="false" />
+ <property name="ats.specific.pkg" value="sanity" />
+ <property name="ats.test.filterset" value="sysdef.filters.tests" />
+
+ <hlm:sysdefFilterSet id="sysdef.filters.tests">
+ <filter filter="test, " type="has" />
+ <config file="bldvariant.hrh" includes="" />
+ </hlm:sysdefFilterSet>
+
+
+Step 3: Configure or select ROM images (Optional)
+-------------------------------------------------
+Since helium 10 images are picked up using :hlm-p:`ats.product.name` and Imaker iconfig.xml files. Property ``release.images.dir`` is searched for iconfig.xml files, the ones where the product name is part of :hlm-p:`ats.product.name` is used.
+
+You should only build the images for each product you want to include in ats. See `Imaker`_ docs for more info. Eg.
+
+.. _`Imaker`: ../helium-antlib/imaker.html
+
+.. code-block:: xml
+
+ <hlm:imakerconfigurationset id="configname">
+ <imakerconfiguration>
+ <hlm:product list="${r'$'}{product.list}" ui="true"/>
+ <targetset>
+ <include name="^core${r'$'}"/>
+ <include name="^langpack_01${r'$'}"/>
+ <include name="^custvariant_01_tools${r'$'}"/>
+ <include name="^udaerase${r'$'}"/>
+ </targetset>
+ <variableset>
+ <variable name="TYPE" value="rnd"/>
+ </variableset>
+ </imakerconfiguration>
+ </hlm:imakerconfigurationset>
+
+
+For older products where there are no iconfig.xml, ``reference.ats.flash.images`` is used:
+
+.. code-block:: xml
+
+ <fileset id="reference.ats.flash.images" dir="${r'$'}{release.images.dir}">
+ <include name="**/${r'$'}{build.id}*.core.fpsx"/>
+ <include name="**/${r'$'}{build.id}*.rofs2.fpsx"/>
+ <include name="**/${r'$'}{build.id}*.rofs3.fpsx"/>
+ </fileset>
+
+
+.. Note::
+
+ Always declare *Properties* before and *filesets* after importing helium.ant.xml in order to overwrite the default values during the build.
+
+
+Step 4: Enabling or disabling test automation features
+------------------------------------------------------
+Helium supports a number of test automation features, which are discussed below. These features can be enabled or disabled by switching the values of the following properties to either *true* or *false*.
+
+
+.. csv-table:: Table-3: ATS - Switches/enablers
+ :header: "Property name", "Edit status", "Description"
+
+ ":hlm-p:`ats.enabled`", "[allowed]", ":hlm-p:`ats.enabled[documentation]`"
+ ":hlm-p:`ats4.enabled`", "[allowed]", ":hlm-p:`ats4.enabled[documentation]`"
+ ":hlm-p:`ats.stf.enabled`", "[allowed]", ":hlm-p:`ats.stf..enabled[documentation]`"
+ ":hlm-p:`aste.enabled`", "[allowed]", ":hlm-p:`aste.enabled[documentation]`"
+ ":hlm-p:`ats.ctc.enabled`", "[allowed]", ":hlm-p:`ats.ctc.enabled[documentation]`"
+ ":hlm-p:`ats.trace.enabled`", "[allowed]", ":hlm-p:`ats.trace.enabled[documentation]`"
+ ":hlm-p:`ats.emulator.enable`", "[allowed]", ":hlm-p:`ats.emulator.enable[documentation]`"
+ ":hlm-p:`ats.singledrop.enabled`", "[allowed]", ":hlm-p:`ats.singledrop.enabled[documentation]`"
+ ":hlm-p:`ats.multiset.enabled`", "[allowed]", ":hlm-p:`ats.multiset.enabled[documentation]`"
+ ":hlm-p:`ats.delta.enabled`", "[allowed]", ":hlm-p:`ats.delta.enabled[documentation]`"
+ ":hlm-p:`ats.java.importer.enabled`", "[allowed]", ":hlm-p:`ats.java.importer.enabled[documentation]`"
+ ":hlm-p:`ats.tdriver.enabled`", "[allowed]", ":hlm-p:`ats.tdriver.enabled[documentation]`"
+
+
+For example:
+
+.. code-block:: xml
+
+ <property name="ats.enabled" value="true" />
+
+
+Supported Test Frameworks
+=========================
+In this section only Helium specific properties, targets or other related issues are discussed to configure the following test frameworks. However, as mentioned earlier, there are test asset guidelines to setup test components for different test frameworks.
+
+ASTE
+----
+* ASTE tests can be enabled by setting :hlm-p:`aste.enabled` (see table-3).
+* `SW Test Asset`_ location and type of test should be known as a prerequisite.
+* To configure the ASTE tests, aste specific properties are required in addition to those in table-1
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`SW Test Asset`: http://s60wiki.nokia.com/S60Wiki/MC_SW_Test_Asset_documentation
+</#if>
+
+.. csv-table:: Table: ATS - ASTE properties
+ :header: "Property name", "Edit status", "Description"
+
+ ":hlm-p:`ats.aste.testasset.location`", "[must]", ":hlm-p:`ats.aste.testasset.location[documentation]`"
+ ":hlm-p:`ats.aste.software.release`", "[must]", ":hlm-p:`ats.aste.software.release[documentation]`"
+ ":hlm-p:`ats.aste.software.version`", "[must]", ":hlm-p:`ats.aste.software.version[documentation]`"
+ ":hlm-p:`ats.aste.testasset.caseids`", "[recommended]", ":hlm-p:`ats.aste.testasset.caseids[documentation]`"
+ ":hlm-p:`ats.aste.language`", "[recommended]", ":hlm-p:`ats.aste.language[documentation]`"
+ ":hlm-p:`ats.aste.test.type`", "[recommended]", ":hlm-p:`ats.aste.test.type[documentation]`"
+ ":hlm-p:`ats.aste.plan.name`", "[recommended]", ":hlm-p:`ats.aste.plan.name[documentation]`"
+ ":hlm-p:`ats.aste.testrun.name`", "[recommended]", ":hlm-p:`ats.aste.testrun.name[documentation]`"
+ ":hlm-p:`ats.aste.email.list`", "[recommended]", ":hlm-p:`ats.aste.email.list[documentation]`"
+
+
+An example of setting up ASTE properties:
+
+.. code-block:: xml
+
+ <property name="ats.aste.testasset.location" value="" />
+ <property name="ats.aste.software.release" value="SPP 51.32" />
+ <property name="ats.aste.software.version" value="W810" />
+ <property name="ats.aste.testasset.caseids" value="100,101,102,104,106," />
+ <property name="ats.aste.language" value="English" />
+ <property name="ats.aste.test.type" value="smoke" />
+ <property name="ats.aste.plan.name" value="plan" />
+ <property name="ats.aste.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{major.version}.${r'$'}{minor.version}" />
+ <property name="ats.aste.email.list" value="temp.user@company.com; another.email@company.com" />
+
+
+EUnit
+-----
+* Test framework is selected if there is a library ``eunit.lib`` in the ``.mmp`` file of a test component
+* Following EUnit specific properties are required in addition to those in table-1 and table-2.
+
+.. csv-table:: Table: ATS - ASTE properties
+ :header: "Property name", "Edit status", "Description"
+
+ ":hlm-p:`eunit.test.package`", "[allowed]", ":hlm-p:`eunit.test.package[documentation]`"
+ ":hlm-p:`eunitexerunner.flags`", "[allowed]", ":hlm-p:`eunitexerunner.flags[documentation]`"
+
+
+An example of setting up ASTE properties as in the above table:
+
+.. code-block:: xml
+
+ <property name="eunit.test.package" value="" />
+ <property name="eunitexerunner.flags" value="/E S60AppEnv /R Off" />
+
+
+MTF
+---
+* The test framework is selected if there is a library ``testframeworkclient.lib`` in the ``.mmp`` file of a test component
+* There is no MTF specific configuration for Helium in addition to those in table-1 and table-2.
+
+
+QtTest
+------
+* The test framework is selected if there is a library ``QtTest.lib`` in the ``.mmp`` file of a test component
+* There are several ``.PKG`` files created after executing ``qmake``, but only one is selected based on a set target platform. See (:hlm-p:`ats.target.platform`) description in table-2.
+* Properties in table-1 and table-2 should also be configured.
+
+
+RTest
+-----
+* The test framework is selected if there is a library ``euser.lib`` and a comment ``//RTEST``in the ``.mmp`` file of a test component.
+* There is no RTest specific configuration for Helium in addition to those in table-1 and table-2.
+
+
+STF
+---
+* The test framework is selected if there is ``ModuleName=TEFTESTMODULE`` in ``.ini`` file of a component.
+* There is no STF specific configuration for Helium in addition to those in table-1 and table-2.
+* To enable STF for ATS set, :hlm-p:`ats.stf.enabled` (see table-3). By default this is not enabled.
+
+
+STIF
+----
+* The test framework is selected if there is a library ``stiftestinterface.lib`` in the ``.mmp`` file of a test component
+* There is no STIF specific configuration for Helium in addition to those in table-1 and table-2.
+
+
+SUT
+---
+* The test framework is selected if there is a library ``symbianunittestfw.lib`` in the ``.mmp`` file of a test component
+* There is no SUT specific configuration for Helium in addition to those in table-1 and table-2.
+
+
+TEF
+---
+* The test framework is selected if there is a library ``testframeworkclient.lib`` in the ``.mmp`` file of a test component
+* There is no TEF specific configuration for Helium in addition to those in table-1 and table-2.
+
+
+TDriver
+-------
+* TDriver tests can be enabled by setting :hlm-p:`ats.tdriver.enabled` (see table-3).
+* TDriver Test Asset location should be known as a prerequisite.
+* Following TDriver specific properties are required in addition to those in table-1.
+
+
+.. csv-table:: Table: ATS Ant properties
+ :header: "Property name", "Edit status", "Description"
+
+ ":hlm-p:`ats.tdriver.enabled`", "[must]", ":hlm-p:`ats.tdriver.enabled[documentation]`"
+ ":hlm-p:`tdriver.asset.location`", "[must]", ":hlm-p:`tdriver.asset.location[documentation]`"
+ ":hlm-p:`tdriver.test.profiles`", "[must]", ":hlm-p:`tdriver.test.profiles[documentation]`"
+ ":hlm-p:`tdriver.tdrunner.enabled`", "[must]", ":hlm-p:`tdriver.tdrunner.enabled[documentation]`"
+ ":hlm-p:`tdriver.test.timeout`", "[must]", ":hlm-p:`tdriver.test.timeout[documentation]`"
+ ":hlm-p:`tdriver.parameters`", "[must]", ":hlm-p:`tdriver.parameters[documentation]`"
+ ":hlm-p:`tdriver.sis.files`", "[must]", ":hlm-p:`tdriver.sis.files[documentation]`"
+ ":hlm-p:`tdriver.tdrunner.parameters`", "[must]", ":hlm-p:`tdriver.tdrunner.parameters[documentation]`"
+ ":hlm-p:`tdriver.template.file`", "[allowed]", ":hlm-p:`tdriver.template.file[documentation]`"
+
+
+An example of setting up TDriver properties:
+
+.. code-block:: xml
+
+ <property name="ats.tdriver.enabled" value="true" />
+ <property name="tdriver.asset.location" value="\\server\share\tdriver_testcases, x:\dir\tdriver_testcases," />
+ <property name="tdriver.test.profiles" value="bat, fute" />
+ <property name="tdriver.tdrunner.enabled" value="true" />
+ <property name="tdriver.test.timeout" value="1200" />
+ <property name="tdriver.parameters" value="x:\dir\tdriverparameters\tdriver_parameters.xml" />
+ <property name="tdriver.sis.files" value="x:\sisfiles\abc.sis#f:\data\abc.sis#C:\abc.sis, x:\sisfiles\xyz.sis#f:\data\xyz.sis#F:\xyz.sis" />
+ <property name="tdriver.tdrunner.parameters" value="--ordered" />
+ <property name="tdriver.template.file" value="x:\dir\templates\tdriver_template_2.xml" />
+
+
+* To execute the tests, :hlm-t:`tdriver-test` target should be called.
+* To create custom templates for TDriver, read `Instructions for creating TDriver custom template`_.
+
+
+.. _`Instructions for creating TDriver custom template`: tdriver_template_instructions.html
+
+
+
+Test Automation Features
+========================
+
+CTC (Code Coverage)
+-------------------
+
+* To enable ctc for ATS set, :hlm-p:`ats.ctc.enabled` (see table-3).
+* To compile components for CTC see `configure CTC for SBS`_
+
+.. _`configure CTC for SBS`: ../helium-antlib/sbsctc.html
+
+* Once ATS tests have finished results for CTC will be shown in Diamonds.
+* The following are optional CTC properties
+
+.. csv-table:: Table: ATS Ant properties
+ :header: "Property name", "Edit status", "Description"
+
+ "``ctc.instrument.type``", "[allowed]", "Sets the instrument type"
+ "``ctc.build.options``", "[allowed]", "Enables optional extra arguments for CTC, after importing a parent ant file."
+
+
+For example,
+
+.. code-block:: xml
+
+ <property name="ctc.instrument.type" value="m" />
+
+ <import file="../../build.xml" />
+
+ <hlm:argSet id="ctc.build.options">
+ <arg line="-C OPT_ADD_COMPILE+-DCTC_NO_START_CTCMAN" />
+ </hlm:argSet>
+
+Or
+
+.. code-block:: xml
+
+ <hlm:argSet id="ctc.build.options">
+ <arg line='-C "EXCLUDE+*\sf\os\xyz\*,*\tools\xyz\*"'/>
+ </hlm:argSet>
+
+
+See `more information on code coverage`_.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`more information on code coverage`: http://s60wiki.nokia.com/S60Wiki/CTC
+<#else>
+.. _`more information on code coverage`: http://developer.symbian.org/wiki/index.php/Testing_Guidelines_for_Package_Releases#Code_coverage
+</#if>
+
+
+
+Customized test XML files
+-------------------------
+
+The user can customize the generated test.xml with files:
+
+* **preset_custom.xml** goes before first set
+* **postset_custom.xml** goes after last set
+* **precase_custom.xml** goes before first case
+* **postcase_custom.xml** goes after last case
+* **prestep_custom.xml** goes before first step
+* **poststep_custom.xml** goes after last step
+* **prerun_custom.xml** goes before first run or execute step
+* **postrun_custom.xml** goes after last run or execute step
+* **prepostaction.xml** goes before first postaction
+* **postpostaction.xml** goes after last postaction
+
+The files must be in the directory 'custom' under the 'tsrc' or 'group' folder to be processed.
+
+The files need to be proper XML snippets that fit to their place. In case of an error an error is logged and a comment inserted to the generated XML file.
+
+A postaction section customization file (prepostaction.xml or postpostaction.xml) could look like this
+
+.. code-block:: xml
+
+ <action>
+ <type>RunProcessAction</type>
+ <parameters>
+ <parameter value="java" name="command"/>
+ <parameter value="-version" name="parameters"/>
+ </parameters>
+ </action>
+
+The ``prestep_custom.xml`` can be used to flash and unstall something custom.
+
+.. code-block:: xml
+
+ <task>
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="Nokia_Energy_Profiler_1_1.sisx"/>
+ <parameter name="dst" value="c:\data\Nokia_Energy_Profiler_1_1.sisx"/>
+ <parameter name="reboot-retry-count" value="1"/>
+ <parameter name="retry-count" value="1"/>
+ </parameters>
+ </task>
+
+
+
+And then the ``prerun_custom.xml`` can be used to execute a task.
+
+.. code-block:: xml
+
+ <task>
+ <type>NonTestExecuteTask</type>
+ <parameters>
+ <parameter value="true" name="local"/>
+ <parameter value="daemon.exe" name="file"/>
+ <parameter value="test.cfg" name="parameters"/>
+ <parameter value="true" name="async"/>
+ <parameter value="my_daemon" name="pid"/>
+ </parameters>
+ </task>
+
+**Note:** The users is expected to check the generated test.xml manually, as there is no validation. Invalid XML input files will be disregarded and a comment will be inserted to the generated XML file.
+
+
+Custom templates/drops
+----------------------
+* If you need to send a static drop to ATS then you can call the target :hlm-t:`ats-custom-drop`.
+* An example template is in helium/tools/testing/ats/templates/ats4_naviengine_template.xml
+* Then set a property to your own template, as follows.
+
+.. code-block:: xml
+
+ <property name="ats.custom.template" value="path/to/mytemplate.xml" />
+
+
+Overriding XML values
+---------------------
+* Set the property ``ats.config.file`` to the location of the config file.
+
+Example configuration:
+
+.. code-block:: xml
+
+ <ATSConfigData>
+ <config name="common" abstract="true">
+
+ <!-- Properties to add/ modify -->
+ <config type="properties">
+ <set name="HARNESS" value="STIF" />
+ <set name="2" value="3" />
+ </config>
+
+ <!-- Settings to add/ modify -->
+ <config type="settings">
+ <set name="HARNESS" value="STIF" />
+ <set name="2" value="3" />
+ </config>
+
+ <!-- Attributes to modify -->
+ <config type="attributes">
+ <set name="xyz" value="2" />
+ <set name="significant" value="true" />
+ </config>
+ </config>
+ </ATSConfigData>
+
+
+Delta testing
+-------------
+
+
+Multiset support
+----------------
+* Enable the feature by setting property :hlm-p:`ats.multiset.enabled` to ``true``.
+* If enabled, a 'set' in test.xml, is used for each pkg file in a component, this allows tests to run in parallel on several devices.
+
+ROM Bootup Tests
+----------------
+* ROM images can be tested on ATS by executing target ":hlm-t:`ats-bootup-test`". This feature is useful to test whther the created ROM images boot-up a device or not .
+* To enable this feature, set a property ":hlm-p:`ats.bootuptest.enabled`" (see table-3)
+* In addition to enable the feature, properties in the table-1 are also required.
+
+
+Single/Multiple test drops creation
+-----------------------------------
+* It is mentioned earlier in Step 1, that components can be grouped together.
+* During automation, separate TestDrops are created based on these groups.
+* This grouping can be neglected and a single test drop can be created by setting a property :hlm-p:`ats.singledrop.enabled` By default the value is 'false'. For example,
+
+
+.. code-block:: xml
+
+ <property name="ats.singledrop.enabled" value="true" />
+
+
+
+Skip uploading test drops
+-------------------------
+* ``ats-test`` target can only create a drop file, and does not send the drop (or package) to ATS server.
+* To use the feature, set the following property to ``flase``.
+
+.. code-block:: xml
+
+ <property name="ats.upload.enabled" value="false" />
+
+
+<#if !(ant?keys?seq_contains("sf"))>
+
+Support for multiple products (ROM images)
+------------------------------------------
+
+See: `Instructions for setting up multiple roms and executing specific tests`_.
+
+.. _`Instructions for setting up multiple roms and executing specific tests`: http://helium.nmp.nokia.com/doc/ido/romandtest.html
+
+
+</#if>
+
+
+Testing with Winscw Emulator
+----------------------------
+* If enabled, ``ats-test`` target creates a zip of build area instead of images for use by emulator on ATS server.
+* Set a property as follows.
+
+.. code-block:: xml
+
+ <property name="ats.emulator.enable" value="true" />
+
+
+<#if !(ant?keys?seq_contains("sf"))>
+
+Tracing
+-------
+* Currently there isn't a single standard method of doing tracing in Symbian Platform.
+* Application, middleware, driver and kernel developers have used different methods for instrumenting their code. Due to the different methods used, it is inherently difficult to get a coherent overview of the whole platform when debugging and testing sw.
+* Current implementation of Tracing in Helium is based on the instruction given `here`_.
+* Tracing can be enabled by setting :hlm-p:`ats.trace.enabled` to ``true`` (see table-3).
+
+.. _`here`: http://s60wiki.nokia.com/S60Wiki/Tracing
+
+</#if>
+
+
+Troubleshooting TA
+==================
+
+.. csv-table:: Table: Trouble shooting test automation
+ :header: "Type", "Description", "Possible solution"
+
+ "Error", "'*<path>*' not found", "Either the PKG file does not exist or incorrect filename."
+ "Error", "No test modules found in '*<path>*'", "This error is raised when there is no test components available. Check that your components are in the SystemDefinition files, and that the filters are set accordingly to the test asset documentation and that the components actually exists in the asset."
+ "Error", "'*<path>*' - test source not found", "Path in the bld.inf file is either incorrect or the component does not exist."
+ "Error", "Not enough flash files: # defined, # needed", "Check property :hlm-p:`ats.flashfiles.minlimit`. Selected ROM images files # is lesser than the required no. of files. This error can also be eliminated by reducing the value of the property."
+ "Error", "'CPP failed: '<command>' in: '*<path>*'", "Check the path and/or the file. There can be broken path in the file or mising directives and macros."
+ "Error", "*<path>* - test sets are empty", "missing/invalid deirectives and/or project macros. The .mmp file ca be missing."
+
+
--- a/buildframework/helium/doc/src/manual/stage_ats.rst.inc.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,506 +0,0 @@
-<#--
-============================================================================
-Name : stage_ats.rst.inc.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-
-.. index::
- single: ATS - STIF, TEF, RTEST, MTF and EUnit
-
-.. _`Stage-ATS-label`:
-
-Stage: ATS - STIF, TEF, RTEST, MTF and EUnit (also Qt)
-=======================================================
-
-ATS testing is the automatic testing of the phone code once it has been compiled and linked to create a ROM image.
-
-Explanation of the process for getting ATS (`STIF`_ and `EUnit`_) tests compiled and executed by Helium, through the use of the :hlm-t:`ats-test` target.
-
-http://developer.symbian.org/wiki/index.php/Symbian_Test_Tools
-
-<#if !(ant?keys?seq_contains("sf"))>
-.. _`STIF`: http://s60wiki.nokia.com/S60Wiki/STIF
-.. _`EUnit`: http://s60wiki.nokia.com/S60Wiki/EUnit
-</#if>
-
-.. image:: ats.dot.png
-
-Prerequisites
-----------------
-
-* `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image.
-* The reader is expected to already have a working ATS setup in which test cases can be executed. ATS server names,
- access rights and authentication etc. is supposed to be already taken care of.
-
-<#if !(ant?keys?seq_contains("sf"))>
-.. _`Harmonized Test Interface (HTI)`: http://s60wiki.nokia.com/S60Wiki/HTI
-<#else>
-.. _`Harmonized Test Interface (HTI)`: http://developer.symbian.org/wiki/index.php/HTI_Tool
-</#if>
-
-Test source components
--------------------------
-
-Test source usually lives in a component's ``tsrc`` directory. Test source components are created like any other Symbian SW component;
-there is a ``group`` directory with a ``bld.inf`` file for building, ``.mmp`` files for defining the targets, and so on.
-
-The test generation code expects ``.pkg`` file in the ``group`` directory of test component to be compiled, to get the paths of the files
-(can be data, configuration, initialization, etc files) to be installed and where to install on the phone.
-
-
-Three STEPS to setup ATS with Helium
---------------------------------------
-
-**Step 1: Configure System Definition Files**
- If the tsrc directory structure meets the criteria defined in the `new API test automation guidelines`_, then test components
- should be included in the System Definition files.
-
-**System Definition Files supporting layers.sysdef.xml**
- **layers** in ``layers.sysdef.xml`` file and **configuration** in ``build.sysdef.xml`` file (`Structure of System Definition files version 1.4`_).
-
- <#if !(ant?keys?seq_contains("sf"))>
-.. _`new API test automation guidelines`: http://s60wiki.nokia.com/S60Wiki/Test_Asset_Guidelines
-.. _`Structure of System Definition files version 1.4`: http://delivery.nmp.nokia.com/trac/helium/wiki/SystemDefinitionFiles
-</#if>
-
-A template of layer in layers.sysdef.xml for system definition files
-
-.. code-block:: xml
-
- <layer name="name_test_layer">
- <module name="module_name_one">
- <unit unitID="unit_id1" name="unit_name1" bldFile="path_of_tsrc_folder_to_be_built" mrp="" />
- </module>
-
- <module name="module_name_two">
- <unit unitID="unit_id2" name="unit_name2" bldFile="path_of_tsrc_folder_to_be_built" mrp="" />
- </module>
- </layer>
-
-* Layer name should end with **_test_layer**
-* Two standard names for ATS test layers are being used; ``unit_test_layer`` and ``api_test_layer``. Test components (the``unit`` tags)
- should be specified under these layers and grouped by ``module`` tag(s).
-* In the above, two modules means two drop files will be created; ``module`` may have one or more ``unit``
-* By using property ``exclude.test.layers``, complete layers can be excluded and the components inside that layer will not be included in the AtsDrop. This property is a comma (,) separated list
-
-**System Definition Files version 3.0 (SysDefs3)** (new Helium v.10.79)
- The `structure of System Definition files version 3.0`_ is different than previous versions of system definition files. In SysDefs3, package definition files are used for components specification. Instead of layers naming conventions, filters are used to identify test components and test types, for example: "test, unit_test, !api_test" etc.
-
-<#if !(ant?keys?seq_contains("sf"))>
-.. _`structure of System Definition files version 3.0`: http://wikis.in.nokia.com/view/SWManageabilityTeamWiki/PkgdefUse
-<#else>
-.. _`structure of System Definition files version 3.0`: sysdef3.rst
-</#if>
-
-An example template for defining test components in a package definition file.
-
-.. code-block:: xml
-
- <package id="dummytest" name="dummytest" levels="demo">
- <collection id="test_nested" name="test_nested" level="demo">
-
- <component id="tc1" name="tc1" purpose="development" filter="test, unit_test">
- <unit bldFile="test_nested/tc1/group" mrp="" />
- </component>
-
- <component id="tc2" name="tc2" purpose="development" filter="test">
- <meta rel="testbuild">
- <group name="drop_tc2_and_tc3" />
- </meta>
- <unit bldFile="test_nested/tc2/group" mrp="" />
- </component>
-
- <component id="tc3" name="tc3" purpose="development" filter="test">
- <meta rel="testbuild">
- <group name="drop_tc2_and_tc3" />
- </meta>
- <unit bldFile="test_nested/tc3/group" mrp="" />
- </component>
-
- </collection>
- </package>
-
-* Filter "test" must be specified for every test component. If it is not specified, the component will not be considered as a test component.
-* <meta>/<group> are now used to group test components, it work in the same way as <module>...<module> in sysdef v1.4 works. The components having same group name are grouped together.
- Separate drop files are created for different groups. In the above example, if only 'test' is selected, then two drop files will be created, one with tc1 and the other one with tc2 and tc3.
-
-
-**Step 2: Configure ATS properties in build.xml**
-
-**(A)** Username and Password for the ATS should be set in the `.netrc file`_::
-
- machine ats login ats_user_name password ats_password
-
-Add the above line in the ``.netrc`` file and replace ``ats_user_name`` with your real ATS username and ``ats_password`` with ATS password.
-
-**(B)** The following properties are ATS dependent with their edit status
-
-* [must] - must be set by user
-* [recommended] - should be set by user but not mandatory
-* [allowed] - should **not** be set by user however, it is possible.
-
-.. csv-table:: ATS Ant properties
- :header: "Property name", "Edit status", "Description"
-
- ":hlm-p:`ats.server`", "[must]", "For example: ``4fix012345`` or ``catstresrv001.company.net:80``. Default server port is ``8080``, but it is not allowed between intra and Noklab. Because of this we need to define server port as 80. The host can be different depending on site and/or product."
- ":hlm-p:`ats.drop.location`", "[allowed]", "Server location (UNC path) to save the ATSDrop file, before sending to the ATS Server. For example: ``\\\\trwsem00\\some_folder\\``. In case, :hlm-p:`ats.script.type` is set to ``import``, ATS doesn't need to have access to :hlm-p:`ats.drop.location`, its value can be any local folder on build machine, for example ``c:/temp`` (no network share needed)."
- ":hlm-p:`ats.product.name`", "[must]", "Name of the product to be tested."
- ":hlm-p:`eunit.test.package`", "[allowed]", "The EUnit package name to be unzipped on the environment, for executing EUnit tests."
- ":hlm-p:`eunitexerunner.flags`", "[allowed]", "Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to ``/E S60AppEnv /R Off``."
- ":hlm-p:`ats.email.list`", "[allowed]", "The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon-separated email addresses."
- ":hlm-p:`ats.report.type`", "[allowed]", "Value of the ats email report, for ATS4 set to 'no_attachment' so email size is reduced"
- ":hlm-p:`ats.flashfiles.minlimit`", "[allowed]", "Limit of minimum number of flash files to execute :hlm-t:`ats-test` target, otherwise ``ATSDrop.zip`` will not be generated. Default value is 2 files."
- ":hlm-p:`ats.plan.name`", "[allowed]", "Modify the plan name if you have understanding of ``test.xml`` file or leave it as it is. Default value is ``plan``."
- ":hlm-p:`ats.product.hwid`", "[allowed]", "Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set."
- ":hlm-p:`ats.script.type`", "[allowed]", "There are two types of ats script files to send drop to ATS server, ``runx`` and ``import``; only difference is that with ``import`` ATS doesn't have to have access rights to ``testdrop.zip`` file, as it is sent to the system over http and import doesn't need network shares. If that is not needed ``import`` should not be used. Default value is ``runx`` as ``import`` involves heavy processing on ATS server."
- ":hlm-p:`ats.target.platform`", "[allowed]", "Sets target platform for compiling test components. Default value is ``armv5 urel``."
- ":hlm-p:`ats.test.timeout`", "[allowed]", "To set test commands execution time limit on ATS server, in seconds. Default value is ``60``."
- ":hlm-p:`ats.testrun.name`", "[allowed]", "Modify the test-run name if you have understanding of ``test.xml`` file or leave it as it is. Default value is a string consist of build id, product name, major and minor versions."
- ":hlm-p:`ats.trace.enabled`", "[allowed]", "Should be ``true`` if tracing is needed during the tests running on ATS. Default value is ``false``, the values are case-sensitive. See http://s60wiki.nokia.com/S60Wiki/CATS/TraceTools."
- ":hlm-p:`ats.ctc.enabled`", "[allowed]", "Should be ``true`` if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Default value is ``false``. The values are case-sensitive."
- ":hlm-p:`ats.ctc.host`", "[allowed]", "CTC host, provided by CATS used to create coverage measurement reports. MON.sym files are copied to this location, for example ``10.0.0.1``. If not given, code coverage reports are not created"
- ":hlm-p:`ats.obey.pkgfiles.rule`", "[allowed]", "If the property is set to ``true``, then the only test components which will have PKG files, will be included into the ``test.xml`` as a test-set. Which means, even if there's a test component (executable) but there's no PKG file, it should not be considered as a test component and hence not included into the test.xml as a separate test. By default the property value is ``false``."
- "``reference.ats.flash.images``", "[allowed]", "Fileset for list of flash images (can be .fpsx, .C00, .V01 etc) It is recommended to set the fileset, default filset is given below which can be overwritten. set *dir=""* attribute of the filset to ``${r'$'}{build.output.dir}/variant_images`` if hlm-t:`variant-image-creation` target is being used."
- ":hlm-p:`tsrc.data.dir`", "[allowed]", "The default value is ``data`` and refers to the 'data' directory under 'tsrc' directory."
- ":hlm-p:`tsrc.path.list`", "[allowed]", "Contains list of the tsrc directories. Gets the list from system definition layer files. Assuming that the test components are defined already in te ``layers.sysdef.xml`` files to get compiled. Not recommended, but the property value can be set if there are no System Definition file(s), and tsrc directories paths to set manually."
- ":hlm-p:`ats.report.location`", "[allowed]", "Sets ATS reports store location. Default location is ``${r'$'}{publish.dir}/${r'$'}{publish.subdir}``."
- ":hlm-p:`ats.multiset.enabled`", "[allowed]", "Should be ``true`` so a set is used for each pkg file in a component, this allows tests to run in parallel on several devices."
- ":hlm-p:`ats.diamonds.signal`", "[allowed]", "Should be ``true`` so at end of the build diamonds is checked for test results and Helium fails if tests failed."
- ":hlm-p:`ats.delta.enabled`", "[allowed]", "Should be ``true`` so only ADOs changed during :hlm-t:`do-prep-work-area` are tested by ATS."
- ":hlm-p:`ats4.enabled`", "[allowed]", "Should be ``true`` if ATS4 is to be used."
- ":hlm-p:`ats.emulator.enable`", "[allowed]", "Should be ``true`` if ``WINSCW`` emulator is to be used."
- ":hlm-p:`ats.specific.pkg`", "[allowed]", "Text in name of PKG files to use eg. 'sanity' would only use xxxsanity.pkg files from components."
- ":hlm-p:`ats.singledrop.enabled`", "[allowed]", "If present and set to 'true', it will create one drop file, if set to any other value or not present it will create multiple drop files (defined by the sysdef file). This is to save traffic to the server."
- ":hlm-p:`ats.java.importer.enabled`", "[allowed]", "If set to 'true', for older uploader is used for ats3 which shows improved error message."
- ":hlm-p:`ats.test.filterset`", "[allowed]", "(new Helium v.10.79)Contains a name of test filterset (see example below). A filterset is used to select/unselect test components. The filter(s) is/are effective when the same filters are defined in the package definition file for component(s)."
-
-An example of setting up properties:
-
-.. code-block:: xml
-
- <property name="ats.server" value="4fio00105" />
- <property name="ats.drop.location" location="\\trwsimXX\ATS_TEST_SHARE\" />
- <property name="ats.email.list" value="temp.user@company.com; another.email@company.com" />
- <property name="ats.flashfiles.minlimit" value="2" />
- <property name="ats.product.name" value="PRODUCT" />
- <property name="ats.plan.name" value="plan" />
- <property name="ats.product.hwid" value="" />
- <property name="ats.script.type" value="runx" />
- <property name="ats.target.platform" value="armv5 urel" />
- <property name="ats.test.timeout" value="60" />
- <property name="ats.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{major.version}.${r'$'}{minor.version}" />
- <property name="ats.trace.enabled" value="false" />
- <property name="ats.ctc.enabled" value="false" />
- <property name="ats.obey.pkgfiles.rule" value="false" />
- <property name="ats.report.location" value="${r'$'}{publish.dir}/${r'$'}{publish.subdir}" />
- <property name="eunit.test.package" value="" />
- <property name="eunitexerunner.flags" value="/E S60AppEnv /R Off" />
- <property name="ats.test.filterset" value="sysdef.filters.tests" />
-
- <hlm:sysdefFilterSet id="sysdef.filters.tests">
- <filter filter="test, " type="has" />
- <config file="bldvariant.hrh" includes="" />
- </hlm:sysdefFilterSet>
-
-
- ...
- <import file="${r'$'}{helium.dir}/helium.ant.xml" />
- ...
-
- <fileset id="reference.ats.flash.images" dir="${r'$'}{release.images.dir}">
- <include name="**/${r'$'}{build.id}*.core.fpsx"/>
- <include name="**/${r'$'}{build.id}*.rofs2.fpsx"/>
- <include name="**/${r'$'}{build.id}*.rofs3.fpsx"/>
- </fileset>
-
-
-.. Note::
-
- Always declare *Properties* before and *filesets* after importing helium.ant.xml.
-
-**STEP 3: Call target ats-test**
-
-To execute the target, a property should be set(``<property name="ats.enabled" value="true" />``).
-
-Then call :hlm-t:`ats-test`, which will create the ATSDrop.zip (test package).
-
-If property *ats.email.list* is set, an email (test report) will be sent when the tests are ready on ATS.
-
-CTC:
-----
-
-CTC code coverage measurements reports can be created as part of Test Automation process.
-
-1. Build the src using ``build_ctc`` configuration, which is in ``build.sysdef.xml`` file, to create ``MON.sym`` files. It means that a property ``sysdef.configurations.list`` should be modified either add or replace current build configuration with ``build_ctc``
-
-2. Set the property, ``ats.ctc.host``, as described above, for sending the ``MON.sym`` files to the network drive. *(Please contact ATS server administrator and ask for the value to set this property)*
-
-3. Enable CTC process by setting up property ``ats.ctc.enabled`` to "true"
-
-4. Test drops are sent to the ATS server, where, after executing tests ``ctcdata.txt`` files are created. ``ctcdata.txt`` and ``MON.sym`` files are then further processed to create code coverage reports.
-
-5. View or download the Code coverage reports by following the link provided in the ATS report email (sent after the tests are executed on ATS)
-
-*NOTE: After receiving the email notification, it may take a few minutes before the code coverage reports are available.*
-
-
-Qt Tests:
----------
-
-QtTest.lib is supported and the default harness is set to EUnit. If ``QtTest.lib`` is there in ``.mmp`` file, Helium sets the Harness to Eunit and ATS supported Qt steps are added to test.xml file
-
-In ``layers.sysdef.xml`` file, the layer name should end with "_test_layer" e.g. "qt_unit_test_layer".
-
-There are several ``.PKG`` files created after executing ``qmake``, but only one is selected based on which target platform is set. Please read the property (``ats.target.platform``) description above.
-
-.. _`Skip-Sending-AtsDrop-label`:
-
-Skip Sending AtsDrop to ATS
-----------------------------
-
-By setting property of ``ats.upload.enabled`` to ``false``, ``ats-test`` target only creates a drop file, and does not send the drop (or package) to ATS server.
-
-Customizing the test.xml in ATS
---------------------------------
-
-The user can customize the generated test.xml with files:
-
-* **preset_custom.xml** goes before first set
-* **postset_custom.xml** goes after last set
-* **precase_custom.xml** goes before first case
-* **postcase_custom.xml** goes after last case
-* **prestep_custom.xml** goes before first step
-* **poststep_custom.xml** goes after last step
-* **prerun_custom.xml** goes before first run or execute step
-* **postrun_custom.xml** goes after last run or execute step
-* **prepostaction.xml** goes before first postaction
-* **postpostaction.xml** goes after last postaction
-
-The files must be in the directory 'custom' under the 'tsrc' or 'group' folder to be processed.
-
-The files need to be proper XML snippets that fit to their place. In case of an error an error is logged and a comment inserted to the generated XML file.
-
-A postaction section customization file (prepostaction.xml or postpostaction.xml) could look like this
-
-.. code-block:: xml
-
- <postAction>
- <type>Pre PostAction from custom file</type>
- <params>
- <param name="foo2" value="bar2" />
- </params>
- </postAction>
-
-
-
-The ``prestep_custom.xml`` can be used to flash and unstall something custom.
-
-.. code-block:: xml
-
- <step name="Install measurement tools" harness="STIF" significant="false">
- <!-- Copy SIS-packages to DUT -->
- <command>install</command>
- <params>
- <param src="Nokia_Energy_Profiler_1_1.sisx"/>
- <param dst="c:\data\Nokia_Energy_Profiler_1_1.sisx"/>
- </params>
- ...
- </step>
-
-
-And then the ``prerun_custom.xml`` can be used to start measuring.
-
-.. code-block:: xml
-
- <step name="Start measurement" harness="STIF" significant="false">
- <!-- Start measurement -->
- <command>execute</command>
- <params>
- <param file="neplauncher.exe"/>
- <param parameters="start c:\data\nep.csv"/>
- <param timeout="30"/>
- </params>
- </step>
-
-
-
-**Note:** The users is expected to check the generated test.xml manually, as there is no validation. Invalid XML input files will be disregarded and a comment will be inserted to the generated XML file.
-
-Overriding Test xml values
---------------------------
-
-Set the property ``ats.config.file`` to the location of the config file.
-
-Example configuration:
-
-.. code-block:: xml
-
- <ATSConfigData>
- <config name="common" abstract="true">
-
- <!-- Properties to add/ modify -->
- <config type="properties">
- <set name="HARNESS" value="STIF" />
- <set name="2" value="3" />
- </config>
-
- <!-- Settings to add/ modify -->
- <config type="settings">
- <set name="HARNESS" value="STIF" />
- <set name="2" value="3" />
- </config>
-
- <!-- Attributes to modify -->
- <config type="attributes">
- <set name="xyz" value="2" />
- <set name="significant" value="true" />
- </config>
- </config>
- </ATSConfigData>
-
-
-.. index::
- single: ATS - ASTE
-
-Stage: ATS - ASTE
-===================
-
-Explanation of the process for getting ATS `ASTE`_ tests compiled and executed by Helium, through the use of the :hlm-t:`ats-aste` target.
-
-<#if !(ant?keys?seq_contains("sf"))>
-.. _`ASTE`: http://s60wiki.nokia.com/S60Wiki/ASTE
-</#if>
-
-Prerequisites
---------------
-
-* `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image.
-* The reader is expected to already have a working ATS setup in which test cases can be executed. ATS server names, access rights and authentication etc. is supposed to be already taken care of.
-* `SW Test Asset`_ location and type of test should be known.
-
-<#if !(ant?keys?seq_contains("sf"))>
-.. _`Harmonized Test Interface (HTI)`: http://s60wiki.nokia.com/S60Wiki/HTI
-.. _`SW Test Asset`: http://s60wiki.nokia.com/S60Wiki/MC_SW_Test_Asset_documentation
-</#if>
-
-Test source components
---------------------------
-
-Unlike STIF, EUnit etc tests, test source components (or ``tsrc`` structure) is not needed for `ASTE`_ tests.
-
-Two STEPS to setup ASTE with Helium
-------------------------------------
-
-**STEP 1: Configure ASTE properties in build.xml**
-
-**(A)** Username and Password for the ATS should be set in the `.netrc file`_
-
-.. code-block:: text
-
- machine ats login ats_user_name password ats_password
-
-Add the above line in the .netrc file and replace *ats_user_name* with your real ats username and "ats_password" with ats password.
-
-.. _`.netrc file`: configuring.html?highlight=netrc#passwords
-
-
-**(B)** The following properties are ASTE dependent with their edit status
-
-* [must] - must be set by user
-* [recommended] - should be set by user but not mandatory
-* [allowed] - should **not** be set by user however, it is possible.
-
-.. csv-table:: ATS Ant properties
- :header: "Property name", "Edit status", "Description"
-
- ":hlm-p:`ats.server`", "[must]", "For example: ``4fio00105`` or ``catstresrv001.company.net:80``. Default server port is ``8080``, but it is not allowed between intra and Noklab. Because of this we need to define server port as ``80``. The host can be different depending on site and/or product."
- ":hlm-p:`ats.drop.location`", "[must]", "Server location (UNC path) to save the ATSDrop file, before sending to the ATS. For example: ``\\\\trwsem00\\some_folder\\``. In case, ``ats.script.type`` is set to ``import``, ATS doesn't need to have access to :hlm-p:`ats.drop.location`, its value can be any local folder on build machine, for example ``c:/temp`` (no network share needed)."
- ":hlm-p:`ats.product.name`", "[must]", "Name of the product to be tested."
- ":hlm-p:`ats.aste.testasset.location`", "[must]", "Location of SW Test Assets, if the TestAsset is not packaged then it is first compressed to a ``.zip`` file. It should be a UNC path."
- ":hlm-p:`ats.aste.software.release`", "[must]", "Flash images releases, for example 'SPP 51.32'."
- ":hlm-p:`ats.aste.software.version`", "[must]", "Version of the software to be tested. For example: 'W810'"
- ":hlm-p:`ats.aste.email.list`", "[recommended]", "The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses."
- ":hlm-p:`ats.flashfiles.minlimit`", "[recommended]", "Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files."
- ":hlm-p:`ats.aste.plan.name`", "[recommended]", "Modify the plan name if you have understanding of test.xml file or leave it as it is. Default value is "plan"."
- ":hlm-p:`ats.product.hwid`", "[recommended]", "Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set."
- ":hlm-p:`ats.test.timeout`", "[recommended]", "To set test commands execution time limit on ATS server, in seconds. Default value is '60'."
- ":hlm-p:`ats.aste.testrun.name`", "[recommended]", "Modify the test-run name if you have understanding of ``test.xml`` file or leave it as it is. Default value is a string consists of build id, product name, major and minor versions."
- ":hlm-p:`ats.aste.test.type`", "[recommended]", "Type of test to run. Default is 'smoke'."
- ":hlm-p:`ats.aste.testasset.caseids`", "[recommended]", "These are the cases that which tests should be run from the TestAsset. For example, value can be set as ``100,101,102,103,105,106,``. A comma is needed to separate case IDs"
- ":hlm-p:`ats.aste.language`", "[recommended]", "Variant Language to be tested. Default is 'English'"
- "``reference.ats.flash.images``", "[recommended]", "Fileset for list of flash images (can be .fpsx, .C00, .V01 etc) It is recommended to set the fileset, default filset is given below which can be overwritten. set *dir=\"\"* attribute of the filset to ``${r'$'}{build.output.dir}/variant_images`` if :hlm-t:`variant-image-creation` target is being used."
-
-
-An example of setting up properties:
-
-.. code-block:: xml
-
- <property name="ats.server" value="4fio00105" />
- <property name="ats.drop.location" value="\\trwsimXX\ATS_TEST_SHARE\" />
- <property name="ats.aste.email.list" value="temp.user@company.com; another.email@company.com" />
- <property name="ats.flashfiles.minlimit" value="2" />
- <property name="ats.product.name" value="PRODUCT" />
- <property name="ats.aste.plan.name" value="plan" />
- <property name="ats.product.hwid" value="" />
- <property name="ats.test.timeout" value="60" />
- <property name="ats.aste.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{major.version}.${r'$'}{minor.version}" />
- <property name="ats.aste.testasset.location" value="" />
- <property name="ats.aste.software.release" value="SPP 51.32" />
- <property name="ats.aste.test.type" value="smoke" />
- <property name="ats.aste.testasset.caseids" value="100,101,102,104,106," />
- <property name="ats.aste.software.version" value="W810" />
- <property name="ats.aste.language" value="English" />
-
- ...
- <import file="${r'$'}{helium.dir}/helium.ant.xml" />
- ...
-
- <fileset id="reference.ats.flash.images" dir="${r'$'}{release.images.dir}">
- <include name="**/${r'$'}{build.id}*.core.fpsx"/>
- <include name="**/${r'$'}{build.id}*.rofs2.fpsx"/>
- <include name="**/${r'$'}{build.id}*.rofs3.fpsx"/>
- </fileset>
-
-
-*PLEASE NOTE:* Always declare *Properties* before and *filesets* after importing helium.ant.xml.
-
-**STEP 2: Call target ats-aste**
-
-To execute the target, a property should be set(``<property name="enabled.aste" value="true" />``).
-
-Then call :hlm-t:`ats-aste`, which will create the ATSDrop.zip (test package).
-
-If property ``ats.aste.email.list`` is set, an email (test report) will be sent when the tests are ready on ATS/ASTE.
-
-
-Skip Sending AtsDrop to ATS
-------------------------------
-
-click :ref:`Skip-Sending-AtsDrop-label`:
-
-Stage: ATS - Custom Drop
-========================
-
-If you need to send a static drop to ATS then you can call the target :hlm-t:`ats-custom-drop` and set a property to your own template.
-
-A example template is in helium/tools/testing/ats/templates/ats4_naviengine_template.xml
-
-.. code-block:: xml
-
- <property name="ats.custom.template" value="path/to/mytemplate.xml" />
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/stage_ats_old.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,563 @@
+.. ============================================================================
+ Name : stage_ats_old.rst.ftl
+ Part of : Helium
+
+ 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 the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ ============================================================================
+
+.. index::
+ module: TestingOld
+
+
+===========================
+Testing (ATS3/Old Document)
+===========================
+
+This is an old version of document for test automation for the **Helium users using ATS3**.
+
+**ATS4 users** should read `Helium Test Automation User Guide`_ (revised).
+
+.. _`Helium Test Automation User Guide`: stage_ats.html
+
+.. contents::
+
+
+Stage: ATS - STIF, TEF, RTEST, MTF, SUT and EUnit (also Qt)
+===========================================================
+
+ATS testing is the automatic testing of the phone code once it has been compiled and linked to create a ROM image.
+
+Explanation of the process for getting ATS (`STIF`_ and `EUnit`_) tests compiled and executed by Helium, through the use of the :hlm-t:`ats-test` target.
+
+http://developer.symbian.org/wiki/index.php/Symbian_Test_Tools
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`STIF`: http://s60wiki.nokia.com/S60Wiki/STIF
+.. _`EUnit`: http://s60wiki.nokia.com/S60Wiki/EUnit
+</#if>
+
+.. image:: ats.dot.png
+
+Prerequisites
+-------------
+
+* `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image.
+* The reader is expected to already have a working ATS setup in which test cases can be executed. ATS server names,
+ access rights and authentication etc. is supposed to be already taken care of.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`Harmonized Test Interface (HTI)`: http://s60wiki.nokia.com/S60Wiki/HTI
+<#else>
+.. _`Harmonized Test Interface (HTI)`: http://developer.symbian.org/wiki/index.php/HTI_Tool
+</#if>
+
+Test source components
+----------------------
+
+Test source usually lives in a component's ``tsrc`` directory. Test source components are created like any other Symbian SW component;
+there is a ``group`` directory with a ``bld.inf`` file for building, ``.mmp`` files for defining the targets, and so on.
+
+The test generation code expects ``.pkg`` file in the ``group`` directory of test component to be compiled, to get the paths of the files
+(can be data, configuration, initialization, etc files) to be installed and where to install on the phone.
+
+
+Three STEPS to setup ATS with Helium
+------------------------------------
+
+**Step 1: Configure System Definition Files**
+ If the tsrc directory structure meets the criteria defined in the `new API test automation guidelines`_, then test components
+ should be included in the System Definition files.
+
+**System Definition Files supporting layers.sysdef.xml**
+ **layers** in ``layers.sysdef.xml`` file and **configuration** in ``build.sysdef.xml`` file (`Structure of System Definition files version 1.4`_).
+
+ <#if !(ant?keys?seq_contains("sf"))>
+.. _`new API test automation guidelines`: http://s60wiki.nokia.com/S60Wiki/Test_Asset_Guidelines
+.. _`Structure of System Definition files version 1.4`: http://delivery.nmp.nokia.com/trac/helium/wiki/SystemDefinitionFiles
+</#if>
+
+A template of layer in layers.sysdef.xml for system definition files
+
+.. code-block:: xml
+
+ <layer name="name_test_layer">
+ <module name="module_name_one">
+ <unit unitID="unit_id1" name="unit_name1" bldFile="path_of_tsrc_folder_to_be_built" mrp="" />
+ </module>
+
+ <module name="module_name_two">
+ <unit unitID="unit_id2" name="unit_name2" bldFile="path_of_tsrc_folder_to_be_built" mrp="" />
+ </module>
+ </layer>
+
+* Layer name should end with **_test_layer**
+* Two standard names for ATS test layers are being used; ``unit_test_layer`` and ``api_test_layer``. Test components (the``unit`` tags)
+ should be specified under these layers and grouped by ``module`` tag(s).
+* In the above, two modules means two drop files will be created; ``module`` may have one or more ``unit``
+* By using property ``exclude.test.layers``, complete layers can be excluded and the components inside that layer will not be included in the AtsDrop. This property is a comma (,) separated list
+
+**System Definition Files version 3.0 (SysDefs3)** (new Helium v.10.79)
+ The `structure of System Definition files version 3.0`_ is different than previous versions of system definition files. In SysDefs3, package definition files are used for components specification. Instead of layers naming conventions, filters are used to identify test components and test types, for example: "test, unit_test, !api_test" etc.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`structure of System Definition files version 3.0`: http://wikis.in.nokia.com/view/SWManageabilityTeamWiki/PkgdefUse
+<#else>
+.. _`structure of System Definition files version 3.0`: sysdef3.html
+</#if>
+
+An example template for defining test components in a package definition file.
+
+.. code-block:: xml
+
+ <package id="dummytest" name="dummytest" levels="demo">
+ <collection id="test_nested" name="test_nested" level="demo">
+
+ <component id="tc1" name="tc1" purpose="development" filter="test, unit_test">
+ <unit bldFile="test_nested/tc1/group" mrp="" />
+ </component>
+
+ <component id="tc2" name="tc2" purpose="development" filter="test">
+ <meta rel="testbuild">
+ <group name="drop_tc2_and_tc3" />
+ </meta>
+ <unit bldFile="test_nested/tc2/group" mrp="" />
+ </component>
+
+ <component id="tc3" name="tc3" purpose="development" filter="test">
+ <meta rel="testbuild">
+ <group name="drop_tc2_and_tc3" />
+ </meta>
+ <unit bldFile="test_nested/tc3/group" mrp="" />
+ </component>
+
+ </collection>
+ </package>
+
+* Filter "test" must be specified for every test component. If it is not specified, the component will not be considered as a test component.
+* <meta>/<group> are now used to group test components, it work in the same way as <module>...<module> in sysdef v1.4 works. The components having same group name are grouped together.
+ Separate drop files are created for different groups. In the above example, if only 'test' is selected, then two drop files will be created, one with tc1 and the other one with tc2 and tc3.
+
+
+**Step 2: Configure ATS properties in build.xml**
+
+**(A)** Username and Password for the ATS should be set in the `.netrc file`_::
+
+ machine ats login ats_user_name password ats_password
+
+Add the above line in the ``.netrc`` file and replace ``ats_user_name`` with your real ATS username and ``ats_password`` with ATS password.
+
+**(B)** The following properties are ATS dependent with their edit status
+
+* [must] - must be set by user
+* [recommended] - should be set by user but not mandatory
+* [allowed] - should **not** be set by user however, it is possible.
+
+.. csv-table:: ATS Ant properties
+ :header: "Property name", "Edit status", "Description"
+
+ ":hlm-p:`ats.server`", "[must]", "For example: ``4fix012345`` or ``catstresrv001.company.net:80``. Default server port is ``8080``, but it is not allowed between intra and Noklab. Because of this we need to define server port as 80. The host can be different depending on site and/or product."
+ ":hlm-p:`ats.drop.location`", "[allowed]", "Server location (UNC path) to save the ATSDrop file, before sending to the ATS Server. For example: ``\\\\trwsem00\\some_folder\\``. In case, :hlm-p:`ats.script.type` is set to ``import``, ATS doesn't need to have access to :hlm-p:`ats.drop.location`, its value can be any local folder on build machine, for example ``c:/temp`` (no network share needed)."
+ ":hlm-p:`ats.product.name`", "[must]", "Name of the product to be tested."
+ ":hlm-p:`eunit.test.package`", "[allowed]", "The EUnit package name to be unzipped on the environment, for executing EUnit tests."
+ ":hlm-p:`eunitexerunner.flags`", "[allowed]", "Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to ``/E S60AppEnv /R Off``."
+ ":hlm-p:`ats.email.list`", "[allowed]", "The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon-separated email addresses."
+ ":hlm-p:`ats.report.type`", "[allowed]", "Value of the ats email report, for ATS4 set to 'no_attachment' so email size is reduced"
+ ":hlm-p:`ats.flashfiles.minlimit`", "[allowed]", "Limit of minimum number of flash files to execute :hlm-t:`ats-test` target, otherwise ``ATSDrop.zip`` will not be generated. Default value is 2 files."
+ ":hlm-p:`ats.plan.name`", "[allowed]", "Modify the plan name if you have understanding of ``test.xml`` file or leave it as it is. Default value is ``plan``."
+ ":hlm-p:`ats.product.hwid`", "[allowed]", "Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set."
+ ":hlm-p:`ats.script.type`", "[allowed]", "There are two types of ats script files to send drop to ATS server, ``runx`` and ``import``; only difference is that with ``import`` ATS doesn't have to have access rights to ``testdrop.zip`` file, as it is sent to the system over http and import doesn't need network shares. If that is not needed ``import`` should not be used. Default value is ``runx`` as ``import`` involves heavy processing on ATS server."
+ ":hlm-p:`ats.target.platform`", "[allowed]", "Sets target platform for compiling test components. Default value is ``armv5 urel``."
+ ":hlm-p:`ats.test.timeout`", "[allowed]", "To set test commands execution time limit on ATS server, in seconds. Default value is ``60``."
+ ":hlm-p:`ats.testrun.name`", "[allowed]", "Modify the test-run name if you have understanding of ``test.xml`` file or leave it as it is. Default value is a string consist of build id, product name, major and minor versions."
+ ":hlm-p:`ats.trace.enabled`", "[allowed]", "Should be ``true`` if tracing is needed during the tests running on ATS. Default value is ``false``, the values are case-sensitive. See http://s60wiki.nokia.com/S60Wiki/CATS/TraceTools."
+ ":hlm-p:`ats.ctc.enabled`", "[allowed]", "Should be ``true`` if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Default value is ``false``. The values are case-sensitive."
+ ":hlm-p:`ats.ctc.host`", "[allowed]", "ATS3 only CTC host, provided by CATS used to create coverage measurement reports. MON.sym files are copied to this location, for example ``10.0.0.1``. If not given, code coverage reports are not created"
+ ":hlm-p:`ats.obey.pkgfiles.rule`", "[allowed]", "If the property is set to ``true``, then the only test components which will have PKG files, will be included into the ``test.xml`` as a test-set. Which means, even if there's a test component (executable) but there's no PKG file, it should not be considered as a test component and hence not included into the test.xml as a separate test. By default the property value is ``false``."
+ ":hlm-p:`tsrc.data.dir`", "[allowed]", "The default value is ``data`` and refers to the 'data' directory under 'tsrc' directory."
+ ":hlm-p:`tsrc.path.list`", "[allowed]", "Contains list of the tsrc directories. Gets the list from system definition layer files. Assuming that the test components are defined already in te ``layers.sysdef.xml`` files to get compiled. Not recommended, but the property value can be set if there are no System Definition file(s), and tsrc directories paths to set manually."
+ ":hlm-p:`ats.report.location`", "[allowed]", "Sets ATS reports store location. Default location is ``${r'$'}{publish.dir}/${r'$'}{publish.subdir}``."
+ ":hlm-p:`ats.multiset.enabled`", "[allowed]", "Should be ``true`` so a set is used for each pkg file in a component, this allows tests to run in parallel on several devices."
+ ":hlm-p:`ats.diamonds.signal`", "[allowed]", "Should be ``true`` so at end of the build diamonds is checked for test results and Helium fails if tests failed."
+ ":hlm-p:`ats.delta.enabled`", "[allowed]", "Should be ``true`` so only ADOs changed during :hlm-t:`do-prep-work-area` are tested by ATS."
+ ":hlm-p:`ats4.enabled`", "[allowed]", "Should be ``true`` if ATS4 is to be used."
+ ":hlm-p:`ats.emulator.enable`", "[allowed]", "Should be ``true`` if ``WINSCW`` emulator is to be used."
+ ":hlm-p:`ats.specific.pkg`", "[allowed]", "Text in name of PKG files to use eg. 'sanity' would only use xxxsanity.pkg files from components."
+ ":hlm-p:`ats.singledrop.enabled`", "[allowed]", "If present and set to 'true', it will create one drop file, if set to any other value or not present it will create multiple drop files (defined by the sysdef file). This is to save traffic to the server."
+ ":hlm-p:`ats.java.importer.enabled`", "[allowed]", "If set to 'true', for older uploader is used for ats3 which shows improved error message."
+ ":hlm-p:`ats.test.filterset`", "[allowed]", "(new Helium v.10.79)Contains a name of test filterset (see example below). A filterset is used to select/unselect test components. The filter(s) is/are effective when the same filters are defined in the package definition file for component(s)."
+
+An example of setting up properties:
+
+.. code-block:: xml
+
+ <property name="ats.server" value="4fio00105" />
+ <property name="ats.drop.location" location="\\trwsimXX\ATS_TEST_SHARE\" />
+ <property name="ats.email.list" value="temp.user@company.com; another.email@company.com" />
+ <property name="ats.flashfiles.minlimit" value="2" />
+ <property name="ats.product.name" value="PRODUCT" />
+ <property name="ats.plan.name" value="plan" />
+ <property name="ats.product.hwid" value="" />
+ <property name="ats.script.type" value="runx" />
+ <property name="ats.target.platform" value="armv5 urel" />
+ <property name="ats.test.timeout" value="60" />
+ <property name="ats.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{major.version}.${r'$'}{minor.version}" />
+ <property name="ats.trace.enabled" value="false" />
+ <property name="ats.ctc.enabled" value="false" />
+ <property name="ats.obey.pkgfiles.rule" value="false" />
+ <property name="ats.report.location" value="${r'$'}{publish.dir}/${r'$'}{publish.subdir}" />
+ <property name="eunit.test.package" value="" />
+ <property name="eunitexerunner.flags" value="/E S60AppEnv /R Off" />
+ <property name="ats.test.filterset" value="sysdef.filters.tests" />
+
+ <hlm:sysdefFilterSet id="sysdef.filters.tests">
+ <filter filter="test, " type="has" />
+ <config file="bldvariant.hrh" includes="" />
+ </hlm:sysdefFilterSet>
+
+.. Note::
+
+ Always declare *Properties* before and *filesets* after importing helium.ant.xml.
+
+**STEP 3: Call target ats-test**
+
+To execute the target, a property should be set(``<property name="ats.enabled" value="true" />``).
+
+Then call :hlm-t:`ats-test`, which will create the ATSDrop.zip (test package).
+
+If property *ats.email.list* is set, an email (test report) will be sent when the tests are ready on ATS.
+
+CTC
+---
+
+* To enable ctc for ATS set, :hlm-p:`ats.ctc.enabled`.
+
+For ATS3 only, set the ftp hostname for the ATS server:
+
+.. code-block:: xml
+
+ <property name="ats.ctc.host" value="1.2.3"/>
+
+
+* To compile components for CTC see `configure CTC for SBS`_
+
+.. _`configure CTC for SBS`: ../helium-antlib/sbsctc.html
+
+
+* Once ATS tests have finished results for CTC will be shown in Diamonds.
+* The following are optional CTC properties
+
+.. csv-table:: Table: ATS Ant properties
+ :header: "Property name", "Edit status", "Description"
+
+ "``ctc.instrument.type``", "[allowed]", "Sets the instrument type"
+ "``ctc.build.options``", "[allowed]", "Enables optional extra arguments for CTC, after importing a parent ant file."
+
+
+For example,
+
+.. code-block:: xml
+
+ <property name="ctc.instrument.type" value="m" />
+
+ <import file="../../build.xml" />
+
+ <hlm:argSet id="ctc.build.options">
+ <arg line="-C OPT_ADD_COMPILE+-DCTC_NO_START_CTCMAN" />
+ </hlm:argSet>
+
+Or
+
+.. code-block:: xml
+
+ <hlm:argSet id="ctc.build.options">
+ <arg line='-C "EXCLUDE+*\sf\os\xyz\*,*\tools\xyz\*"'/>
+ </hlm:argSet>
+
+
+See `more information on code coverage`_
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`more information on code coverage`: http://s60wiki.nokia.com/S60Wiki/CTC
+<#else>
+.. _`more information on code coverage`: http://developer.symbian.org/wiki/index.php/Testing_Guidelines_for_Package_Releases#Code_coverage
+</#if>
+
+
+
+
+
+
+
+Qt Tests
+--------
+
+QtTest.lib is supported and the default harness is set to EUnit. If ``QtTest.lib`` is there in ``.mmp`` file, Helium sets the Harness to Eunit and ATS supported Qt steps are added to test.xml file
+
+In ``layers.sysdef.xml`` file, the layer name should end with "_test_layer" e.g. "qt_unit_test_layer".
+
+There are several ``.PKG`` files created after executing ``qmake``, but only one is selected based on which target platform is set. Please read the property (:hlm-p:`ats.target.platform`) description above.
+
+.. _`Skip-Sending-AtsDrop-label`:
+
+Skip Sending AtsDrop to ATS
+---------------------------
+
+By setting property of :hlm-p:`ats.upload.enabled` to ``false``, ``ats-test`` target only creates a drop file, and does not send the drop (or package) to ATS server.
+
+Choosing images to send to ATS
+------------------------------
+
+Since helium 10 images are picked up using :hlm-p:`ats.product.name` and Imaker iconfig.xml files. ``release.images.dir`` is searched for iconfig.xml files, the ones where the product name is part of :hlm-p:`ats.product.name` is used.
+
+You should only build the images for each product you want to include in ats. Eg.
+
+.. code-block:: xml
+
+ <hlm:imakerconfigurationset id="configname">
+ <imakerconfiguration>
+ <hlm:product list="${r'$'}{product.list}" ui="true"/>
+ <targetset>
+ <include name="^core${r'$'}"/>
+ <include name="^langpack_01${r'$'}"/>
+ <include name="^custvariant_01_tools${r'$'}"/>
+ <include name="^udaerase${r'$'}"/>
+ </targetset>
+ <variableset>
+ <variable name="TYPE" value="rnd"/>
+ </variableset>
+ </imakerconfiguration>
+ </hlm:imakerconfigurationset>
+
+For older products where there are no iconfig.xml, ``reference.ats.flash.images`` is used:
+
+.. code-block:: xml
+
+ <fileset id="reference.ats.flash.images" dir="${r'$'}{release.images.dir}">
+ <include name="**/${r'$'}{build.id}*.core.fpsx"/>
+ <include name="**/${r'$'}{build.id}*.rofs2.fpsx"/>
+ <include name="**/${r'$'}{build.id}*.rofs3.fpsx"/>
+ </fileset>
+
+Customizing the test.xml in ATS
+-------------------------------
+
+The user can customize the generated test.xml with files:
+
+* **preset_custom.xml** goes before first set
+* **postset_custom.xml** goes after last set
+* **precase_custom.xml** goes before first case
+* **postcase_custom.xml** goes after last case
+* **prestep_custom.xml** goes before first step
+* **poststep_custom.xml** goes after last step
+* **prerun_custom.xml** goes before first run or execute step
+* **postrun_custom.xml** goes after last run or execute step
+* **prepostaction.xml** goes before first postaction
+* **postpostaction.xml** goes after last postaction
+
+The files must be in the directory 'custom' under the 'tsrc' or 'group' folder to be processed.
+
+The files need to be proper XML snippets that fit to their place. In case of an error an error is logged and a comment inserted to the generated XML file.
+
+A postaction section customization file (prepostaction.xml or postpostaction.xml) could look like this
+
+.. code-block:: xml
+
+ <postAction>
+ <type>Pre PostAction from custom file</type>
+ <params>
+ <param name="foo2" value="bar2" />
+ </params>
+ </postAction>
+
+
+
+The ``prestep_custom.xml`` can be used to flash and unstall something custom.
+
+.. code-block:: xml
+
+ <step name="Install measurement tools" harness="STIF" significant="false">
+ <!-- Copy SIS-packages to DUT -->
+ <command>install</command>
+ <params>
+ <param src="Nokia_Energy_Profiler_1_1.sisx"/>
+ <param dst="c:\data\Nokia_Energy_Profiler_1_1.sisx"/>
+ </params>
+ ...
+ </step>
+
+
+And then the ``prerun_custom.xml`` can be used to start measuring.
+
+.. code-block:: xml
+
+ <step name="Start measurement" harness="STIF" significant="false">
+ <!-- Start measurement -->
+ <command>execute</command>
+ <params>
+ <param file="neplauncher.exe"/>
+ <param parameters="start c:\data\nep.csv"/>
+ <param timeout="30"/>
+ </params>
+ </step>
+
+
+
+**Note:** The users is expected to check the generated test.xml manually, as there is no validation. Invalid XML input files will be disregarded and a comment will be inserted to the generated XML file.
+
+Overriding Test xml values
+--------------------------
+
+Set the property ``ats.config.file`` to the location of the config file.
+
+Example configuration:
+
+.. code-block:: xml
+
+ <ATSConfigData>
+ <config name="common" abstract="true">
+
+ <!-- Properties to add/ modify -->
+ <config type="properties">
+ <set name="HARNESS" value="STIF" />
+ <set name="2" value="3" />
+ </config>
+
+ <!-- Settings to add/ modify -->
+ <config type="settings">
+ <set name="HARNESS" value="STIF" />
+ <set name="2" value="3" />
+ </config>
+
+ <!-- Attributes to modify -->
+ <config type="attributes">
+ <set name="xyz" value="2" />
+ <set name="significant" value="true" />
+ </config>
+ </config>
+ </ATSConfigData>
+
+
+.. index::
+ single: ATS - ASTE
+
+Stage: ATS - ASTE
+=================
+
+Explanation of the process for getting ATS `ASTE`_ tests compiled and executed by Helium, through the use of the :hlm-t:`ats-aste` target.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`ASTE`: http://s60wiki.nokia.com/S60Wiki/ASTE
+</#if>
+
+Prerequisites
+-------------
+
+* `Harmonized Test Interface (HTI)`_ needs to be compiled and into the image.
+* The reader is expected to already have a working ATS setup in which test cases can be executed. ATS server names, access rights and authentication etc. is supposed to be already taken care of.
+* `SW Test Asset`_ location and type of test should be known.
+
+<#if !(ant?keys?seq_contains("sf"))>
+.. _`Harmonized Test Interface (HTI)`: http://s60wiki.nokia.com/S60Wiki/HTI
+.. _`SW Test Asset`: http://s60wiki.nokia.com/S60Wiki/MC_SW_Test_Asset_documentation
+</#if>
+
+Test source components
+----------------------
+
+Unlike STIF, EUnit etc tests, test source components (or ``tsrc`` structure) is not needed for `ASTE`_ tests.
+
+Two STEPS to setup ASTE with Helium
+-----------------------------------
+
+**STEP 1: Configure ASTE properties in build.xml**
+
+**(A)** Username and Password for the ATS should be set in the `.netrc file`_
+
+.. code-block:: text
+
+ machine ats login ats_user_name password ats_password
+
+Add the above line in the .netrc file and replace *ats_user_name* with your real ats username and "ats_password" with ats password.
+
+.. _`.netrc file`: configuring.html?highlight=netrc#passwords
+
+
+**(B)** The following properties are ASTE dependent with their edit status
+
+* [must] - must be set by user
+* [recommended] - should be set by user but not mandatory
+* [allowed] - should **not** be set by user however, it is possible.
+
+.. csv-table:: ATS Ant properties
+ :header: "Property name", "Edit status", "Description"
+
+ ":hlm-p:`ats.server`", "[must]", "For example: ``4fio00105`` or ``catstresrv001.company.net:80``. Default server port is ``8080``, but it is not allowed between intra and Noklab. Because of this we need to define server port as ``80``. The host can be different depending on site and/or product."
+ ":hlm-p:`ats.drop.location`", "[must]", "Server location (UNC path) to save the ATSDrop file, before sending to the ATS. For example: ``\\\\trwsem00\\some_folder\\``. In case, ``ats.script.type`` is set to ``import``, ATS doesn't need to have access to :hlm-p:`ats.drop.location`, its value can be any local folder on build machine, for example ``c:/temp`` (no network share needed)."
+ ":hlm-p:`ats.product.name`", "[must]", "Name of the product to be tested."
+ ":hlm-p:`ats.aste.testasset.location`", "[must]", "Location of SW Test Assets, if the TestAsset is not packaged then it is first compressed to a ``.zip`` file. It should be a UNC path."
+ ":hlm-p:`ats.aste.software.release`", "[must]", "Flash images releases, for example 'SPP 51.32'."
+ ":hlm-p:`ats.aste.software.version`", "[must]", "Version of the software to be tested. For example: 'W810'"
+ ":hlm-p:`ats.aste.email.list`", "[recommended]", "The property is needed if you want to get an email from ATS server after the tests are executed. There can be one to many semicolon(s) ";" separated email addresses."
+ ":hlm-p:`ats.flashfiles.minlimit`", "[recommended]", "Limit of minimum number of flash files to execute ats-test target, otherwise ATSDrop.zip will not be generated. Default value is "2" files."
+ ":hlm-p:`ats.aste.plan.name`", "[recommended]", "Modify the plan name if you have understanding of test.xml file or leave it as it is. Default value is "plan"."
+ ":hlm-p:`ats.product.hwid`", "[recommended]", "Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set."
+ ":hlm-p:`ats.test.timeout`", "[recommended]", "To set test commands execution time limit on ATS server, in seconds. Default value is '60'."
+ ":hlm-p:`ats.aste.testrun.name`", "[recommended]", "Modify the test-run name if you have understanding of ``test.xml`` file or leave it as it is. Default value is a string consists of build id, product name, major and minor versions."
+ ":hlm-p:`ats.aste.test.type`", "[recommended]", "Type of test to run. Default is 'smoke'."
+ ":hlm-p:`ats.aste.testasset.caseids`", "[recommended]", "These are the cases that which tests should be run from the TestAsset. For example, value can be set as ``100,101,102,103,105,106,``. A comma is needed to separate case IDs"
+ ":hlm-p:`ats.aste.language`", "[recommended]", "Variant Language to be tested. Default is 'English'"
+
+
+An example of setting up properties:
+
+.. code-block:: xml
+
+ <property name="ats.server" value="4fio00105" />
+ <property name="ats.drop.location" value="\\trwsimXX\ATS_TEST_SHARE\" />
+ <property name="ats.aste.email.list" value="temp.user@company.com; another.email@company.com" />
+ <property name="ats.flashfiles.minlimit" value="2" />
+ <property name="ats.product.name" value="PRODUCT" />
+ <property name="ats.aste.plan.name" value="plan" />
+ <property name="ats.product.hwid" value="" />
+ <property name="ats.test.timeout" value="60" />
+ <property name="ats.aste.testrun.name" value="${r'$'}{build.id}_${r'$'}{ats.product.name}_${r'$'}{major.version}.${r'$'}{minor.version}" />
+ <property name="ats.aste.testasset.location" value="" />
+ <property name="ats.aste.software.release" value="SPP 51.32" />
+ <property name="ats.aste.test.type" value="smoke" />
+ <property name="ats.aste.testasset.caseids" value="100,101,102,104,106," />
+ <property name="ats.aste.software.version" value="W810" />
+ <property name="ats.aste.language" value="English" />
+
+
+*PLEASE NOTE:* Always declare *Properties* before and *filesets* after importing helium.ant.xml.
+
+**STEP 2: Call target ats-aste**
+
+To execute the target, a property should be set(``<property name="enabled.aste" value="true" />``).
+
+Then call :hlm-t:`ats-aste`, which will create the ATSDrop.zip (test package).
+
+If property ``ats.aste.email.list`` is set, an email (test report) will be sent when the tests are ready on ATS/ASTE.
+
+
+Skip Sending AtsDrop to ATS
+---------------------------
+
+click :ref:`Skip-Sending-AtsDrop-label`:
+
+
+
+
\ No newline at end of file
--- a/buildframework/helium/doc/src/manual/stage_final.rst.inc.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-<#--
-============================================================================
-Name : stage_final.rst.inc.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-
-.. index::
- single: Stage - Final operations
-
-Stage: Final operations
-=======================
-
-Final operation are steps which could happen at the workflow completion.
-
-
-Running a target at build completion
-------------------------------------
-
-Helium offers the possibility to run a final target despite any error which could occur during the build.
-The configuration of the target is done using the **hlm.final.target** property.
-
-e.g:
-::
-
- <property name="hlm.final.target" value="my-final-target" />
-
-
-Running action on failure
--------------------------
-
-The signaling framework will automatically run all signalExceptionConfig in case of Ant failure at the
-end of the build.
-
-This example shows how simple task can be run in case of failure:
-::
-
- <hlm:signalExceptionConfig id="signal.exception.config">
- <hlm:notifierList>
- <hlm:executeTaskNotifier>
- <echo>Signal: ${r'$'}{signal.name}</echo>
- <echo>Message: ${r'$'}{signal.message}</echo>
- <runtarget target="build-log-summary" />
- </hlm:executeTaskNotifier>
- </hlm:notifierList>
- </hlm:signalExceptionConfig>
-
-
-
--- a/buildframework/helium/doc/src/manual/stage_matti.rst.inc.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-<#--
-============================================================================
-Name : stage_matti.rst.inc.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-
-.. index::
- single: MATTI
-
-Stage: MATTI
-=============
-
-MATTI testing is very similar to ATS testing, so for details of how it all links together see :ref:`Stage-ATS-label`: `and the matti website`_.
-
-<#if !(ant?keys?seq_contains("sf"))>
-.. _`and the matti website`: http://trmatti1.nmp.nokia.com/help/
-</#if>
-
-The set up of parameters is very similar (a few less parameters and it mostly uses ATS values). The main difference is that once the drop file has been uploaded to the ATS server it uses MATTI to perform the tests (the drop file contains the flash files, the ruby tests/sip profiles, data files, sis files and/or parameters file in xml format).
-
-The following parameters are the ones that are not listed in the ATS parameters, all other parameters required are as listed in the ATS section above, which include :hlm-p:`ats.server`, :hlm-p:`ats.email.list`, :hlm-p:`ats.email.format`, :hlm-p:`ats.email.subject`, :hlm-p:`ats.testrun.name`, :hlm-p:`ats.product.name`, :hlm-p:`ats.flashfiles.minlimit`, :hlm-p:`ats.flash.images` and :hlm-p:`ats.upload.enabled`.
-
-* [must] - must be set by user
-* [recommended] - should be set by user but not mandatory
-* [allowed] - should **not** be set by user however, it is possible.
-
-.. csv-table:: ATS Ant properties
- :header: "Property name", "Edit status", "Description"
-
- ":hlm-p:`matti.enabled`", "[must]", "Enable MATTI testing to occur, if not present the target :hlm-t:`matti-test` will not run."
- ":hlm-p:`matti.asset.location`", "[must]", "The location of the test asset where ruby test files, sip profiles, hardware data etc are located."
- ":hlm-p:`matti.test.profiles`", "[must]", "Test profiles to be executed should be mentioned in this comma separated list e.g., 'bat, fute'."
- ":hlm-p:`matti.sierra.enabled`", "[must]", "Mustbe set to 'true' if sierra is engine is to be used. If true .sip files are used otherwise .rb (ruby) files are used to execute tests-"
- ":hlm-p:`matti.test.timeout`", "[must]", "Separate but similar property to ats.test.timeout for matti tests."
- ":hlm-p:`matti.parameters`", "[must]", "Matti test parameters can be given through Matti parameters xml file."
- ":hlm-p:`matti.sis.files`", "[must]", "There are special sis files required to execute with test execution. This is a comma separated list in which several sis files can be deifned in a certain format like '<src file on build area>#<destination to save the file on memory card>#<destination to install the file>' e.g. <x:\dir1\abc.sis#f:\memory1\abc.sis#c:\phonememory\private\abc.sis>"
- ":hlm-p:`matti.sierra.parameters`", "[must]", "Sierra parameters are set using this property. e.g. '--teardown --ordered'"
- ":hlm-p:`matti.template.file`", "[allowed]", "Location of the matti template file."
-
-
-All you need to do is setup the following parameters:
-
-.. code-block:: xml
-
- <property name="matti.enabled" value="true" />
- <property name="matti.asset.location" value="\\server\share\matti_testcases, x:\dir\matti_testcases," />
- <property name="matti.test.profiles" value="bat, fute" />
- <property name="matti.sierra.enabled" value="true" />
- <property name="matti.test.timeout" value="1200" />
- <property name="matti.parameters" value="x:\dir\mattiparameters\matti_parameters.xml" />
- <property name="matti.sis.files" value="x:\sisfiles\abc.sis#f:\data\abc.sis#C:\abc.sis, x:\sisfiles\xyz.sis#f:\data\xyz.sis#F:\xyz.sis" />
- <property name="matti.sierra.parameters" value="--ordered" />
- <property name="matti.template.file" value="x:\dir\templates\matti_template_2.xml" />
-
-
-
-In order to upload and view the test run you need to have a valid user ID and password that matches that in your ``.netrc`` file. To create the account open a web browser window and enter the name of the ats.server with /ATS at the end e.g. http://123456:80/ATS. Click on the link in the top right hand corner to create the account. To view the test run once your account is active you need to click on the 'test runs' tab.
-
-To run the tests call the target :hlm-t:`matti-test` (you will need to define the :hlm-p:`build.drive`, :hlm-p:`build.number` and it is best to create the :hlm-p:`core.build.version` on the command line as well if you do not add it to the list of targets run that create the ROM image). e.g.
-::
-
- hlm -Dbuild.number=001 -Dbuild.drive=z: -Dcore.build.version=001 matti-test
-
-If it displays the message 'Matti testdrop created successfully!', script has done what it needs to do. The next thing to check is that the drop file has been uploaded to the ATS server OK. If that is performed successfully then the rest of the testing needs to be performed by the ATS server. There is also a ``test.xml`` file created that contains details needed for debugging any problems that might occur. To determine if the tests have run correctly you need to read the test run details from the server.
--- a/buildframework/helium/doc/src/manual/stage_preparation.rst.inc.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/stage_preparation.rst.inc.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -36,24 +36,37 @@
Helium supports the creation of an environment based on a release store in a network drive. The main requirement from that release is to publish release metadata with the content.
-.. csv-table:: Ant properties to modify
+.. csv-table:: Ant properties to modify for Helium 11 and older
+ :header: "Property", "Description", "Values"
+
+ ":hlm-p:`s60.grace.server`", ":hlm-p:`s60.grace.server[summary]`", ":hlm-p:`s60.grace.server[defaultValue]`"
+ ":hlm-p:`s60.grace.service`", ":hlm-p:`s60.grace.service[summary]`", ":hlm-p:`s60.grace.service[defaultValue]`"
+ ":hlm-p:`s60.grace.product`", ":hlm-p:`s60.grace.product[summary]`", ":hlm-p:`s60.grace.product[defaultValue]`"
+ ":hlm-p:`s60.grace.release`", ":hlm-p:`s60.grace.release[summary]`", ":hlm-p:`s60.grace.product[defaultValue]`"
+ ":hlm-p:`s60.grace.revision`", ":hlm-p:`s60.grace.revision[summary]`", ":hlm-p:`s60.grace.revision[defaultValue]`"
+ ":hlm-p:`s60.grace.cache`", ":hlm-p:`s60.grace.cache[summary]`", ":hlm-p:`s60.grace.cache[defaultValue]`"
+ ":hlm-p:`s60.grace.checkmd5.enabled`", ":hlm-p:`s60.grace.checkmd5.enabled[summary]`", ":hlm-p:`s60.grace.checkmd5.enabled[defaultValue]`"
+ ":hlm-p:`s60.grace.usetickler`", ":hlm-p:`s60.grace.usetickler[summary]`", ":hlm-p:`s60.grace.usetickler[defaultValue]`"
+
+
+.. csv-table:: Ant properties to modify for Helium 12
:header: "Property", "Description", "Values"
- ":hlm-p:`s60.grace.server`", "UNC path to network drive.", ""
- ":hlm-p:`s60.grace.service`", "Service name.", ""
- ":hlm-p:`s60.grace.product`", "Product name.", ""
- ":hlm-p:`s60.grace.release`", "Regular expression to match release under the product directory.", ""
- ":hlm-p:`s60.grace.revision`", "Regular expresion to match a new build revision", "e.g: (_\d+)?"
- ":hlm-p:`s60.grace.cache`",
- ":hlm-p:`s60.grace.checkmd5.enabled`",
- ":hlm-p:`s60.grace.usetickler`", "Validate the release based on the tickler.", "true, false(default)"
+ ":hlm-p:`download.release.server`", ":hlm-p:`download.release.server[summary]`", ":hlm-p:`download.release.server[defaultValue]`"
+ ":hlm-p:`download.release.service`", ":hlm-p:`download.release.service[summary]`", ":hlm-p:`download.release.service[defaultValue]`"
+ ":hlm-p:`download.release.product`", ":hlm-p:`download.release.product[summary]`", ":hlm-p:`download.release.product[defaultValue]`"
+ ":hlm-p:`download.release.regex`", ":hlm-p:`download.release.regex[summary]`", ":hlm-p:`download.release.regex[defaultValue]`"
+ ":hlm-p:`download.release.revision`", ":hlm-p:`download.release.revision[summary]`", ":hlm-p:`download.release.revision[defaultValue]`"
+ ":hlm-p:`download.release.cache`", ":hlm-p:`download.release.cache[summary]`", ":hlm-p:`download.release.cache[defaultValue]`"
+ ":hlm-p:`download.release.checkmd5.enabled`", ":hlm-p:`download.release.checkmd5.enabled[summary]`", ":hlm-p:`download.release.checkmd5.enabled[defaultValue]`"
+ ":hlm-p:`download.release.usetickler`", ":hlm-p:`download.release.usetickler[summary]`", ":hlm-p:`download.release.usetickler[defaultValue]`"
-Once configured you can invoke Helium:
+Once configured you can invoke Helium::
- > hlm -Dbuild.number=1 -Dbuild.drive=X: ido-update-build-area-grace
+ hlm -Dbuild.number=1 -Dbuild.drive=X: ido-update-build-area
- > dir X:
- ...
- ...
+You should then have the latest release extracted to the X: drive.
-You should then have the latest/mentioned release un-archived under the X: drive.
\ No newline at end of file
+<#if !ant?keys?seq_contains("sf")>
+.. include:: stage_nokia_preparation.rst.inc
+</#if>
\ No newline at end of file
--- a/buildframework/helium/doc/src/manual/stage_publishing.rst.inc.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/stage_publishing.rst.inc.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -34,7 +34,7 @@
Diamonds is a utility tool that keeps track of build and release information. See the **Metrics** manual under section `Helium Configuration`_ for more info.
-.. _Helium Configuration: ../metrics.html#helium-configuration
+.. _Helium Configuration: metrics.html#helium-configuration
.. index::
@@ -103,6 +103,7 @@
<set name="mapper" value="policy"/>
<set name="policy.internal.name" value="really_confidential_stuff"/>
<set name="policy.filenames" value="Distribution.Policy.S60"/>
+ <set name="split.on.uncompressed.size.enabled" value="true"/>
</config>
</config>
@@ -114,6 +115,7 @@
<set name="policy.internal.name" value="really_confidential_stuff"/>
<set name="policy.filenames" value="Distribution.Policy.S60"/>
<set name="policy.root.dir" value="${r'$'}{root.dir}/s60"/>
+ <set name="split.on.uncompressed.size.enabled" value="true"/>
</config>
</config>
@@ -179,6 +181,8 @@
"``archives.dir``", "The directory where the zip files are saved to.", ""
"``policy.csv``", "This property defines the location of the policy definition file.", ""
"``policy.default.value``", "This property defines the policy value when policy file is missing or invalid (e.g. wrong format).", "9999"
+ "``split.on.uncompressed.size.enabled``", "To enable/disable splitting the zip files depending on source file size.", "true/false"
+
The policy mapper enables the sorting of the content compare to its policy value. The mapper is looking for a policy file in the file to archive directory.
If the distribution policy file is missing then the file will go to the ``policy.default.value`` archive. Else it tries to open the file which
@@ -226,6 +230,9 @@
They support the same set of configuration properties as the default ``policy.remover``.
+<#if !ant?keys?seq_contains("sf")>
+.. include:: stage_metadata.rst.inc
+</#if>
.. index::
single: Zipping SUBCON
@@ -233,5 +240,12 @@
Subcon zipping
--------------
-Subcon zipping is also configured using the same XML format as :hlm-t:`zip-ee` and implemented in the :hlm-t:`zip-subcon` target. A :hlm-p:`zips.subcon.spec.name` property must be defined but currently it is still a separate configuration file.
+Subcon zipping is also configured using the same XML format as :hlm-t:`zip-ee` and implemented in the :hlm-t:`zip-subcon` target. A ``zips.subcon.spec.name`` property must be defined but currently it is still a separate configuration file.
+
+Stage: Blocks packaging
+=======================
+
+Refer to the `Blocks integration manual`_
+
+.. _`Blocks intergration manual`: blocks.html
--- a/buildframework/helium/doc/src/manual/stage_source_preparation.rst.inc.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/stage_source_preparation.rst.inc.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -136,6 +136,10 @@
The following properties are required:
- database: the name of the synergy database you want to use.
+<#if !ant?keys?seq_contains("sf")>
+.. include:: stage_nokia_ccm.rst.inc
+</#if>
+
Mercurial
---------
@@ -150,6 +154,8 @@
</hlm:scm>
</target>
+<#if !ant?keys?seq_contains("sf")>
For more information see API_
-.. _API: ../helium-antlib/api/doclet/index.SCM.html
+.. _API: ../api/doclet/index.SCM.html
+</#if>
\ No newline at end of file
--- a/buildframework/helium/doc/src/manual/stages.rst.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/manual/stages.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -23,6 +23,7 @@
.. index::
module: Stages
+
=============
Helium stages
=============
@@ -47,7 +48,7 @@
.. include:: stage_releasing.rst.inc
Stage: Cenrep creation (S60 3.2.3 - 5.x)
-=================================
+========================================
<#if !(ant?keys?seq_contains("sf"))>
See: http://configurationtools.nmp.nokia.com/builds/cone/docs/cli/generate.html?highlight=generate
</#if>
@@ -57,7 +58,7 @@
* IDO can use the ido-gen-cenrep to generate the cenreps which are IDO specific.
* We should pass the sysdef.configurations.list as parameter to ido-gen-cenrep target. Else it will use the defualt one of helium.
-Example:
+Example
-------
Below example will generate the cenrep only for IDO specific confml files.
@@ -105,17 +106,35 @@
.. include:: stage_integration.rst.inc
-.. include:: stage_ats.rst.inc
+
+Stage: Testing
+==============
+
+The test sources or test asset is mantained by test developers, who follow certain rules and standards to create the directory/file structure and writing the tests.
-.. include:: stage_matti.rst.inc
+Testing is performed automatically by ATS server which receives a zipped testdrop, containing test.xml file (required by ATS), ROM images, test cases, dlls, executbales and other supporting files. This testdrop is created by Helium Test Automation system.
+
+Read more: `Helium Test Automation User Guide`_
+
+.. _`Helium Test Automation User Guide`: stage_ats.html
-Stage: Check EPL License header.
-=================================
+
+
+
+Stage: Check EPL License header
+===============================
The target ``check-sf-source-header`` could be used to run to validate the source files for EPL license header.
* Include the target ``check-sf-source-header`` in the target sequence.
-* This will validate source files present on the build area to contain EPL license.
+* This will validate source files present on the build area not to contain SFL license.
+* Target could be enabled by setting ``sfvalidate.enabled`` to ``true``.
+
+The target ``ido-check-sf-source-header`` could be used to run to validate the source files for EPL license header for IDO/Package level.
+
+* Include the target ``ido-check-sf-source-header`` in the IDO target sequence.
+* This will validate source files present on the build area to contain EPL license by extracting values from ``distribution.policy.S60`` files.
+* Target could be enabled by setting ``sfvalidate.enabled`` to ``true``.
.. index::
single: Compatibility Analyser (CA)
@@ -123,32 +142,40 @@
Stage: Compatibility Analyser
=============================
-The Compatibility Analyser is a tool used to compare **binary** header and library files to ensure that the version being checked has not made any changes to the interfaces which may cause the code to not work correctly. Helium supplies a target that calls this Compatibility Analyser. Users who wish to use this tool first need to read the CA user guide found under SW DOcMan at: http://bhlns002.apac.nokia.com/symbian/symbiandevdm.nsf/WebAllByID2/DSX05526-EN/s60_compatibility_analyser_users_guide.doc.
+The Compatibility Analyser is a tool used to compare **binary** header and library files to ensure that the version being checked has not made any changes to the interfaces which may cause the code to not work correctly. Helium supplies a target that calls this Compatibility Analyser.
+Users who wish to use this tool first need to read the CA user guide found under: /epoc32/tools/s60rndtools/bctools/doc/S60_Compatibility_Analyser_Users_Guide.doc.
-The Compatibility Analyser is supplied as part of SymSEE, there is a wiki page for the tool found at http://s60wiki.nokia.com/S60Wiki/Compatibility_Analyser. As part of the configuration a default BC template file has been provided at Helium\tools\quality\CompatibilityAnalyser\config_template.txt make the necessary changes to this file (as described in the user guide). The supplied example file works with CA versions 2.0.0 and above which is available in SymSEE version 12.1.0 and above. The configurations that will need changing are:
+<#if !(ant?keys?seq_contains("sf"))>
+The Compatibility Analyser is supplied as part of SymSEE, there is a wiki page for the tool found at: http://s60wiki.nokia.com/S60Wiki/Compatibility_Analyser.
+</#if>
+As part of the configuration a default BC template file has been provided at helium/tools/quality/compatibility_analyser/ca.cfg.xml make the necessary changes to this file (as described in the user guide). The supplied example file works with CA versions 2.0.0 and above.
+
+The minimum configurations that will need changing are:
* BASELINE_SDK_DIR
* BASELINE_SDK_S60_VERSION
* CURRENT_SDK_DIR
* REPORT_FILE_HEADERS
* REPORT_FILE_LIBRARIES
-The default configuration is supplied as part of tools\quality\CompatibilityAnalyser\compatibilty.ant.xml where there are a few properties that need to be set (overriding of these is recommended in your own config file):
+The default configuration is supplied as part of tools/quality/compatibility_analyser/compatibilty.ant.xml where there are a few properties that need to be set (overriding of these is recommended in your own config file):
.. csv-table:: Compatibility Analyser Ant properties
:header: "Property name", "Edit status", "Description"
":hlm-p:`ca.enabled`", "[must]", "Enables the bc-check and ca-generate-diamond-summary targets to be executed, when set to true."
- ":hlm-p:`bctools.root`", "[must]", "Place where the CheckBC and FilterBC tools are e.g. C:/APPS/carbide/plugins/com.nokia.s60tools.compatibilityanalyser.corecomponents_2.0.0/BCTools"
- ":hlm-p:`default.bc.config`", "[must]", "Place where the CheckBC default configuration file is, it is copied from this location to the output folder for use by checkBC.py e.g. helium/tools/quality/compatibility_analyser/ca_config_template.txt"
- ":hlm-p:`bc.config.dir`", "[must]", "The bc_config_template.txt file (default configuration file) will be copied from the folder it is saved in within helium to the location named in this property where it will be used ( in conjunction with the bc.config.file property). e.g. build.log.dir/bc"
- ":hlm-p:`bc.config.file`", "[must]", "The bc_config_template.txt file (default configuration file) will be copied from the folder it is saved in within helium to the location named and named as defined in this property where it will be used. You need to make sure this is not the same name as any other IDO or person using the build area. e.g. bc.config.dir/bc.config"
- ":hlm-p:`bc.check.libraries.enabled`", "[must]", "Enables the Binary Comparison for libraries when set to 'true'."
- ":hlm-p:`lib.param.val`", "[must]", "Defines the parameter that checkBC.py is called with -la (all libraries checked) or -ls lib (single library checked) (lib = the name of library to check) or -lm file.name (multiple libraries checked) the file.name is a file that contains the names of the library(ies) to be checked."
- ":hlm-p:`bc.check.headers.enabled`", "[must]", "Enables the Binary Comparison for headers when set to 'true'."
- ":hlm-p:`head.param.val`", "[must]", "Defines the parameter that checkBC.py is called with -ha (all headers checked) or -hs file (single header checked) (file= name of header file to check) or -hm file.name (multiple headers checked) the file.name is a file that contains the names of the header(s) to be checked"
+ ":hlm-p:`bc.prep.ca.file`", "[must]", "The name and location of the file that contains all the CA configuration values like, 'BASELINE_SDK_DIR=C:\Symbian\9.2\S60_3rd_FP1_2': an example file can be found at helium/tools/quality/compatibility_analyser/test/ca.cfg.xml "
+ ":hlm-p:`bc.tools.root`", "[must]", "Place where the CheckBC and FilterBC tools are e.g. /epoc32/tools/s60rndtools/bctools"
+ ":hlm-p:`bc.build.dir`", "[must]", "The place that all the files created during the running of the CA tool will be placed."
+ ":hlm-p:`bc.config.file`", "[must]", "The 'ca.ant.config.file' file (configuration file) will be copied from the folder it is saved in within helium to the location named as defined in this property where it will be used. You need to make sure this is not the same name as any other IDO or person using the build area. e.g. bc.config.dir/bc.config"
+ ":hlm-p:`bc.check.libraries.enabled`", "[must]", "Enables the compatibility analyser for libraries when set to 'true' (default value is 'false')."
+ ":hlm-p:`bc.lib.param.val`", "[optional]", "Defines the parameter that checkBC.py is called with -la (all libraries checked) (default value) or -ls lib (single library checked) (lib = the name of library to check) or -lm file.name (multiple libraries checked) the file.name is a file that contains the names of the library(ies) to be checked. If the 'bc.what.log.entry.enabled' property is set this variable must not be set."
+ ":hlm-p:`bc.check.headers.enabled`", "[must]", "Enables the compatibility analyser for headers when set to 'true' (default value is 'false')."
+ ":hlm-p:`bc.head.param.val`", "[optional]", "Defines the parameter that checkBC.py is called with -ha (all headers checked) (default value) or -hs file (single header checked) (file= name of header file to check) or -hm file.name (multiple headers checked) the file.name is a file that contains the names of the header(s) to be checked. If the 'bc.what.log.entry.enabled' property is set this variable must not be set."
":hlm-p:`bc.check.report.id`", "[must]", "Adds this to the CA output file name to give it a unique name."
- ":hlm-p:`ido.ca.html.output.dir`", "[must]", "Defines the location of CA output and the input for the diamonds creation target. e.g. build.log.dir/build.id_ca"
+ ":hlm-p:`bc.log.file.to.scan`", "[must]", "This must be set if the 'bc.what.log.entry.enabled' property is set otherwise it is not required. It is the name of the log file that was created during the build that will be scanned in order to determine which headers or library files will be compared."
+ ":hlm-p:`bc.what.log.entry.enabled`", "[optional]", "If set to true the 'whatlog' will be scanned for the list of header and/or library files that will be compared. The default is 'false'"
+ ":hlm-p:`bc.fail.on.error`", "[optional]", "If set to true the build will fail if there is an error with the binary compatibility analyser (including the conversion to diamonds XML files). If set to false it will not fail the build if there is a problem with CA."
and then run the target:
@@ -158,8 +185,6 @@
where nnn is the build number and n: is the substed drive letter.
-The results of the output from the analysis are placed in the \output\logs\BC folder under the substed build drive and are called libraries_report_?.xml and headers_report_?.xml, the reports can be viewed in Web-formatted layout, based on the BBCResults.xsl stylesheet which is copied to the \output\logs\BC folder on the build drive.
-
+The results of the output from the analysis are placed in the /output/logs/bc folder under the substed build drive and are called 'libraries_report_{bc.check.report.id}' and 'headers_report_{bc.check.report.id}', the reports can be viewed in Web-formatted layout, based on the BBCResults.xsl stylesheet which is copied to the /output/logs/bc folder on the build drive.
-.. include:: stage_final.rst.inc
-
+By running the target 'ca-generate-diamond-summary' the output is summarised and passed to diamonds where is is displayed in the 'Quality Aspects' section.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/manual/tdriver_template_instructions.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,302 @@
+<#--
+============================================================================
+Name : tdriver_template_instructions.rst.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+.. index::
+ single: TDriver
+
+
+=======================
+TDriver Custom Template
+=======================
+
+
+.. contents::
+
+
+Instructions for creating custom templates for TDriver
+======================================================
+
+Creating custom template for TDriver is very simple and easy. It requires a bit of knowledge of `Python`_, `Python dictionary`_ and `Jinja templates`_, however, it is not mandatory. There will be an example template below, which may help to understand how to create new/modify TDriver template.
+
+.. _`Python`: http://wiki.python.org/moin/BeginnersGuide
+.. _`Python dictionary`: http://docs.python.org/tutorial/datastructures.html#dictionaries
+.. _`Jinja templates`: http://jinja.pocoo.org/2/documentation/templates
+
+
+The test.xml template consists of two parts
+ - Explicit (hardcoded part of the test.xml) and
+ - Implicit (logical/processed data from the TDriver scripts)
+
+
+Explicit template data
+----------------------
+
+This consists of normal template structure, obvious properties, attributes and their values.
+
+For example:
+
+.. code-block:: xml
+
+ <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
+ <testrun>
+ <metadata>
+ </metadata>
+ </testrun>
+ <!-- it also includes several other keywords (true, flase, yes, no, name, value, alias, defaultAgent)
+ and xml tags (execution, initialization, task, type, property, parameters, parameter) -->
+
+
+It does not make any sense without parameters and values. However, explicit data does not require any logic or it is not the data coming from any script either.
+
+
+Implicit template data
+----------------------
+
+- This is complete processed data from several sources.
+- In case of TDriver template, this is a dictionary, ``xml_dict``, which has hierarchical data structure.
+- The contents of the dictionary can be categorized into:
+
+**Pre-Data** (non-itterative data and comes before the execution block in the beginning of the test.xml)
+
+
+.. csv-table:: Pre-Data (Data structure)
+ :header: "Variable name", "Description", "Usage example"
+
+ "diamonds_build_url", "Non-iterative - string", "xml_dict['diamonds_build_url']"
+ "testrun_name", "Non-iterative - string", "xml_dict['testrun_name']"
+ "device_type", "Non-iterative - string", "xml_dict['device_type']"
+ "alias_name", "Non-iterative - string", "xml_dict['alias_name']"
+
+
+
+**Execution-Block** (itterative, which is dependet on number of execution blocks. Please see the template example for exact usage)
+
+
+.. csv-table:: Pre-Data (Data structure)
+ :header: "Variable name", "Description", "Usage example"
+
+ "execution_blocks", "Iterative - dictionary. It has the following members", "for exe_block in xml_dict['execution_blocks']"
+ "image_files", "Iterative - list of ROM images.", "for image_file in exe_block['image_files']"
+ "install_files", "Iterative - list of files to be installed", "for file in exe_block['install_files']"
+ "tdriver_sis_files", "Iterative - list of sisfiles to be installed. This unpacks three values of sisfiles (src, dst_on_ats_server, dst_on_phone).", "for sisfile in exe_block['tdriver_sis_files']"
+ "tdriver_task_files", "Iterative - list of task files, .pro or .rb files, depending on the value of :hlm-p:`tdriver.tdrunner.enabled`.", "for task_file in exe_block['tdriver_task_files']"
+ "asset_path", "Non-iterative - string", "exe_block['asset_path']"
+ "test_timeout", "Non-iterative - string", "exe_block['test_timeout']"
+ "tdriver_parameters", "Non-iterative - string", "exe_block['tdriver_parameters']"
+ "tdrunner_enabled", "Non-iterative - boolean", "exe_block['tdrunner_enabled']"
+ "tdrunner_parameters", "Non-iterative - string", "exe_block['tdrunner_parameters']"
+ "ctc_enabled", "Non-iterative - boolean", "exe_block['ctc_enabled']"
+
+
+
+**Post-Data** (non-itterative data and comes after the execution block in the end of the test.xml)
+
+
+.. csv-table:: Pre-Data (Data structure)
+ :header: "Variable name", "Description", "Usage example"
+
+ "report_email", "Non-iterative - string", "xml_dict['report_email']"
+ "email_format", "Non-iterative - string", "xml_dict['email_format']"
+ "email_subject", "Non-iterative - string", "xml_dict['email_subject']"
+ "report_location", "Non-iterative - string", "xml_dict['report_location']"
+
+
+
+Example template
+================
+
+
+.. code-block:: xml
+
+ {% import 'ats4_macros.xml' as macros with context %}
+
+ <testrun>
+ <metadata>
+ {% if xml_dict['diamonds_build_url'] -%}
+ <meta name="diamonds-buildid">{{ xml_dict['diamonds_build_url'] }}</meta>
+ <meta name="diamonds-testtype">Smoke</meta>
+ {% endif %}
+ <meta name="name">{{ xml_dict['testrun_name'] }}</meta>
+ </metadata>
+
+ <agents>
+ <agent alias="{{ xml_dict['alias_name'] }}">
+ <property name="hardware" value="{{ xml_dict["device_type"] }}"/>
+ </agent>
+ </agents>
+
+
+ {% for exe_block in xml_dict['execution_blocks'] -%}
+ <execution defaultAgent="{{ xml_dict['alias_name'] }}">
+ <initialization>
+
+ {% if exe_block['image_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FlashTask</type>
+ <parameters>
+ {% set i = 1 %}
+ {% for img in exe_block['image_files'] -%}
+ <parameter name="image-{{ i }}" value="images\{{ os.path.basename(img) }}" />
+ {% set i = i + 1 %}
+ {% endfor -%}
+ </parameters>
+ </task>
+ {% endif %}
+
+ {% if exe_block['install_files'] != [] -%}
+ {% for file in exe_block['install_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="{{exe_block['name']}}{{ atspath.normpath(atspath.normpath(file[0]).replace(atspath.normpath(exe_block['asset_path']).rsplit("\\", 1)[0], "")) }}"/>
+ <parameter name="dst" value="{{ atspath.normpath(file[1]) }}"/>
+ </parameters>
+ </task>
+ {% endfor -%}
+ {% endif %}
+
+ {% if exe_block['tdriver_sis_files'] != [] -%}
+ {% for sisfile in exe_block['tdriver_sis_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="sisfiles\{{ os.path.basename(sisfile[0]) }}"/>
+ <parameter name="dst" value="{{ sisfile[2] }}"/>
+ </parameters>
+ </task>
+ {% endfor -%}
+ {% endif %}
+
+ {% for sis_file in exe_block["tdriver_sis_files"] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>InstallSisTask</type>
+ <parameters>
+ <parameter name="software-package" value="{{ sis_file[2] }}"/>
+ <parameter name="timeout" value="{{ exe_block["test_timeout"] }}"/>
+ <parameter name="upgrade-data" value="true"/>
+ <parameter name="ignore-ocsp-warnings" value="true"/>
+ <parameter name="ocsp-done" value="true"/>
+ <parameter name="install-drive" value="{{ sis_file[2].split(":")[0] }}"/>
+ <parameter name="overwrite-allowed" value="true"/>
+ <parameter name="download-allowed" value="false"/>
+ <parameter name="download-username" value="user"/>
+ <parameter name="download-password" value="passwd"/>
+ <parameter name="upgrade-allowed" value="true"/>
+ <parameter name="optional-items-allowed" value="true"/>
+ <parameter name="untrusted-allowed" value="true"/>
+ <parameter name="package-info-allowed" value="true"/>
+ <parameter name="user-capabilities-granted" value="true"/>
+ <parameter name="kill-app" value="true"/>
+ </parameters>
+ </task>
+ {%- endfor -%}
+
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>RebootTask</type>
+ <parameters/>
+ </task>
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>CreateDirTask</type>
+ <parameters>
+ <parameter value="c:\logs\testability" name="dir"/>
+ </parameters>
+ </task>
+
+ {% if exe_block["ctc_enabled"] == "True" -%}
+ {{ macros.ctc_initialization(exe_block) }}
+ {%- endif %}
+ </initialization>
+
+ {% if exe_block["tdriver_task_files"] -%}
+ {% for task_file in exe_block["tdriver_task_files"] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>TestabilityTask</type>
+ <parameters>
+ <parameter value="{{ exe_block["name"] }}\tdriver_testcases\" name="script"/>
+ <parameter value="{{ exe_block["name"] }}\tdriver_testcases\tdriverparameters\{{ os.path.basename(exe_block["tdriver_parameters"][0]) }}" name="xml"/>
+ <parameter value="{{ exe_block['test_timeout'] }}" name="timeout"/>
+ <parameter value="{{ exe_block["tdrunner_enabled"] }}" name="tdrunner"/>
+ <parameter value="{{ exe_block["tdrunner_parameters"] }} -e %TEST_RUN_SANDBOX%/{{ exe_block["name"] }}/{{ task_file }} test_unit" name="executable-parameters"/>
+ </parameters>
+ </task>
+ {% endfor -%}
+ {% endif %}
+
+ <finalization>
+ {% if exe_block["ctc_enabled"] == "True" -%}
+ {{ macros.ctc_finalization(exe_block) }}
+ {%- endif %}
+
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>CleanupTask</type>
+ <parameters>
+ <parameter value="true" name="upload-files"/>
+ </parameters>
+ </task>
+ </finalization>
+ </execution>
+ {% endfor -%}
+
+ <postActions>
+ <action>
+ <type>EmailAction</type>
+ <parameters>
+ <parameter value="{{ xml_dict['email_subject'] }}" name="subject"/>
+ <parameter value="{{ xml_dict['report_email'] }}" name="to"/>
+ <parameter value="{{ xml_dict['email_format'] }}" name="format"/>
+ </parameters>
+ </action>
+ {% if xml_dict['report_location'] -%}
+ <action>
+ <type>FileStoreAction</type>
+ <parameters>
+ <parameter value="{{ xml_dict['report_location'] }}\%START_DATE%_%START_TIME%_%SERVER_TOKEN%" name="dst"/>
+ <parameter value="true" name="overwrite"/>
+ </parameters>
+ </action>
+ {% endif %}
+ {% if xml_dict['diamonds_build_url'] -%}
+ <action>
+ <type>DiamondsAction</type>
+ {% if xml_dict['execution_blocks'] != [] and xml_dict['execution_blocks'][0]["ctc_enabled"] == "True" -%}
+ <parameters>
+ <parameter value="true" name="send-ctc-data" />
+ </parameters>
+ {%- endif %}
+ </action>
+ {%- endif %}
+ </postActions>
+
+ </testrun>
+
+
+
+Setting Custom Template for execution
+=====================================
+
+To execute custom template, set property :hlm-p:`tdriver.template.file`, for example:
+
+.. code-block:: xml
+
+ <property name="tdriver.template.file" value="x:\dir\templates\tdriver_template_2.xml" />
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/doc/src/new_user_tutorial.rst Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,280 @@
+.. ============================================================================
+ Name : new_user_tutorial.rst
+ Part of : Helium
+
+ 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 the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ ============================================================================
+
+########################
+Helium New User Tutorial
+########################
+
+.. index::
+ module: Helium New User Tutorial
+
+.. contents::
+
+Introduction
+============
+
+This tutorial covers the basic information to get up and running using the Helium build framework. Check the `Helium manual`_ for more detailed information.
+
+.. _`Helium manual`: manual/index.html
+
+
+Setting up a simple build file
+===============================
+
+Helium is based on `Apache Ant`_, a build tool written in Java that uses XML configuration files. A Helium build configuration must start with a ``build.xml`` file in the directory where Helium commands are run from::
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <project name="full-build">
+ <!-- Import environment variables as Ant properties. -->
+ <property environment="env"/>
+
+ <!-- A basic property definition -->
+ <property name="build.family" value="10.1"/>
+
+ <!-- helium.dir will always refer to the directory of the Helium instance being used.
+
+ All build configurations must import helium.ant.xml to use Helium. -->
+ <import file="${helium.dir}/helium.ant.xml"/>
+ </project>
+
+.. _`Apache Ant`: http://ant.apache.org/
+.. _`Ant manual`: http://ant.apache.org/manual
+
+Helium looks for a ``build.xml`` project file in the current directory. It will parse this and additional imported Ant files to create the project configuration.
+
+
+Basic structure
+===============
+
+The main components of Ant project files are targets, types and tasks.
+
+Targets define a set of tasks to be run as a build step. A target can depend on other targets, so a complete build process can be built up using a chain of targets. A simple target to echo some text to the console might look like this::
+
+ <target name="print-hello">
+ <echo>Hello!</echo>
+ </target>
+
+Types are information elements for configuring the build. The most common are properties that define a single value or location::
+
+ <property name="build.family" value="10.1"/>
+
+Properties representing locations are normalised to full paths when the ``location`` attribute is used::
+
+ <property name="helium.build.dir" location="${helium.dir}/build"/>
+
+.. note:: Once a property is defined it is immutable. The value of a property is defined by the first definition that is found.
+
+Another common type is a fileset that represents a collection of files, typically using wildcard selection::
+
+ <fileset id="foo.bar" dir="${helium.build.dir}">
+ <include name="**/*.xml"/>
+ </fileset>
+
+This will select all XML files under the ``helium.build.dir`` directory. Note the use of ``${}`` to insert the value of a property.
+
+There are a number of other types such as dirset, filelist, patternset which may be used for some configuration. See the "Concepts and Types" section of the `Ant manual`_ for more details.
+
+
+Import statements
+-----------------
+
+Import statements are used to pull additional Ant project file content into the main project::
+
+ <import file="${helium.dir}/helium.ant.xml"/>
+
+Here the order of elements is significant:
+
+Properties
+ Must be defined before the import to override a property value in an imported file. See the `properties list <api/helium/properties_list.html>`_ for default values.
+
+Types
+ Other types such as filesets, dirsets that are referenced by ``ID`` must be defined after the import.
+
+Targets
+ Can be defined anywhere in the file.
+
+``helium.ant.xml`` is the root file to import from Helium, which will pull in all the Helium content.
+
+
+Run a command
+=============
+
+Make sure Helium is on the ``PATH``. Then the ``hlm`` command can be run from the project directory containing the ``build.xml`` file. Try a quick test::
+
+ hlm hello
+
+This should echo "Hi!" to the console, which shows that Helium can be imported successfully.
+
+A target can be run using its name as a command::
+
+ hlm [target]
+
+Often it can be useful to define or override property values on the command line, like this::
+
+ hlm [target] -Dname=value
+
+
+Setting up a build
+==================
+
+An actual build process is defined by chaining together a number of major build stages, e.g. preparation, compilation, ROM building, etc. So a top-level build process target called from the command line might look like this::
+
+ <target name="run-custom-tool">
+ <exec executable="foo.exe">
+ <arg name="bar"/>
+ </exec>
+ </target>
+
+ <target name="full-build" depends="prep,run-custom-tool,compile-main,rombuild,final"/>
+
+In this case an additional target is defined and run after prep but before compilation. The full build is then run by calling::
+
+ hlm full-build -Dbuild.number=1
+
+Configuring build stages
+------------------------
+
+Configuring each build stage typically involves defining or overriding properties and other types that are needed for that stage. In some cases special XML file formats are used. Please refer to the `appropriate sections <manual/stages.html>`_ of the manual for information on configuring each stage.
+
+There are a number of individual features that can be enabled or disabled using flag properties. See `this list <manual/configuring_features.html>`_.
+
+
+Overriding and extending targets
+================================
+
+If the build sequence needs customizing or extending, it is useful to be able to define new targets and potentially override existing Helium targets. Targets can be defined anywhere within the XML file. If multiple targets have the same name the first one to be parsed in the order of importing Ant files will be executed when called by name. Any target can be called explicitly by using its fully-qualified name which is constructed by prepending the name of the enclosing project, e.g.::
+
+ hlm common.hello
+
+This calls the ``hello`` target which is located in the common project file. It can be seen in the `API documentation`_.
+
+.. _`API documentation`: api/helium/project-common.html#hello
+
+Any existing target can be extended by overriding it and adding custom steps at the start or the end. To add steps to the start of a target, override it defining a new custom target and the original one as dependencies, e.g. to run a step before preparation::
+
+ <target name="custom-step">
+ <echo>Run before original target.</echo>
+ </target>
+
+ <target name="prep" depends"custom-step,preparation.prep">
+
+Additional steps could be added to the end of a target using a similar method, or just include them in the overriding target thus::
+
+ <target name="prep" depends="preparation.prep">
+ <echo>Run after original target.</echo>
+ </target>
+
+
+Basic operations
+================
+
+Simple file-based tasks
+-----------------------
+
+Ant has core support for wide range of file-based tasks. Here are a few simple examples:
+
+Copying all HTML log files by wildcard::
+
+ <copy todir="${build.drive}/html_logs">
+ <fileset dir="${build.drive}/output/logs">
+ <includes name="**/*.html"/>
+ </fileset>
+ </copy>
+
+Zip all the log files::
+
+ <fileset id="html.logs.id" dir="${build.drive}/output/logs">
+ <includes name="**/*"/>
+ </fileset>
+
+ <zip destfile="${build.drive}/html_logs.zip">
+ <fileset refid="html.logs.id"/>
+ </zip>
+
+Deleting text log files::
+
+ <delete verbose="true">
+ <fileset id="html.logs.id" dir="${build.drive}/output/logs">
+ <includes name="**/*.txt"/>
+ </fileset>
+ </delete>
+
+See the Ant Tasks section of the `Ant manual`_ for a full list of available tasks.
+
+
+Running an external tool
+------------------------
+
+The ``<exec>`` task can be used to run an external tool::
+
+ <target name="run-custom-tool">
+ <exec executable="custom.exe">
+ <arg name="bar"/>
+ </exec>
+ </target>
+
+See the `Ant manual entry <http://ant.apache.org/manual/Tasks/exec.html>`_ for more details on how to use the ``<exec>`` task. Use ``<exec>`` along with the customisation methods above to call additional tools at suitable places during the build. The `Setting up a build`_ section shows how a custom tool target could be called during a full build process.
+
+External scripts can be run by calling the appropriate runtime executable and providing the script as an argument::
+
+ <exec executable="python.exe">
+ <arg name="custom-script.py"/>
+ </exec>
+
+
+Simple macros
+-------------
+
+Defining a macro is a useful method of combining a set of task steps to avoid repetition. This example defines a macro called ``testing`` and calls it::
+
+ <macrodef name="testing">
+ <attribute name="v" default="NOT SET"/>
+ <element name="some-tasks" optional="yes"/>
+ <sequential>
+ <echo>v is @{v}</echo>
+ <some-tasks/>
+ </sequential>
+ </macrodef>
+
+ <testing v="This is v">
+ <some-tasks>
+ <echo>this is a test</echo>
+ </some-tasks>
+ </testing>
+
+
+Getting help
+============
+
+There are several sources of further information:
+
+ * The `Helium manual`_.
+ * The `Helium API`_ of `targets`_, `properties`_ and `macros`_.
+ * Command line help. Try running::
+
+ hlm help [name]
+
+ to get help on a specific target or property.
+
+.. _`Helium API`: api/helium/index.html
+.. _`targets`: api/helium/targets_list.html
+.. _`properties`: api/helium/properties_list.html
+.. _`macros`: api/helium/macros_list.html
+
--- a/buildframework/helium/doc/src/quick_start_guide.rst.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/quick_start_guide.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -70,8 +70,7 @@
- `Using Ant <http://ant.apache.org/manual/using.html>`_: specifically the Projects and Properties sections.
- `Configure Helium <manual/configuring.html>`_: `common configuration format <manual/configuring.html#common-configuration-format>`_ and `Helium stages <manual/stages.html>`_.
- - `Helium glossary <api/helium/properties-table.html>`_: lists the specific properties used in Helium.
-
+ - `Helium glossary <api/helium/properties_list.html>`_: lists the specific properties used in Helium.
.. index::
single: Running builds with Helium
--- a/buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/tutorials/imaker/buildinfo_creation.rst Mon Oct 18 10:23:52 2010 +0100
@@ -34,7 +34,6 @@
<property name="rombuild.buildinfo.template" location="./image_conf_buildinfo.mk.ftl"/>
-
FTL template
~~~~~~~~~~~~
@@ -51,31 +50,6 @@
::
> hlm.bat -Dbuild.drive=Z: rombuild-imaker-create-buildinfo
- *** WARNING: Can't find vcvars32.bat - MS Visual Studio not present.
- Buildfile: build.xml
-
- create-data-model-db:
-
- validate-at-startup:
- [python] ERROR: Description has no content for 'read.build.int'
- [python] WARNING: Required property not defined: sysdef.configurations.list
- [python] WARNING: Required property not defined: tsrc.data.dir
- [python] WARNING: Required property not defined: ats3.pathToDrop
- [python] WARNING: Required property not defined: ats3.host
- [python] WARNING: Required property not defined: ats.flash.images
- [python] WARNING: Required property not defined: ats.image.type
- [python] WARNING: Required property not defined: ats.drop.file
- [python] WARNING: Required property not defined: ats3.username
- [python] WARNING: Required property not defined: cache.drive
- [python] WARNING: Required property not defined: ats.product.name
- [python] WARNING: Required property not defined: ats3.password
-
- rombuild-imaker-create-buildinfo:
- [fmpp] File processed.
-
- BUILD SUCCESSFUL
- Total time: 3 seconds
-
The output
~~~~~~~~~~
@@ -89,25 +63,24 @@
##########################################################################
BUILD_LOGGING_KEY_STAGES = prep,build-ebs-main,postbuild,flashfiles,java-certification-rom,zip-main,publish-generic,variants-core,variants-elaf,variants-china,variants-thai,variants-japan,variants,mobilecrash-prep,localise-tutorial-content,hdd-images,zip-flashfiles,zip-localisation,data-packaging-prep
- BUILD_SUMMARY_FILE_2 = Z:\output\logs\summary\pf_5250_16_wk2008_summary.log2.xml
- BUILD_LOG = Z:\output\logs\pf_5250_16_wk2008_ant_build.log
- BUILD_NAME = pf_5250
- BUILD_CACHE_LOG_DIR = C:\DOCUME~1\wbernard\LOCALS~1\Temp\helium\pf_5250_16_wk2008\logs
+ BUILD_SUMMARY_FILE_2 = Z:\output\logs\summary\x_16_wk2008_summary.log2.xml
+ BUILD_LOG = Z:\output\logs\x_16_wk2008_ant_build.log
+ BUILD_NAME = x
+ BUILD_CACHE_LOG_DIR = C:\DOCUME~1\x\LOCALS~1\Temp\helium\x_16_wk2008\logs
BUILD_SYSTEM = ebs
BUILD_LOG_DIR = Z:\output\logs
- BUILD_CACHE_DIR = C:\DOCUME~1\wbernard\LOCALS~1\Temp\helium\pf_5250_16_wk2008
+ BUILD_CACHE_DIR = C:\DOCUME~1\x\LOCALS~1\Temp\helium\x_16_wk2008
BUILD_OUTPUT_DIR = Z:\output
- BUILD_SUMMARY_FILE = Z:\output\logs\pf_5250_16_wk2008_build_summary.xml
+ BUILD_SUMMARY_FILE = Z:\output\logs\x_16_wk2008_build_summary.xml
BUILD_VERSION = 0.0.1
BUILD_SYSTEM_EBS = Not used
BUILD_SISFILES_DIR = Z:\output\sisfiles
BUILD_ERRORS_LIMIT = 0
BUILD_DRIVE = Z:
BUILD_NUMBER = 1
- BUILD_DUPLICATES_LOG = Z:\output\logs\pf_5250_16_wk2008_build_duplicates.xml
+ BUILD_DUPLICATES_LOG = Z:\output\logs\x_16_wk2008_build_duplicates.xml
BUILD_LOGGING_START_STAGE = check-env-prep
- BUILD_ID = pf_5250_16_wk2008
-
+ BUILD_ID = x_16_wk2008
Download the example: `buildinfo_creation.zip <buildinfo_creation.zip>`_
\ No newline at end of file
--- a/buildframework/helium/doc/src/user_graph.dot.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/doc/src/user_graph.dot.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -107,7 +107,7 @@
"DOS Scripting" -> NOSE[dir=none, lhead=cluster_4_1, ltail=cluster_4];
- Start [fontcolor=navyblue,fontsize=12,style=filled,href="introduction.html"];
+ Start [fontcolor=navyblue,fontsize=12,style=filled,href="manual/introduction.html"];
Ant [fontcolor=navyblue,fontsize=12,shape=box,href="http://ant.apache.org/manual/"];
"Running Helium" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/running.html"];
@@ -123,7 +123,7 @@
"ROM Image" [fontcolor=navyblue,fontsize=12,shape=box,href="tutorials/rom_image.html"];
<#if !(ant?keys?seq_contains("sf"))>
- "Setting up Helium at Nokia" [fontcolor=navyblue,fontsize=12,shape=box,href="nokia/nokia.html"];
+ "Setting up Helium at Nokia" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/retrieving.html"];
"Helium Nokia Stages" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/nokiastages.html"];
Diamonds [fontcolor=navyblue,fontsize=12,shape=box,href="http://diamonds.nmp.nokia.com/diamonds/"];
"Helium Wiki" [fontcolor=navyblue,fontsize=12,shape=box,href="http://delivery.nmp.nokia.com/trac/helium/wiki"];
@@ -131,7 +131,7 @@
MCL [fontcolor=navyblue,fontsize=12,shape=box,href="http://s60wiki.nokia.com/S60Wiki/S60_Software_Asset_Management/Organization/Delivery_Services/Howto_build_DFS70.91.91_/_S60.MCL_with_Helium"];
IDO [fontcolor=navyblue,fontsize=12,shape=box,href="http://helium.nmp.nokia.com/doc/ido"];
TeamCI [fontcolor=navyblue,fontsize=12,shape=box,href="http://helium.nmp.nokia.com/doc/teamci"];
- "Helium Test Plan" [fontcolor=navyblue,fontsize=12,shape=box,href="manual/testing.html"];
+ "Helium Test Plan" [fontcolor=navyblue,fontsize=12,shape=box,href="development/testing.html"];
</#if>
"Helium Developer Guide" [fontcolor=navyblue,fontsize=12,shape=box,href="development/developer_guide.html"];
@@ -139,7 +139,7 @@
Python [fontcolor=navyblue,fontsize=12,shape=box,href="http://www.python.org/"];
Java [fontcolor=navyblue,fontsize=12,shape=box,href="http://java.sun.com/j2se/"];
FMPP [fontcolor=navyblue,fontsize=12,shape=box,href="http://fmpp.sourceforge.net/"];
- "DOS Scripting" [fontcolor=navyblue,fontsize=12,shape=box,href="http://en.wikipedia.org/wiki/Batch_script"];
+ "DOS Scripting" [fontcolor=navyblue,fontsize=12,shape=box,href="http://en.wikipedia.org/wiki/Batch_file"];
ANTUnit [fontcolor=navyblue,fontsize=12,shape=box,href="http://ant.apache.org/antlibs/antunit/"];
NOSE [fontcolor=navyblue,fontsize=12,shape=box,href="http://ivory.idyll.org/articles/nose-intro.html"];
}
--- a/buildframework/helium/helium.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/helium.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -22,11 +22,11 @@
-->
<project name="helium" xmlns:hlm="http://www.nokia.com/helium">
<description>
- Main full build targets and properties
+ Main starting point to import Helium. Imports the other main Ant files.
</description>
<property environment="env" />
-
+
<!-- Load the current Helium version. -->
<!--* @property helium.version
@type string
@@ -68,6 +68,7 @@
<import file="tools/testing/testing.ant.xml" />
<import file="tools/startup/bootstrap/bootstrap.ant.xml"/>
<import file="tools/iad/iad.ant.xml"/>
+ <import file="tools/blocks/blocks.ant.xml"/>
<import file="config/signaling_config_default.ant.xml"/>
<import file="config/stages_config_default.ant.xml"/>
<import file="config/metadata_filter_config_default.ant.xml"/>
--- a/buildframework/helium/hlm Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/hlm Mon Oct 18 10:23:52 2010 +0100
@@ -20,7 +20,7 @@
fi
export LANG="en_US.UTF-8"
-export ANT_ARGS="-lib $HELIUM_HOME/external/antlibs2 -logger com.nokia.ant.HeliumLogger -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor -listener com.nokia.helium.logger.ant.listener.StatusAndLogListener -listener com.nokia.helium.core.ant.listener.TargetTimesLogGeneratorListener"
+export ANT_ARGS="-lib $HELIUM_HOME/external/antlibs2 -logger com.nokia.helium.core.ant.HeliumLogger -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor -listener com.nokia.helium.logger.ant.listener.CommonListener -listener com.nokia.helium.core.ant.listener.TargetTimesLogGeneratorListener"
TEMP_PYTHONPATH="$HELIUM_HOME/external/python/lib/common:$HELIUM_HOME/external/python/lib/auto:$HELIUM_HOME/extensions/nokia/external/python/lib/2.5:$HELIUM_HOME/extensions/nokia/tools/common/python/lib"
@@ -64,7 +64,7 @@
else
export HELIUM_CACHE_DIR="$TEMP/helium/$USER"
fi
-export ANT_OPTS="-Dlog4j.configuration=com/nokia/log4j.xml -Dlog4j.cache.dir=$HELIUM_CACHE_DIR"
+export ANT_OPTS="$HLM_OPTS -Dlog4j.configuration=com/nokia/log4j.xml -Dlog4j.cache.dir=$HELIUM_CACHE_DIR -Dpython.verbose=warning"
export PYTHON_CACHEDIR="$HELIUM_CACHE_DIR/python"
mkdir -p $HELIUM_CACHE_DIR
--- a/buildframework/helium/hlm.bat Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/hlm.bat Mon Oct 18 10:23:52 2010 +0100
@@ -1,11 +1,65 @@
@echo off
-rem if not defined HELIUM_HOME set HELIUM_HOME=%~dp0..\..\..\helium
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem
+
+setlocal
+
+REM Set the Helium location
+REM Make sure the path is not ending with a backslash!
+if not defined HELIUM_HOME (
+ set HELIUM_HOME_TEMP=%~dp0
+)
+if not defined HELIUM_HOME (
+ set HELIUM_HOME=%HELIUM_HOME_TEMP:~0,-1%
+)
-helium\hlm.bat %*
+rem Loading runtime environment tools
+if exist "%HELIUM_HOME%\runtime\runtime_env.bat" (
+call %HELIUM_HOME%\runtime\runtime_env.bat
+)
+
+if not exist "%HELIUM_HOME%\extensions\nokia\build.xml" (
+set HLM_SUBCON=1
+set HLM_DISABLE_INTERNAL_DATA=1
+)
+
-perl "%HELIUM_HOME%\tools\common\bin\getppid.pl" > %TEMP%\%USERNAME%pid.txt
-set /p PID=< %TEMP%\%USERNAME%pid.txt
+REM Configure Java
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE set TESTED_JAVA=%JAVA_6_HOME%
+if exist "%TESTED_JAVA%" (set JAVA_HOME=%TESTED_JAVA%)
+if not exist "%JAVA_HOME%" ( echo *** Java cannot be found & goto :errorstop )
+set PATH=%JAVA_HOME%\bin;%PATH%
+
+REM Needed by python logging
+set PID=1
+perl "%HELIUM_HOME%\tools\common\bin\getppid.pl" > "%TEMP%\%USERNAME%pid.txt"
+set /p PID=< "%TEMP%\%USERNAME%pid.txt"
+
+REM Configure Apache Ant
+if not defined TESTED_ANT (
+ set TESTED_ANT=C:\APPS\ant_1.7
+)
+if exist "%TESTED_ANT%" (set ANT_HOME=%TESTED_ANT%)
+if not exist "%ANT_HOME%" ( echo *** Ant cannot be found & goto :errorstop )
+
+set SIGNALING_ANT_ARGS= -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor
+set LOGGING_ANT_ARGS= -listener com.nokia.helium.logger.ant.listener.CommonListener
if not defined HLM_DISABLE_INTERNAL_DATA (
set INTERNAL_DATA_ANT_ARGS= -listener com.nokia.helium.internaldata.ant.listener.Listener
@@ -18,7 +72,7 @@
if not defined ANT_ARGS (
-set ANT_ARGS=-lib "%HELIUM_HOME%\external\antlibs2" -logger com.nokia.ant.HeliumLogger %INTERNAL_DATA_ANT_ARGS% %SIGNALING_ANT_ARGS% %LOGGING_ANT_ARGS% %TARGET_TIMES_GENERATOR% -listener com.nokia.helium.environment.ant.listener.ExecListener
+set ANT_ARGS=-lib "%HELIUM_HOME%\external\antlibs2" -logger com.nokia.helium.core.ant.HeliumLogger %INTERNAL_DATA_ANT_ARGS% %SIGNALING_ANT_ARGS% %LOGGING_ANT_ARGS% %TARGET_TIMES_GENERATOR% -listener com.nokia.helium.environment.ant.listener.ExecListener
)
REM Shall we impose the EPOCROOT?
@@ -79,12 +133,14 @@
REM pass cache dir to a property for log4j log file
if not defined ANT_OPTS (
- set ANT_OPTS=-Xmx896M -Dlog4j.configuration=com/nokia/log4j.xml -Dlog4j.cache.dir=%HELIUM_CACHE_DIR% -Dpython.verbose=warning
+ set ANT_OPTS=%HLM_OPTS% -Xmx896M -Dlog4j.configuration=com/nokia/log4j.xml -Dlog4j.cache.dir=%HELIUM_CACHE_DIR% -Dpython.verbose=warning -Dpython.cachedir=%HELIUM_CACHE_DIR%\cachedir
call "%HELIUM_HOME%\external\python\configure_jython.bat"
)
call ant -Dhelium.dir="%HELIUM_HOME%" -Dcache.dir=%HELIUM_CACHE_DIR% %*
+
+
endlocal
goto :eof
--- a/buildframework/helium/sf/deps/com.nokia.helium.config/helium-sf-config/1.0/ivy.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/deps/com.nokia.helium.config/helium-sf-config/1.0/ivy.xml Mon Oct 18 10:23:52 2010 +0100
@@ -54,9 +54,11 @@
<dependency org="com.nokia.helium" name="helium-synergy" rev="latest.integration" conf="default"/>
<dependency org="com.nokia.helium" name="helium-ccmtask" rev="latest.integration" conf="default"/>
<dependency org="com.nokia.helium" name="java-analyser-config" rev="latest.integration" conf="default"/>
+ <dependency org="com.nokia.helium" name="helium-blocks" rev="latest.integration" conf="default"/>
<!-- Helium Python deps -->
<dependency org="com.nokia.helium" name="pythoncore" rev="latest.integration" conf="default"/>
+ <dependency org="com.nokia.helium" name="blockspackager" rev="latest.integration" conf="default"/>
<!-- Ant specific dependencies -->
<dependency org="de.jeckle" name="xia" rev="1.0" conf="default"/>
Binary file buildframework/helium/sf/deps/net.sourceforge.docutils/docutils/0.5/docutils-0.5.py2.5.egg has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/deps/net.sourceforge.docutils/docutils/0.5/ivy.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+============================================================================
+Name : ivy.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
+ <info
+ organisation="net.sourceforge.docutils"
+ module="docutils"
+ status="release"
+ revision="0.5" />
+ <publications>
+ <artifact type="egg" ext="py2.5.egg" conf="default" />
+ </publications>
+</ivy-module>
--- a/buildframework/helium/sf/doc/src/index.rst Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-=============
-Helium Antlib
-=============
-.. _Helium Antlib Java API: api/javadoc/index.html
-.. _Helium Antlib AntDoclet: api/doclet/index.html
-
-Developer Documentation
-=======================
-.. toctree::
- :maxdepth: 1
- :glob:
-
- *
-
-API Documentation
-=================
- * `Helium Antlib AntDoclet`_
- * `Helium Antlib Java API`_
-
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/doc/src/index.rst.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,43 @@
+<#--
+============================================================================
+Name : .ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+=============
+Helium Antlib
+=============
+
+Developer Documentation
+=======================
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ *
+
+<#if !(ant?keys?seq_contains("sf"))>
+
+API Documentation
+=================
+ * `Helium Antlib AntDoclet`_
+ * `Helium Antlib Java API`_
+
+.. _Helium Antlib Java API: ../api/javadoc/index.html
+.. _Helium Antlib AntDoclet: ../api/doclet/index.html
+</#if>
\ No newline at end of file
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/AntFile.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/AntFile.java Mon Oct 18 10:23:52 2010 +0100
@@ -76,10 +76,14 @@
doc = contentHandler.getDocument();
}
catch (SAXException e) {
- throw new IOException(e.getMessage());
+ throw new IOException("Error parsing: " + path + " at " + e.getMessage(), e);
}
}
+ public String getName() {
+ return getFile().getName();
+ }
+
public Project getProject() {
return rootProject;
}
@@ -129,4 +133,6 @@
}
return antlibFiles;
}
+
+
}
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/AntObjectMeta.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/AntObjectMeta.java Mon Oct 18 10:23:52 2010 +0100
@@ -17,6 +17,7 @@
package com.nokia.helium.ant.data;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -34,7 +35,7 @@
public class AntObjectMeta {
public static final Map<String, Integer> SCOPES;
-
+
static {
Map<String, Integer> tempMap = new HashMap<String, Integer>();
tempMap.put("public", new Integer(1));
@@ -42,7 +43,7 @@
tempMap.put("private", new Integer(3));
SCOPES = Collections.unmodifiableMap(tempMap);
}
-
+
/** The default scope if an element does not have a defined scope. */
public static final String DEFAULT_SCOPE = "public";
@@ -88,7 +89,7 @@
* @param name Attribute name.
* @return Attribute value.
*/
- protected String getAttr(String name) {
+ public String getAttr(String name) {
if (node.getNodeType() == Node.ELEMENT_NODE) {
String value = ((Element) node).attributeValue(name);
if (value != null) {
@@ -116,6 +117,10 @@
return parent.getRootMeta();
}
+ public AntObjectMeta getParent() {
+ return parent;
+ }
+
/**
* Returns the Ant file this Ant object is contained in.
*/
@@ -150,11 +155,15 @@
*/
public String getLocation() {
RootAntObjectMeta rootMeta = getRootMeta();
- String location = rootMeta.getFilePath();
- if (node instanceof ElementWithLocation) {
- location += ":" + ((ElementWithLocation)node).getLineNumber();
+ return rootMeta.getFilePath() + ":" + getLineNumber();
+ }
+
+ public Integer getLineNumber() {
+ int lineNum = 0;
+ if (node != null && node instanceof ElementWithLocation) {
+ lineNum = ((ElementWithLocation) node).getLineNumber();
}
- return location;
+ return lineNum;
}
/**
@@ -210,10 +219,10 @@
public String getDeprecated() {
return comment.getTagValue("deprecated");
}
-
+
/**
- * Returns the content of the "since" tag that should indicate which release this feature
- * was first added.
+ * Returns the content of the "since" tag that should indicate which release
+ * this feature was first added.
*
* @return Since release number.
*/
@@ -247,7 +256,7 @@
this.comment = comment;
}
- private void processComment() {
+ private void processComment() {
Comment commentNode = getCommentNode();
if (commentNode != null) {
comment = new AntComment(commentNode);
@@ -259,8 +268,7 @@
Node commentNode = null;
if (node.getNodeType() == Node.COMMENT_NODE) {
commentNode = node;
- }
- else {
+ } else {
List<Node> children = node.selectNodes("preceding-sibling::node()");
if (children.size() > 0) {
// Scan past the text nodess, which are most likely whitespace
@@ -275,13 +283,12 @@
if (child.getNodeType() == Node.COMMENT_NODE) {
commentNode = child;
log("Node has comment: " + node.getStringValue(), Project.MSG_DEBUG);
- }
- else {
+ } else {
log("Node has no comment: " + node.toString(), Project.MSG_WARN);
}
}
}
- return (Comment)commentNode;
+ return (Comment) commentNode;
}
public void log(String text, int level) {
@@ -290,8 +297,36 @@
project.log(text, level);
}
}
-
+
public String toString() {
return getName();
}
+
+ public List<TaskMeta> getTasks(String taskType) {
+ return getTaskDefinitions(".//" + taskType);
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<MacroMeta> getScriptDefinitions(String xpathExpression) {
+ List<Element> nodes = getNode().selectNodes(xpathExpression);
+ List<MacroMeta> scripts = new ArrayList<MacroMeta>();
+ for (Element node : nodes) {
+ MacroMeta macroMeta = new MacroMeta(this, node);
+ macroMeta.setRuntimeProject(getRuntimeProject());
+ scripts.add(macroMeta);
+ }
+ return scripts;
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<TaskMeta> getTaskDefinitions(String xpathExpression) {
+ List<Element> nodes = getNode().selectNodes(xpathExpression);
+ List<TaskMeta> tasks = new ArrayList<TaskMeta>();
+ for (Element node : nodes) {
+ TaskMeta taskMeta = new TaskMeta(this, node);
+ taskMeta.setRuntimeProject(getRuntimeProject());
+ tasks.add(taskMeta);
+ }
+ return tasks;
+ }
}
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/Database.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/Database.java Mon Oct 18 10:23:52 2010 +0100
@@ -23,13 +23,10 @@
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
-
import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Target;
-
+import org.apache.tools.ant.ProjectHelper;
import com.nokia.helium.freemarker.WikiMethod;
import freemarker.cache.ClassTemplateLoader;
@@ -50,6 +47,8 @@
public static final String DEFAULT_SCOPE = "public";
public static final Map<String, String> NAMESPACE_MAP;
+ private List<PropertyMeta> propertiesList;
+ private List<PropertyCommentMeta> commentPropertiesList;
private Project rootProject;
private Map<String, AntFile> antfilesMap;
private Map<String, PackageMeta> packagesMap;
@@ -65,23 +64,17 @@
this(project, DEFAULT_SCOPE);
}
- @SuppressWarnings("unchecked")
- public Database(Project project, String scopeFilter) throws IOException {
- this.rootProject = project;
+ public Database(Project rootProject, String scopeFilter) throws IOException {
+ this.rootProject = rootProject;
this.scopeFilter = scopeFilter;
antfilesMap = new HashMap<String, AntFile>();
packagesMap = new HashMap<String, PackageMeta>();
- if (project != null) {
- Map<String, Target> targets = project.getTargets();
- Iterator<Target> targetsIter = targets.values().iterator();
-
- while (targetsIter.hasNext()) {
- Target target = targetsIter.next();
- String antFilePath = new File(target.getLocation().getFileName()).getCanonicalPath();
-
- if (!antfilesMap.containsKey(antFilePath)) {
- addAntFile(antFilePath);
+ if (rootProject != null) {
+ ProjectHelper helper = (ProjectHelper) rootProject.getReference(ProjectHelper.PROJECTHELPER_REFERENCE);
+ for (Object antFilename : helper.getImportStack()) {
+ if (antFilename instanceof File) {
+ addAntFile(((File) antFilename).getCanonicalPath());
}
}
}
@@ -101,7 +94,7 @@
private void addAntFile(String antFilePath) throws IOException {
if (!antfilesMap.containsKey(antFilePath)) {
- log("Adding project to database: " + antFilePath, Project.MSG_DEBUG);
+ log("Adding project to database: " + antFilePath, Project.MSG_VERBOSE);
AntFile antfile = new AntFile(this, antFilePath, scopeFilter);
antfile.setProject(rootProject);
antfilesMap.put(antFilePath, antfile);
@@ -193,25 +186,29 @@
}
public List<PropertyMeta> getProperties() {
- List<PropertyMeta> propertiesList = new ArrayList<PropertyMeta>();
- for (AntFile antfile : antfilesMap.values()) {
- RootAntObjectMeta rootMeta = antfile.getRootObjectMeta();
- if (rootMeta instanceof ProjectMeta) {
- propertiesList.addAll(((ProjectMeta) rootMeta).getProperties());
+ if ( propertiesList == null) {
+ propertiesList = new ArrayList<PropertyMeta>();
+ for (AntFile antfile : antfilesMap.values()) {
+ RootAntObjectMeta rootMeta = antfile.getRootObjectMeta();
+ if (rootMeta instanceof ProjectMeta) {
+ propertiesList.addAll(((ProjectMeta) rootMeta).getProperties());
+ }
}
}
return propertiesList;
}
-
+
public List<PropertyCommentMeta> getCommentProperties() {
- List<PropertyCommentMeta> propertiesList = new ArrayList<PropertyCommentMeta>();
- for (AntFile antfile : antfilesMap.values()) {
- RootAntObjectMeta rootMeta = antfile.getRootObjectMeta();
- if (rootMeta instanceof ProjectMeta) {
- propertiesList.addAll(((ProjectMeta) rootMeta).getPropertyCommentBlocks());
+ if (commentPropertiesList == null) {
+ commentPropertiesList = new ArrayList<PropertyCommentMeta>();
+ for (AntFile antfile : antfilesMap.values()) {
+ RootAntObjectMeta rootMeta = antfile.getRootObjectMeta();
+ if (rootMeta instanceof ProjectMeta) {
+ commentPropertiesList.addAll(((ProjectMeta) rootMeta).getPropertyCommentBlocks());
+ }
}
}
- return propertiesList;
+ return commentPropertiesList;
}
public List<PackageMeta> getPackages() throws IOException {
@@ -221,4 +218,15 @@
}
return packages;
}
+
+ public List<TargetMeta> getTargets() {
+ List<TargetMeta> targets = new ArrayList<TargetMeta>();
+ for (AntFile antFile : antfilesMap.values()) {
+ RootAntObjectMeta rootMeta = antFile.getRootObjectMeta();
+ if (rootMeta instanceof ProjectMeta) {
+ targets.addAll(((ProjectMeta)rootMeta).getTargets());
+ }
+ }
+ return targets;
+ }
}
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/MacroMeta.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/MacroMeta.java Mon Oct 18 10:23:52 2010 +0100
@@ -17,6 +17,7 @@
package com.nokia.helium.ant.data;
+import java.util.ArrayList;
import java.util.List;
import org.dom4j.Element;
@@ -34,6 +35,10 @@
public String getDescription() {
return getAttr("description");
}
+
+ public String getText() {
+ return getNode().getText();
+ }
@SuppressWarnings("unchecked")
public String getUsage() {
@@ -66,4 +71,17 @@
return "<hlm:" + macroName + " " + usage + ">\n" + macroElements + " </hlm:" + macroName + ">";
}
}
+
+ @SuppressWarnings("unchecked")
+ public List<String> getAttributes() {
+ List<String> attributes = new ArrayList<String>();
+ if (getNode().getNodeType() == Node.ELEMENT_NODE) {
+ Element element = (Element)getNode();
+ List<Element> attributeNodes = element.elements("attribute");
+ for (Element attributeNode : attributeNodes) {
+ attributes.add(attributeNode.attributeValue("name"));
+ }
+ }
+ return attributes;
+ }
}
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/ProjectMeta.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/ProjectMeta.java Mon Oct 18 10:23:52 2010 +0100
@@ -111,19 +111,6 @@
return properties;
}
- @SuppressWarnings("unchecked")
- public List<MacroMeta> getMacros() {
- ArrayList<MacroMeta> objects = new ArrayList<MacroMeta>();
- List<Element> nodes = getNode().selectNodes("//macrodef | //scriptdef");
- for (Element node : nodes) {
- MacroMeta macroMeta = new MacroMeta(this, node);
- macroMeta.setRuntimeProject(getRuntimeProject());
- if (macroMeta.matchesScope(getScopeFilter())) {
- objects.add(macroMeta);
- }
- }
- return objects;
- }
@SuppressWarnings("unchecked")
public List<String> getProjectDependencies() {
@@ -181,13 +168,12 @@
}
}
- @SuppressWarnings("unchecked")
+ @SuppressWarnings("rawtypes")
private String findSignalFailMode(String signalid, Document antDoc) {
XPath xpath2 = DocumentHelper.createXPath("//hlm:signalListenerConfig[@id='" + signalid
+ "']/signalNotifierInput/signalInput");
xpath2.setNamespaceURIs(Database.NAMESPACE_MAP);
List signalNodes3 = xpath2.selectNodes(antDoc);
-
for (Iterator iterator3 = signalNodes3.iterator(); iterator3.hasNext();) {
Element propertyNode3 = (Element) iterator3.next();
String signalinputid = propertyNode3.attributeValue("refid");
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/PropertyMeta.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/PropertyMeta.java Mon Oct 18 10:23:52 2010 +0100
@@ -29,6 +29,7 @@
public static final String STRING_TYPE = "string";
public static final String INTEGER_TYPE = "integer";
public static final String BOOLEAN_TYPE = "boolean";
+ public static final String FLOAT_TYPE = "float";
public static final String DEFAULT_TYPE = STRING_TYPE;
public PropertyMeta(AntObjectMeta parent, Node propNode) {
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/RootAntObjectMeta.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/RootAntObjectMeta.java Mon Oct 18 10:23:52 2010 +0100
@@ -51,7 +51,7 @@
public AntFile getAntFile() {
return antFile;
}
-
+
/**
* Returns the location path of the object.
*
@@ -73,19 +73,15 @@
return this;
}
- @SuppressWarnings("unchecked")
- public List<MacroMeta> getMacros() throws IOException {
- ArrayList<MacroMeta> objects = new ArrayList<MacroMeta>();
- List<Element> nodes = getNode().selectNodes("//macrodef | //scriptdef");
- for (Element node : nodes) {
- MacroMeta macroMeta = new MacroMeta(this, node);
- macroMeta.setRuntimeProject(getRuntimeProject());
- if (macroMeta.matchesScope(scopeFilter)) {
- objects.add(macroMeta);
+ public List<MacroMeta> getMacros() {
+ List<MacroMeta> objects = getScriptDefinitions("//macrodef | //scriptdef");
+ List<MacroMeta> filteredList = new ArrayList<MacroMeta>();
+ for (MacroMeta macroMeta : objects) {
+ if (macroMeta.matchesScope(getScopeFilter())) {
+ filteredList.add(macroMeta);
}
}
- return objects;
+ return filteredList;
}
+
}
-
-
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/TargetMeta.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/TargetMeta.java Mon Oct 18 10:23:52 2010 +0100
@@ -43,12 +43,36 @@
super(parent, node);
}
+ private String getPropertyFromDb(String prop) {
+ for (PropertyMeta property : getDatabase().getProperties()) {
+ if (property.getName().equals(prop)
+ && property.matchesScope(getRootMeta().getScopeFilter())) {
+ return prop;
+ }
+ }
+ for (PropertyCommentMeta property : getDatabase().getCommentProperties()) {
+ if (property.getName().equals(prop)
+ && property.matchesScope(getRootMeta().getScopeFilter())) {
+ return prop;
+ }
+ }
+ return null;
+ }
+
public String getIf() {
- return getAttr("if");
+ String propertyIf = getAttr("if");
+ if (!propertyIf.isEmpty() && getPropertyFromDb(propertyIf) != null) {
+ return propertyIf;
+ }
+ return "";
}
public String getUnless() {
- return getAttr("unless");
+ String propertyUnless = getAttr("unless");
+ if (!propertyUnless.isEmpty() && getPropertyFromDb(propertyUnless) != null) {
+ return propertyUnless;
+ }
+ return "";
}
public String getDescription() {
@@ -84,7 +108,7 @@
AntFile antFile = (AntFile) iterator.next();
RootAntObjectMeta rootObjectMeta = antFile.getRootObjectMeta();
if (rootObjectMeta instanceof ProjectMeta) {
- ProjectMeta projectMeta = (ProjectMeta)rootObjectMeta;
+ ProjectMeta projectMeta = (ProjectMeta) rootObjectMeta;
projectMeta.getConfigSignals(getName(), signals);
}
}
@@ -95,7 +119,17 @@
ArrayList<String> properties = new ArrayList<String>();
Visitor visitor = new AntPropertyVisitor(properties);
getNode().accept(visitor);
- return properties;
+ return filterPropertyDependencies(properties);
+ }
+
+ private List<String> filterPropertyDependencies(ArrayList<String> properties) {
+ List<String> propertiesFiltered = new ArrayList<String>();
+ for (String string : properties) {
+ if (getPropertyFromDb(string) != null) {
+ propertiesFiltered.add(string);
+ }
+ }
+ return propertiesFiltered;
}
private class AntPropertyVisitor extends VisitorSupport {
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/TaskContainerMeta.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/TaskContainerMeta.java Mon Oct 18 10:23:52 2010 +0100
@@ -106,7 +106,7 @@
if (name.endsWith("signal") || name.endsWith("execSignal")) {
String signalid = node.attributeValue("name");
- if (signalList != null) {
+ if (signalid != null && signalid.length() > 0) {
signalList.add(signalid);
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/TaskMeta.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.ant.data;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.dom4j.Element;
+import org.dom4j.Node;
+
+/**
+ * Meta object representing an Ant task.
+ *
+ */
+public class TaskMeta extends AntObjectMeta {
+
+ public TaskMeta(AntObjectMeta parent, Node node) {
+ super(parent, node);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Map<String, String> getParams() {
+ Map<String, String> params = new HashMap<String, String>();
+
+ if (getNode().getNodeType() == Node.ELEMENT_NODE) {
+ Element element = (Element)getNode();
+ List<Element> paramNodes = element.elements("param");
+ for (Element paramNode : paramNodes) {
+ params.put(paramNode.attributeValue("name"), paramNode.attributeValue("value"));
+ }
+ }
+ return params;
+ }
+}
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -23,6 +23,5 @@
<antlib>
<!-- Task definition -->
<taskdef name="database" classname="com.nokia.helium.ant.data.taskdefs.DatabaseTask" />
- <taskdef name="antconfiglint" classname="com.nokia.helium.ant.data.taskdefs.AntConfigLintTask" />
</antlib>
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/taskdefs/AntConfigLintTask.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.ant.data.taskdefs;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.DynamicElement;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Task;
-
-import com.nokia.helium.ant.data.Database;
-import com.nokia.helium.ant.data.types.AntLintCheck;
-import com.nokia.helium.ant.data.types.LintIssue;
-
-/**
- * Another version of AntLint that fits with the antdata API more closely.
- */
-@SuppressWarnings("serial")
-public class AntConfigLintTask extends Task implements DynamicElement {
-
- // Temporary solution, should change to scanning jar
- public static final Map<String, String> CHECKS = new HashMap<String, String>() {
- {
- put("wrongtypepropertycheck", "WrongTypePropertyCheck");
- // put("protected", new Integer(2));
- // put("private", new Integer(3));
- }
- };
- private List<AntLintCheck> checks = new ArrayList<AntLintCheck>();
- private List<LintIssue> issues = new ArrayList<LintIssue>();
- private Database db;
- private int errorsTotal;
-
- public AntConfigLintTask() throws IOException {
- setTaskName("antconfiglint");
- }
-
- @SuppressWarnings("unchecked")
- public Object createDynamicElement(String name) {
- AntLintCheck check = null;
- String className = "com.nokia.helium.ant.data.types." + CHECKS.get(name);
- log("Creating check: " + className, Project.MSG_DEBUG);
- try {
- Class<AntLintCheck> clazz = (Class<AntLintCheck>) Class.forName(className);
- if (clazz != null) {
- check = (AntLintCheck) clazz.newInstance();
- checks.add(check);
- }
- }
- catch (ClassNotFoundException th) {
- th.printStackTrace();
- throw new BuildException("Error in Antlint configuration: " + th.getMessage());
- } catch (InstantiationException th) {
- th.printStackTrace();
- throw new BuildException("Error in Antlint configuration: " + th.getMessage());
- } catch (IllegalAccessException th) {
- th.printStackTrace();
- throw new BuildException("Error in Antlint configuration: " + th.getMessage());
- }
- return check;
- }
-
- public void execute() {
- errorsTotal = 0;
- try {
- db = new Database(getProject());
- if (checks.size() == 0) {
- throw new BuildException("No checks defined.");
- }
- for (AntLintCheck check : checks) {
- check.setTask(this);
-
- log("Running check: " + check, Project.MSG_DEBUG);
- check.run();
-
- }
- for (LintIssue issue : issues) {
- log(issue.toString());
- }
- if (errorsTotal > 0) {
- throw new BuildException("AntLint errors found: " + errorsTotal);
- }
- }
- catch (IOException e) {
- throw new BuildException(e.getMessage());
- }
- }
-
- public void addLintIssue(LintIssue issue) {
- issues.add(issue);
- if (issue.getSeverity() == AntLintCheck.SEVERITY_ERROR) {
- errorsTotal++;
- }
- }
-
- public Database getDatabase() {
- return db;
- }
-}
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/types/AntLintCheck.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.ant.data.types;
-
-import java.io.IOException;
-
-import org.apache.tools.ant.types.DataType;
-
-import com.nokia.helium.ant.data.Database;
-import com.nokia.helium.ant.data.taskdefs.AntConfigLintTask;
-
-/**
- * An Ant Lint coding conventions check.
- */
-public abstract class AntLintCheck extends DataType {
- public static final int SEVERITY_ERROR = 0;
- public static final int DEFAULT_SEVERITY = SEVERITY_ERROR;
-
- private AntConfigLintTask task;
- private String name;
- private String text;
- private int severity = DEFAULT_SEVERITY;
-
- /**
- * Set the pattern text.
- *
- * @param text is the pattern text to set.
- */
- public void addText(String text) {
- this.text = text;
- }
-
- /**
- * Get the name of the Checker.
- *
- * @return name of the checker.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Set the name of the Checker.
- *
- * @param name is the name of the checker to set.
- * @ant.required
- */
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * Get the pattern set for this Checker.
- *
- * @return the pattern.
- */
- public String getPattern() {
- return text;
- }
-
- /**
- * Get the severity.
- *
- * @return the severity
- */
- public int getSeverity() {
- return severity;
- }
-
- /**
- * Set the severity. (Valid values : error|warning)
- *
- * @param severity is the severity to set.
- * @ant.required
- */
- public void setSeverity(int severity) {
- this.severity = severity;
- }
-
- public AntConfigLintTask getTask() {
- return task;
- }
-
- public void setTask(AntConfigLintTask task) {
- this.task = task;
- }
-
- protected Database getDb() {
- return task.getDatabase();
- }
-
- public abstract void run() throws IOException;
-}
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/types/LintIssue.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.ant.data.types;
-
-import com.nokia.helium.ant.data.AntFile;
-
-/**
- * An Ant lint issue.
- */
-public class LintIssue {
- private String description;
- private int level;
- private AntFile antfile;
- private String location;
-
- public LintIssue(String description, int level, String location) {
- super();
- this.description = description;
- this.level = level;
- this.location = location;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public int getSeverity() {
- return level;
- }
-
- public void setLevel(int level) {
- this.level = level;
- }
-
- public AntFile getAntfile() {
- return antfile;
- }
-
- public void setAntfile(AntFile antfile) {
- this.antfile = antfile;
- }
-
- public String getLocation() {
- return location;
- }
-
- public void setLocation(String location) {
- this.location = location;
- }
-}
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/types/PropertyNameCheck.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.ant.data.types;
-
-/**
- * A check for the name of a property.
- */
-public class PropertyNameCheck {
-
-}
--- a/buildframework/helium/sf/java/antdata/src/com/nokia/helium/ant/data/types/WrongTypePropertyCheck.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.ant.data.types;
-
-import java.io.IOException;
-import java.util.List;
-
-import org.apache.tools.ant.Project;
-
-import com.nokia.helium.ant.data.PropertyMeta;
-
-/**
- * An AntLint check of the type of a property.
- */
-public class WrongTypePropertyCheck extends AntLintCheck {
- public static final String DESCRIPTION = "Property value does not match type";
-
- @Override
- public void run() throws IOException {
- List<PropertyMeta> properties = getDb().getProperties();
- log("Properties total: " + properties.size(), Project.MSG_DEBUG);
- for (PropertyMeta propertyMeta : properties) {
- String type = propertyMeta.getType();
- String value = propertyMeta.getValue();
- if (value != null) {
- log("Testing for wrong type: " + propertyMeta.getName() + ", type: " + type, Project.MSG_DEBUG);
- if (type.equals("integer")) {
- try {
- Integer.decode(value);
- }
- catch (NumberFormatException e) {
- getTask().addLintIssue(new LintIssue(DESCRIPTION, getSeverity(), propertyMeta.getLocation()));
- }
- }
- }
- else {
- log("Testing for wrong type: " + propertyMeta.getName() + ": value cannot be found", Project.MSG_DEBUG);
- }
- }
- }
-}
-
-
-
--- a/buildframework/helium/sf/java/antdata/tests/data/test_project.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antdata/tests/data/test_project.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -50,8 +50,18 @@
<path id="helium.antdata.classpath">
<fileset dir="${helium.antlib.root.dir}/bin" includes="*.jar"/>
<fileset dir="${helium.antlib.root.dir}/antdata/lib" includes="*.jar"/>
- </path>
+ </path>
+ <!--* @property foo
+ test
+ @type string
+ @scope public
+ -->
+ <!--* @property bar
+ test
+ @type string
+ @scope public
+ -->
<!-- This target is for testing the generation of documentation.
So this comment is also for testing if the comments can be extracted.
@@ -62,6 +72,8 @@
@deprecated Lets pretend this target is deprecated.
-->
+
+
<target name="check-target" if="foo" unless="bar" depends="dep1, dep2" description="A test target">
<antcall target="sub_test_target"/>
<echo>${property1}</echo>
--- a/buildframework/helium/sf/java/antlint/ivy.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/ivy.xml Mon Oct 18 10:23:52 2010 +0100
@@ -30,6 +30,6 @@
<dependencies>
<dependency org="dom4j" name="dom4j" rev="latest.integration" conf="default" />
<dependency org="log4j" name="log4j" rev="1.2.9" conf="default" />
- <dependency name="helium-core" rev="latest.integration" conf="default" />
+ <dependency name="helium-antdata" rev="latest.integration" conf="default" />
</dependencies>
</ivy-module>
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/AntLintHandler.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-package com.nokia.helium.antlint;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
-import org.xml.sax.helpers.DefaultHandler;
-
-import com.nokia.helium.antlint.ant.types.AbstractCheck;
-import com.nokia.helium.antlint.ant.types.Check;
-
-/**
- * <code>AntLintHandler</code> is an SAX2 event handler class used to check for
- * tab characters and indents inside the xml elements.
- *
- */
-public class AntLintHandler extends DefaultHandler {
- private int indentLevel;
- private int indentSpace;
- private Locator locator;
- private boolean textElement;
- private int currentLine;
- private StringBuffer strBuff = new StringBuffer();
-
- private boolean indentationCheck;
- private boolean tabCharacterCheck;
-
- private Check check;
-
- /**
- * Create an instance of {@link AntLintHandler}.
- *
- * @param check
- * is the check to be performed.
- */
- public AntLintHandler(AbstractCheck check) {
- super();
- this.check = check;
- }
-
- /**
- * {@inheritDoc}
- */
- public void setDocumentLocator(Locator locator) {
- this.locator = locator;
- }
-
- /**
- * {@inheritDoc}
- */
- public void startDocument() {
- indentLevel -= 4;
- }
-
- /**
- * Set whether the handler should check for indentation or not.
- *
- * @param indentationCheck
- * a boolean value to set.
- */
- public void setIndentationCheck(boolean indentationCheck) {
- this.indentationCheck = indentationCheck;
- }
-
- /**
- * Set whether the handler should check for tab characters or not.
- *
- * @param tabCharacterCheck
- * is a boolean value to set.
- */
- public void setTabCharacterCheck(boolean tabCharacterCheck) {
- this.tabCharacterCheck = tabCharacterCheck;
- }
-
- /**
- * {@inheritDoc}
- */
- public void startElement(String uri, String name, String qName,
- Attributes atts) {
- countSpaces();
- indentLevel += 4; // When an element start tag is encountered,
- // indentLevel is increased 4 spaces.
- checkIndent();
- currentLine = locator.getLineNumber();
- }
-
- /**
- * {@inheritDoc}
- */
- public void endElement(String uri, String name, String qName) {
- countSpaces();
- // Ignore end tags in the same line
- if (currentLine != locator.getLineNumber()) {
- checkIndent();
- }
- indentLevel -= 4; // When an element end tag is encountered,
- // indentLevel is decreased 4 spaces.
- textElement = false;
- }
-
- /**
- * Check for indentation.
- *
- */
- private void checkIndent() {
- if (indentationCheck) {
- if ((indentSpace != indentLevel) && !textElement) {
- check.getReporter().report(check.getSeverity(),
- "Bad indentation", check.getAntFile(),
- locator.getLineNumber());
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- public void characters(char[] ch, int start, int length) {
- for (int i = start; i < start + length; i++) {
- strBuff.append(ch[i]);
- }
- }
-
- /**
- * Method counts the number of spaces.
- */
- public void countSpaces() {
- // Counts spaces and tabs in every newline.
- int numSpaces = 0;
- for (int i = 0; i < strBuff.length(); i++) {
- switch (strBuff.charAt(i)) {
- case '\t':
- numSpaces += 4;
- if (tabCharacterCheck) {
- check.getReporter().report(check.getSeverity(),
- "Tabs should not be used!", check.getAntFile(),
- locator.getLineNumber());
- }
- break;
- case '\n':
- numSpaces = 0;
- break;
- case '\r':
- break;
- case ' ':
- numSpaces++;
- break;
- default:
- textElement = true;
- break;
- }
- }
- indentSpace = numSpaces;
- strBuff.delete(0, strBuff.length());
- }
-
-}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -27,8 +27,8 @@
<!-- TypeDef definition -->
<typedef name="checkTabCharacter" classname="com.nokia.helium.antlint.ant.types.CheckTabCharacter"/>
<typedef name="checkProjectName" classname="com.nokia.helium.antlint.ant.types.CheckProjectName"/>
- <typedef name="checkScriptDefNameAttributes" classname="com.nokia.helium.antlint.ant.types.CheckScriptDefNameAttributes"/>
<typedef name="checkPropertyName" classname="com.nokia.helium.antlint.ant.types.CheckPropertyName"/>
+ <typedef name="checkScriptDefAttributes" classname="com.nokia.helium.antlint.ant.types.CheckScriptDefAttributes"/>
<typedef name="checkTargetName" classname="com.nokia.helium.antlint.ant.types.CheckTargetName"/>
<typedef name="checkIndentation" classname="com.nokia.helium.antlint.ant.types.CheckIndentation"/>
<typedef name="checkPresetDefMacroDefName" classname="com.nokia.helium.antlint.ant.types.CheckPresetDefMacroDefName"/>
@@ -39,16 +39,19 @@
<typedef name="checkJythonScript" classname="com.nokia.helium.antlint.ant.types.CheckJythonScript"/>
<typedef name="checkUseOfEqualsTask" classname="com.nokia.helium.antlint.ant.types.CheckUseOfEqualsTask"/>
<typedef name="checkScriptCondition" classname="com.nokia.helium.antlint.ant.types.CheckScriptCondition"/>
- <typedef name="checkPythonTasks" classname="com.nokia.helium.antlint.ant.types.CheckPythonTasks"/>
<typedef name="checkScriptDefStyle" classname="com.nokia.helium.antlint.ant.types.CheckScriptDefStyle"/>
- <typedef name="checkScriptDef" classname="com.nokia.helium.antlint.ant.types.CheckScriptDef"/>
<typedef name="checkDuplicateNames" classname="com.nokia.helium.antlint.ant.types.CheckDuplicateNames"/>
<typedef name="checkFileName" classname="com.nokia.helium.antlint.ant.types.CheckFileName"/>
<typedef name="checkAntCall" classname="com.nokia.helium.antlint.ant.types.CheckAntCall"/>
<typedef name="checkTryCatchBlock" classname="com.nokia.helium.antlint.ant.types.CheckTryCatchBlock"/>
+ <typedef name="checkVariableTask" classname="com.nokia.helium.antlint.ant.types.CheckVariableTask"/>
+ <typedef name="checkPropertyTypeAndValueMismatch" classname="com.nokia.helium.antlint.ant.types.CheckPropertyTypeAndValueMismatch"/>
+ <typedef name="checkScriptDefName" classname="com.nokia.helium.antlint.ant.types.CheckScriptDefName"/>
<!-- Reporters -->
<typedef name="antlintConsoleReporter" classname="com.nokia.helium.antlint.ant.types.ConsoleReporter"/>
<typedef name="antlintCheckstyleReporter" classname="com.nokia.helium.antlint.ant.types.CheckstyleXmlReporter"/>
+ <typedef name="pylintExecutor" classname="com.nokia.helium.antlint.ant.types.PylintExecutor"/>
+ <typedef name="checkstyleExecutor" classname="com.nokia.helium.antlint.ant.types.CheckstyleExecutor"/>
</antlib>
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/taskdefs/AntLintTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/taskdefs/AntLintTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -18,7 +18,9 @@
package com.nokia.helium.antlint.ant.taskdefs;
import java.io.File;
+import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Vector;
@@ -27,11 +29,14 @@
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
+import com.nokia.helium.ant.data.AntFile;
+import com.nokia.helium.ant.data.Database;
import com.nokia.helium.antlint.ant.AntlintException;
import com.nokia.helium.antlint.ant.Reporter;
import com.nokia.helium.antlint.ant.Severity;
import com.nokia.helium.antlint.ant.types.Check;
import com.nokia.helium.antlint.ant.types.ConsoleReporter;
+import com.nokia.helium.antlint.ant.types.Executor;
/**
* AntLint Task. This task checks for common coding conventions and errors in
@@ -42,30 +47,32 @@
* <ul>
* <li>CheckAntCall : checks whether antcall is used with no param elements and
* calls target with no dependencies</li>
- * <li>CheckDescription : checks for project description</li>
- * <li>CheckDuplicateNames : checks for duplicate macros</li>
- * <li>CheckFileName : checks the naming convention of ant xml files</li>
- * <li>CheckIndentation : checks indentation</li>
- * <li>CheckJepJythonScript : checks the coding convention in Jep and Jython
- * scripts</li>
- * <li>CheckPresetDefMacroDefName : checks the naming convention of presetdef
+ * <li>checkDescription : checks for project description</li>
+ * <li>checkDuplicateNames : checks for duplicate macros and task names</li>
+ * <li>checkFileName : checks the naming convention of ant xml files</li>
+ * <li>checkIndentation : checks indentation</li>
+ * <li>checkJythonScript : checks the coding convention Jython scripts</li>
+ * <li>checkPresetDefMacroDefName : checks the naming convention of presetdef
* and macrodef</li>
- * <li>CheckProjectName : checks the naming convention of project</li>
- * <li>CheckPropertyName : checks the naming convention of properties</li>
- * </li>
+ * <li>checkProjectName : checks the naming convention of project</li>
+ * <li>checkPropertyName : checks the naming convention of properties</li>
+ * <li>checkPropertyTypeAndValueMismatch : checks for property type and value
+ * mismatch</li>
* <li>CheckPythonTasks : checks the coding convention of python tasks</li>
- * <li>CheckRunTarget : checks whether runtarget calls a target that has
+ * <li>checkRunTarget : checks whether runtarget calls a target that has
* dependencies</li>
- * <li>CheckScriptCondition : checks the coding convention in script condition</li>
- * <li>CheckScriptDef : checks the coding convention in scriptdef</li>
- * <li>CheckScriptDefNameAttributes - checks the naming convention of scriptdef
- * name attributes</li></li>
- * <li>CheckScriptDefStyle : checks the coding style of scriptdef</li>
- * <li>CheckScriptSize : checks the size of scripts</li>
- * <li>CheckTabCharacter : checks for tab characters</li>
- * <li>CheckTargetName : checks the naming convention of targets</li>
- * <li>CheckUseOfEqualsTask : checks the usage of equals task</li>
- * <li>CheckUseOfIfInTargets : checks the usage of if task inside targets</li>
+ * <li>checkScriptCondition : checks the coding convention in script condition</li>
+ * <li>CheckScriptDef : checks the coding convention in scriptdef and attributes
+ * used any</li>
+ * <li>checkScriptSize : checks the size of scripts</li>
+ * <li>checkTabCharacter : checks for tab characters</li>
+ * <li>checkTargetName : checks the naming convention of targets</li>
+ * <li>checkTryCatchBlock : checks for empty or more than one catch element in a
+ * try-catch block</li>
+ * <li>checkUseOfEqualsTask : checks the usage of equals task</li>
+ * <li>checkUseOfIfInTargets : checks the usage of if task inside targets</li>
+ * <li>checkVariableTask : checks whether value attribute for ant-contrib
+ * variable task is set or not when unset is set to true</li>
* </ul>
* </pre>
*
@@ -79,7 +86,7 @@
* </p>
*
* <pre>
- * Usage:
+ * Usage: By default, a check will be enabled. To disable a check set enabled=false.
*
* <antlint>
* <fileset id="antlint.files" dir="${antlint.test.dir}/data">
@@ -87,9 +94,9 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckTabCharacter" severity="error" enabled="true"/>
- * <CheckTargetName" severity="warning&quot enabled="true" regexp="([a-z0-9[\\d\\-]]*)"/>
- * <CheckScriptDef" severity="error" enabled="true" outputDir="${antlint.test.dir}/output"/>
+ * <CheckTabCharacter" severity="error" />
+ * <CheckTargetName" severity="warning&quot regexp="([a-z0-9[\\d\\-]]*)"/>
+ * <CheckScriptDef" severity="error" enabled="false" outputDir="${antlint.test.dir}/output"/>
* </antlint>
* </pre>
*
@@ -104,12 +111,16 @@
private int errorCount;
private boolean failOnError = true;
private ConsoleReporter consoleReporter = new ConsoleReporter();
+ private List<Executor> executors = new Vector<Executor>();
+
+ public void add(Executor executor) {
+ executors.add(executor);
+ }
/**
* Add a set of files to copy.
*
- * @param set
- * a set of files to AntLintTask.
+ * @param set a set of files to AntLintTask.
* @ant.required
*/
public void addFileset(FileSet set) {
@@ -120,24 +131,40 @@
* Execute the antlint task.
*/
public final void execute() {
- if (checkerList.size() == 0) {
- throw new BuildException("No antlint checks are defined.");
+ if (checkerList.size() == 0 && executors.size() == 0) {
+ throw new BuildException("No antlint checks/executors are defined.");
}
+
try {
// Adding console reported by default if no
- // other reporter are mentioned.
+ // other reporters are mentioned.
if (reporters.size() == 0) {
reporters.add(consoleReporter);
}
setTask(this);
open();
- doAntLintCheck();
+ List<String> antFilePaths = new ArrayList<String>();
+ for (FileSet fs : antFileSetList) {
+ DirectoryScanner ds = fs.getDirectoryScanner(getProject());
+ String[] srcFiles = ds.getIncludedFiles();
+ String basedir = ds.getBasedir().getPath();
+ for (int i = 0; i < srcFiles.length; i++) {
+ String antFilename = basedir + File.separator + srcFiles[i];
+ antFilePaths.add(antFilename);
+ }
+ }
+ Database db = new Database(getProject(), "private");
+ db.addAntFilePaths(antFilePaths);
+ doAntLintCheck(db);
+ triggerExternalCommands(db);
} catch (AntlintException e) {
- throw new BuildException(
- "Exception occured while running AntLint task "
- + e.getMessage());
+ throw new BuildException("Exception occured while running AntLint task "
+ + e.getMessage());
+ } catch (IOException ex) {
+ throw new BuildException("Exception occured while creating Ant database"
+ + ex.getMessage());
} finally {
- // Closing all reporter session.
+ // Closing all reporter sessions.
close();
}
@@ -147,58 +174,47 @@
}
+ private void triggerExternalCommands(Database database) throws AntlintException {
+ for (Executor executor : executors) {
+ log("\n" + executor.getClass().getSimpleName() + " output:" + "\n");
+ executor.setDatabase(database);
+ executor.validateAttributes();
+ executor.run();
+ }
+ }
+
/**
* Triggers the antlint checking.
*
- * @throws AntlintException
- *
- * @throws Exception
- * if the checking fails.
+ * @throws AntlintException if the checking fails.
*/
- private void doAntLintCheck() throws AntlintException {
-
- for (FileSet fs : antFileSetList) {
- DirectoryScanner ds = fs.getDirectoryScanner(getProject());
- String[] srcFiles = ds.getIncludedFiles();
- String basedir = ds.getBasedir().getPath();
- for (int i = 0; i < srcFiles.length; i++) {
- String antFilename = basedir + File.separator + srcFiles[i];
- runChecks(new File(antFilename));
+ private void doAntLintCheck(Database database) throws AntlintException {
+ Collection<AntFile> antFiles = database.getAntFiles();
+ for (AntFile antFile : antFiles) {
+ for (Check check : checkerList) {
+ if (check.isEnabled()) {
+ check.validateAttributes();
+ check.setReporter(this);
+ check.setAntFile(antFile);
+ check.run();
+ }
}
}
}
/**
- * Runs antlint checks for the given ant file.
+ * Method to add Antlint checkers.
*
- * @param antFileName
- * is the name of the ant file to be checked.
- * @throws AntlintException
+ * @param check an antlint check to be added.
*/
- private void runChecks(File antFilename) throws AntlintException {
- for (Check check : checkerList) {
- if (check.isEnabled()) {
- check.validateAttributes();
- check.setReporter(this);
- check.run(antFilename);
- }
- }
-
+ public void add(Check check) {
+ checkerList.add(check);
}
/**
- * To add Antlint checkers.
+ * Method to add Antlint reporters.
*
- * @param c
- */
- public void add(Check c) {
- checkerList.add(c);
- }
-
- /**
- * To add reporters.
- *
- * @param reporter
+ * @param reporter a antlint reporter to be added.
*/
public void add(Reporter reporter) {
reporter.setTask(this);
@@ -206,8 +222,9 @@
}
/**
- * @param failOnError
- * the failOnError to set
+ * Boolean flag to set whether fail on error or not.
+ *
+ * @param failOnError the failOnError to set
*/
public void setFailOnError(boolean failOnError) {
this.failOnError = failOnError;
@@ -215,13 +232,11 @@
/*
* (non-Javadoc)
- *
* @see
* com.nokia.helium.antlint.ant.Reporter#report(com.nokia.helium.antlint
* .ant.Severity, java.lang.String, java.io.File, int)
*/
- public void report(Severity severity, String message, File filename,
- int lineNo) {
+ public void report(Severity severity, String message, File filename, int lineNo) {
if (severity.getValue().toUpperCase().equals("ERROR")) {
errorCount++;
}
@@ -233,7 +248,6 @@
/*
* (non-Javadoc)
- *
* @see
* com.nokia.helium.antlint.ant.Reporter#setTask(org.apache.tools.ant.Task)
*/
@@ -244,14 +258,20 @@
}
}
- @Override
+ /*
+ * (non-Javadoc)
+ * @see com.nokia.helium.antlint.ant.Reporter#close()
+ */
public void close() {
for (Reporter reporter : reporters) {
reporter.close();
}
}
- @Override
+ /*
+ * (non-Javadoc)
+ * @see com.nokia.helium.antlint.ant.Reporter#open()
+ */
public void open() {
for (Reporter reporter : reporters) {
reporter.open();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/AbstractAntFileStyleCheck.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import com.nokia.helium.antlint.ant.AntlintException;
+
+/**
+ * <code>AbstractAntFileStyleCheck</code> is an abstract check class used to
+ * parse an Ant file. The class uses an internal handler to receive
+ * notifications of XML parsing.
+ *
+ */
+public abstract class AbstractAntFileStyleCheck extends AbstractCheck {
+
+ private Locator locator;
+ private StringBuffer buffer = new StringBuffer();
+
+ /**
+ * {@inheritDoc}
+ */
+ public void run() throws AntlintException {
+ try {
+ SAXParserFactory saxFactory = SAXParserFactory.newInstance();
+ saxFactory.setNamespaceAware(true);
+ saxFactory.setValidating(true);
+ SAXParser parser = saxFactory.newSAXParser();
+ AntlintHandler handler = new AntlintHandler();
+ parser.parse(getAntFile().getFile(), handler);
+ } catch (ParserConfigurationException e) {
+ throw new AntlintException("Not able to parse XML file " + e.getMessage());
+ } catch (SAXException e) {
+ throw new AntlintException("Not able to parse XML file " + e.getMessage());
+ } catch (IOException e) {
+ throw new AntlintException("Not able to find XML file " + e.getMessage());
+ }
+ }
+
+ /**
+ * Set the locator.
+ *
+ * @param locator is the locator to set
+ */
+ private void setLocator(Locator locator) {
+ this.locator = locator;
+ }
+
+ /**
+ * Return the locator.
+ *
+ * @return the locator
+ */
+ public Locator getLocator() {
+ return locator;
+ }
+
+ protected void clearBuffer() {
+ buffer.delete(0, buffer.length());
+ }
+
+ /**
+ * Method to handle the element start notification.
+ *
+ * @param text is the text read at element start notification.
+ * @param lineNum is the current line number where the parser is reading.
+ */
+ protected abstract void handleStartElement(String text);
+
+ /**
+ * Method to handle the element end notification.
+ *
+ * @param text is the text read at element end notification.
+ * @param lineNum is the current line number where the parser is reading.
+ */
+ protected abstract void handleEndElement(String text);
+
+ /**
+ * Method to handle the document start notification.
+ */
+ protected abstract void handleStartDocument();
+
+ /**
+ * Method to handle the document end notification.
+ */
+ protected abstract void handleEndDocument();
+
+ /**
+ * A private class used to receive xml parsing notifications.
+ *
+ */
+ private class AntlintHandler extends DefaultHandler {
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setDocumentLocator(Locator locator) {
+ setLocator(locator);
+ }
+
+ public void startDocument() throws SAXException {
+ handleStartDocument();
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+ handleEndDocument();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void startElement(String uri, String name, String qName, Attributes atts) {
+ handleStartElement(buffer.toString());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void endElement(String uri, String name, String qName) {
+ handleEndElement(buffer.toString());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void characters(char[] ch, int start, int length) {
+ for (int i = start; i < start + length; i++) {
+ buffer.append(ch[i]);
+ }
+ }
+ }
+
+}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/AbstractCheck.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/AbstractCheck.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,13 +16,13 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
-import org.dom4j.Element;
-import org.dom4j.Node;
+import com.nokia.helium.ant.data.AntFile;
import com.nokia.helium.antlint.ant.Reporter;
import com.nokia.helium.antlint.ant.Severity;
@@ -35,10 +35,26 @@
private boolean enabled = true;
private Severity severity;
private Reporter reporter;
+ private AntFile antFile;
/**
- * @param enabled
- * the enabled to set
+ * Return the ant file.
+ *
+ * @return the ant file.
+ */
+ protected AntFile getAntFile() {
+ return antFile;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setAntFile(AntFile antFile) {
+ this.antFile = antFile;
+ }
+
+ /**
+ * {@inheritDoc}
*/
public void setEnabled(boolean enabled) {
this.enabled = enabled;
@@ -53,7 +69,6 @@
/*
* (non-Javadoc)
- *
* @see
* com.nokia.helium.antlint.ant.types.Check#setReporter(com.nokia.helium
* .antlint.ant.Reporter)
@@ -64,7 +79,6 @@
/*
* (non-Javadoc)
- *
* @see com.nokia.helium.antlint.ant.types.Check#getReporter()
*/
public Reporter getReporter() {
@@ -73,7 +87,6 @@
/*
* (non-Javadoc)
- *
* @see
* com.nokia.helium.antlint.ant.types.Check#setSeverity(com.nokia.helium
* .antlint.ant.Severity)
@@ -85,7 +98,6 @@
/*
* (non-Javadoc)
- *
* @see com.nokia.helium.antlint.ant.types.Check#getSeverity()
*/
public Severity getSeverity() {
@@ -93,43 +105,64 @@
}
/**
- * {@inheritDoc}
- */
- public void run(Element node) {
- // ignore
- }
-
- /**
- * Return the nodes matching search element.
+ * Method to validate checker attributes.
*
- * @param element
- * @param elementName
- * @param returnNodes
*/
- public void elementTreeWalk(Element element, String elementName,
- List<Element> returnNodes) {
- for (int i = 0, size = element.nodeCount(); i < size; i++) {
- Node node = element.node(i);
- if (node instanceof Element) {
- if (node.getName().equals(elementName)) {
- returnNodes.add((Element) node);
- }
- elementTreeWalk((Element) node, elementName, returnNodes);
- }
+ public void validateAttributes() {
+ if (severity == null) {
+ throw new BuildException("'severity' attribute should be specified for checker '"
+ + this.toString() + "'");
}
}
/**
- * To validate checker attributes.
+ * Sends the given message to the configured reporter.
*
- * @return
+ * @param message is the message to be sent.
*/
- public void validateAttributes() {
- if (severity == null) {
- throw new BuildException(
- "'severity' attribute should be specified for checker '"
- + this.toString() + "'");
- }
+ protected void report(String message) {
+ report(message, 0);
+ }
+
+ /**
+ * Sends the given message with exact line number to the configured
+ * reporter.
+ *
+ * @param message is the message to be sent.
+ * @param lineNum is the line number.
+ */
+ protected void report(String message, int lineNum) {
+ getReporter().report(getSeverity(), message, getAntFile().getFile(), lineNum);
}
+ /**
+ * Method validates the given input string against the input regex pattern.
+ *
+ * @param input is the string to be validated.
+ * @param regex is the regex pattern
+ * @return true, if matches; otherwise false.
+ */
+ protected boolean matches(String input, String regex) {
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(input);
+ return matcher.matches();
+ }
+
+ protected boolean matchFound(String input, String regex) {
+ boolean found = false;
+ Pattern p1 = Pattern.compile(regex);
+ Matcher m1 = p1.matcher(input);
+ while (m1.find()) {
+ found = true;
+ }
+ return found;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.apache.tools.ant.types.DataType#toString()
+ */
+ public String toString() {
+ return getClass().getSimpleName();
+ }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/AbstractProjectCheck.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import com.nokia.helium.ant.data.RootAntObjectMeta;
+import com.nokia.helium.antlint.ant.AntlintException;
+
+/**
+ * <code>AbstractProjectCheck</code> is an abstract check class used to run
+ * against a {@link ProjectMeta} or an {@link AntlibMeta}.
+ *
+ */
+public abstract class AbstractProjectCheck extends AbstractCheck {
+
+ /**
+ * {@inheritDoc}
+ */
+ public void run() throws AntlintException {
+ RootAntObjectMeta rootObjectMeta = getAntFile().getRootObjectMeta();
+ run(rootObjectMeta);
+
+ }
+
+ /**
+ * Method runs the check against the given {@link RootAntObjectMeta}.
+ *
+ * @param root is the {@link RootAntObjectMeta} against which the check is
+ * run.
+ */
+ protected abstract void run(RootAntObjectMeta root);
+
+}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/AbstractScriptCheck.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/AbstractScriptCheck.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,97 +16,113 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.apache.tools.ant.BuildException;
+import com.nokia.helium.ant.data.AntlibMeta;
+import com.nokia.helium.ant.data.MacroMeta;
+import com.nokia.helium.ant.data.ProjectMeta;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
+import com.nokia.helium.ant.data.TargetMeta;
/**
* <code>AbstractScriptCheck</code> is an abstract implementation of
* {@link Check} and contains some concrete methods related to script.
*
*/
-public abstract class AbstractScriptCheck extends AbstractCheck {
+public abstract class AbstractScriptCheck extends AbstractTargetCheck {
/**
- * Write a script with the given name and the text.
- *
- * @param name
- * is the name of the script
- * @param text
- * is the script text.
+ * {@inheritDoc}
*/
- protected void writeJythonFile(String name, String text, File outputDir) {
- if (outputDir == null) {
- throw new BuildException("'output' attribute for the checker '"
- + this.toString() + "' should be specified.");
- }
- if (text.contains("${")) {
- this.getReporter().report(this.getSeverity(),
- "${ found in " + name, this.getAntFile(), 0);
+ protected void run(RootAntObjectMeta root) {
+ super.run(root);
+ if (getMacroXPathExpression() != null) {
+ if (root instanceof ProjectMeta) {
+ ProjectMeta projectMeta = (ProjectMeta) root;
+ List<MacroMeta> macros = projectMeta
+ .getScriptDefinitions(getMacroXPathExpression());
+ for (MacroMeta macroMeta : macros) {
+ run(macroMeta);
+ }
+ }
+ if (root instanceof AntlibMeta) {
+ AntlibMeta antlibMeta = (AntlibMeta) root;
+ List<MacroMeta> macros = antlibMeta.getScriptDefinitions(getMacroXPathExpression());
+ for (MacroMeta macroMeta : macros) {
+ run(macroMeta);
+ }
+ }
}
- try {
- String heliumpath = outputDir.getCanonicalPath();
- new File(heliumpath + File.separator + "jep").mkdirs();
- File file = new File(heliumpath + File.separator + "jep"
- + File.separator + name + "_jep.py");
- PrintWriter output = new PrintWriter(new FileOutputStream(file));
- output.write("def abc():\n");
- output.write(" attributes = {} # pylint: disable-msg=C0103\n");
- output.write(" elements = {} # pylint: disable-msg=C0103\n");
- output.write(" project = None # pylint: disable-msg=C0103\n");
- output.write(" self = None # pylint: disable-msg=C0103\n");
- text = text.replace(" File(", " self.File(");
- for (String line : text.split("\n")) {
- output.write(" " + line + "\n");
- }
- output.close();
+ }
- if (text.contains("import ")) {
- File file2 = new File(heliumpath + File.separator
- + "test_jython.xml");
- PrintWriter output2 = new PrintWriter(new FileOutputStream(
- file2, true));
- output2.write("try:\n");
- for (String line : text.split("\n")) {
- if (line.trim().startsWith("import ")
- || line.trim().startsWith("from ")) {
- output2.write(" " + line + "\n");
- }
- }
-
- output2.write("except ImportError, e:\n");
- output2.write(" print '" + name + " failed: ' + str(e)\n");
- output2.close();
+ /**
+ * {@inheritDoc}
+ */
+ protected void run(TargetMeta targetMeta) {
+ String xpath = getScriptXPathExpression(targetMeta.getName());
+ if (xpath != null) {
+ List<MacroMeta> macros = targetMeta.getScriptDefinitions(xpath);
+ for (MacroMeta macroMeta : macros) {
+ run(macroMeta);
}
- } catch (IOException e) {
- throw new BuildException("Not able to write JEP File " + name
- + "_jep.py");
}
}
/**
- * Check for the properties in the given script text.
+ * Method returns the name of the macro or a constructed name for the given
+ * script using its parent name.
*
- * @param text
- * is the script text to lookup.
+ * @param macroMeta is an instance of Macrometa.
+ * @return name of the script
+ */
+ protected String getScriptName(MacroMeta macroMeta) {
+ String name = macroMeta.getName();
+ if (name.isEmpty()) {
+ name = "target_" + macroMeta.getParent().getName();
+ }
+ return name;
+ }
+
+ /**
+ * Method runs the check against the input {@link MacroMeta}.
+ *
+ * @param macroMeta is the {@link MacroMeta} against whom the check is run.
+ */
+ protected abstract void run(MacroMeta macroMeta);
+
+ /**
+ * Get the xpath expression of the macro.
+ *
+ * @return the xpath expression of the macro.
*/
- protected void checkJepPropertiesInText(String text) {
- Pattern p1 = Pattern
- .compile("getProperty\\([\"']([a-zA-Z0-9\\.]*)[\"']\\)");
- Matcher m1 = p1.matcher(text);
- ArrayList<String> props = new ArrayList<String>();
- while (m1.find()) {
- props.add(m1.group(1));
+ protected abstract String getMacroXPathExpression();
+
+ /**
+ * Get the xpath expression for the input target.
+ *
+ * @param targetName is the name of the target.
+ * @return the xpath expression for the input target.
+ */
+ protected abstract String getScriptXPathExpression(String targetName);
+
+ /**
+ * Method returns a list of property names used in the given script
+ * definition.
+ *
+ * @param macroMeta the macrometa instance to lookup.
+ * @return a list of used property names
+ */
+ protected List<String> getUsedProperties(MacroMeta macroMeta) {
+ Pattern pattern = Pattern.compile("attributes.get\\([\"']([^\"']*)[\"']\\)");
+ Matcher matcher = pattern.matcher(macroMeta.getText());
+ List<String> usedPropertyList = new ArrayList<String>();
+ while (matcher.find()) {
+ usedPropertyList.add(matcher.group(1));
}
- /*
- * for (String group : props) { checkPropertyInModel(group); }
- */
+ return usedPropertyList;
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/AbstractTargetCheck.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.util.List;
+
+import org.apache.tools.ant.Target;
+
+import com.nokia.helium.ant.data.ProjectMeta;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
+import com.nokia.helium.ant.data.TargetMeta;
+
+/**
+ * <code>AbstractTargetCheck</code> is an abstract check class used to run
+ * against target level.
+ *
+ */
+public abstract class AbstractTargetCheck extends AbstractProjectCheck {
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void run(RootAntObjectMeta root) {
+ if (root instanceof ProjectMeta) {
+ ProjectMeta projectMeta = (ProjectMeta) root;
+ List<TargetMeta> targets = projectMeta.getTargets();
+ for (TargetMeta targetMeta : targets) {
+ run(targetMeta);
+ }
+ }
+ }
+
+ /**
+ * Check the availability of dependent targets for the given target.
+ *
+ * @param targetName is the target for which dependent targets to be looked
+ * up.
+ * @return true, if the dependant targets are available; otherwise false
+ */
+ protected boolean checkTargetDependency(String targetName) {
+ Target targetDependency = (Target) getProject().getTargets().get(targetName);
+ return targetDependency != null && targetDependency.getDependencies().hasMoreElements();
+ }
+
+ /**
+ * Method to run the check against the input {@link TargetMeta}.
+ *
+ * @param targetMeta is the {@link TargetMeta} against whom the check is
+ * run.
+ */
+ protected abstract void run(TargetMeta targetMeta);
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/BeanshellScriptDump.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.helium.ant.data.MacroMeta;
+
+/**
+ * <code>BeanshellScriptDumper</code> is used to extract and dump beanshell
+ * scripts from the Ant files.
+ */
+public class BeanshellScriptDump extends ScriptDump {
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String getMacroXPathExpression() {
+ return "//scriptdef";
+ }
+
+ protected String getScriptXPathExpression(String targetName) {
+ return null;
+ }
+
+ protected void run(MacroMeta macroMeta) {
+ String language = macroMeta.getAttr("language");
+ if (language.equals("beanshell")) {
+ writeBeanshellFile(macroMeta.getName(), macroMeta.getText());
+ }
+ }
+
+ /**
+ * Write a bean shell file with the given text.
+ *
+ * @param scriptdefname is the name of the file to be written.
+ * @param text is the text to be written inside the file.
+ */
+ private void writeBeanshellFile(String scriptdefname, String text) {
+ PrintWriter output = null;
+ scriptdefname = "Beanshell" + scriptdefname;
+
+ try {
+ String outputPath = getOutputDir().getCanonicalPath();
+ new File(outputPath).mkdirs();
+ File file = new File(outputPath + File.separator + scriptdefname + ".java");
+ output = new PrintWriter(new FileOutputStream(file));
+
+ for (String line : text.split("\n")) {
+ if (line.trim().startsWith("import")) {
+ output.write(line + "\n");
+ }
+ }
+ output.write("/**\n * x\n */\npublic final class " + scriptdefname + " {\n");
+ output.write(" private " + scriptdefname + "() { }\n");
+ output.write(" public static void main(String[] args) {\n");
+ for (String line : text.split("\n")) {
+ if (!line.trim().startsWith("import")) {
+ output.write(" " + line + "\n");
+ }
+ }
+ output.write(" }\n");
+ output.write("}\n");
+ } catch (IOException e) {
+ throw new BuildException("Not able to write Beanshell File " + scriptdefname + ".java");
+ } finally {
+ if (output != null) {
+ output.close();
+ }
+ }
+ }
+}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/Check.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/Check.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,38 +16,24 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-
-import org.dom4j.Element;
-
+import com.nokia.helium.ant.data.AntFile;
import com.nokia.helium.antlint.ant.AntlintException;
import com.nokia.helium.antlint.ant.Reporter;
import com.nokia.helium.antlint.ant.Severity;
/**
- * <code>Check</code> represents a basic antlint component responsible for
- * running the user configured checks.
+ * <code>Check</code> represents a basic antlint validation component
+ * responsible for running the user configured checks.
*
*/
public interface Check {
/**
- * Method runs the configured checks against the given node.
+ * Method runs the configured check against a ant file.
*
- * @param node
- * is the node of the xml to be checked.
+ * @throws AntlintException if check fails
*/
- void run(Element node);
-
- /**
- * Method runs the configured checks against the given ant file.
- *
- * @param fileName
- * is the name of the ant file.
- * @param reporter
- * @throws AntlintException
- */
- void run(File fileName) throws AntlintException;
+ void run() throws AntlintException;
/**
* Return whether this is check is enabled or not.
@@ -97,17 +83,16 @@
Reporter getReporter();
/**
- * Return ant file.
- *
- * @return
- */
- File getAntFile();
-
- /**
* To return current checker name.
*
* @return
*/
String toString();
+ /**
+ * Set the ant file.
+ *
+ * @param antFile the ant file to set.
+ */
+ void setAntFile(AntFile antFile);
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckAntCall.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckAntCall.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,21 +16,14 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
-import org.apache.tools.ant.Target;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.TargetMeta;
+import com.nokia.helium.ant.data.TaskMeta;
/**
- * <code>CheckAntCall</code> is used to check whether antcall is used with no param elements and
- * calls the target with no dependencies
+ * <code>CheckAntCall</code> is used to check whether antcall is used with no
+ * param elements and calls the target with no dependencies
*
* <pre>
* Usage:
@@ -45,97 +38,25 @@
* </antlint>
* </pre>
*
- * @ant.task name="CheckAntCall" category="AntLint"
+ * @ant.task name="checkAntCall" category="AntLint"
*/
-public class CheckAntCall extends AbstractCheck {
-
- private File antFile;
+public class CheckAntCall extends AbstractTargetCheck {
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("target")) {
- checkAntCalls(node);
- }
- }
-
- /**
- * Check against the given node.
- *
- * @param node is the node to check.
- */
- @SuppressWarnings("unchecked")
- private void checkAntCalls(Element node) {
- if (node.elements("antcall") != null) {
- List<Element> antcallList = node.elements("antcall");
- for (Element antcallElement : antcallList) {
- String antcallName = antcallElement.attributeValue("target");
- if (((node.elements("param") == null) || (node.elements("param") != null && node.elements("param").isEmpty()))
- && !checkTargetDependency(antcallName)) {
- this.getReporter().report(this.getSeverity(), "<antcall> is used with no param elements and calls the target "
- + antcallName
- + " that has no dependencies! (<runtarget> could be used instead.)", this.getAntFile(), 0);
- }
+ public void run(TargetMeta targetMeta) {
+ List<TaskMeta> antCalls = targetMeta.getTasks("antcall");
+ int count = 0;
+ count++;
+ for (TaskMeta antCallMeta : antCalls) {
+ if (antCallMeta.getParams().isEmpty()
+ && !checkTargetDependency(antCallMeta.getAttr("target"))) {
+ report("<antcall> is used with no param " + "elements and calls the target '"
+ + antCallMeta.getAttr("target")
+ + "' that has no dependencies! (<runtarget> could be used instead.)",
+ antCallMeta.getLineNumber());
}
}
}
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- List<Element> targetNodes = new ArrayList<Element>();
-
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "target", targetNodes);
- }
- catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
-
- for (Element targetNode : targetNodes) {
- run(targetNode);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckAntCall";
- }
-
- /**
- * Check the availability dependent targets of the given target.
- *
- * @param targetName is the target for which dependent targets to be loked up.
- * @return true, if the dependant targets are available; otherwise false
- */
- private boolean checkTargetDependency(String targetName) {
- boolean dependencyCheck = false;
- Target targetDependency = (Target) getProject().getTargets().get(targetName);
- dependencyCheck = targetDependency != null
- && targetDependency.getDependencies().hasMoreElements();
- return dependencyCheck;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckDescription.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckDescription.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,14 +16,8 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.ProjectMeta;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
/**
* <code>CheckDescription</code> is used to check whether project description is
@@ -38,60 +32,20 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckDescription" severity="error" enabled="true"/>
+ * <checkDescription severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckDescription" category="AntLint"
+ * @ant.task name="checkDescription" category="AntLint"
*/
-public class CheckDescription extends AbstractCheck {
-
- private File antFile;
+public class CheckDescription extends AbstractProjectCheck {
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("project")
- && node.element("description") == null) {
- this.getReporter().report(this.getSeverity(),
- "Description not specified!", this.getAntFile(), 0);
+ protected void run(RootAntObjectMeta root) {
+ if (root instanceof ProjectMeta && ((ProjectMeta) root).getDescription().isEmpty()) {
+ report("Description not specified!", root.getLineNumber());
}
}
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- run(doc.getRootElement());
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckDescription";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckDuplicateNames.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckDuplicateNames.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,12 +16,19 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
import java.util.ArrayList;
import java.util.Hashtable;
+import java.util.List;
+
+import org.apache.tools.ant.taskdefs.MacroInstance;
+import org.apache.tools.ant.taskdefs.optional.script.ScriptDefBase;
+
+import com.nokia.helium.ant.data.MacroMeta;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
/**
- * <code>CheckDuplicateNames</code> is used to check for duplicate macro names.
+ * <code>CheckDuplicateNames</code> is used to check for duplicate macro and
+ * task names.
*
* <pre>
* Usage:
@@ -32,57 +39,53 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckDuplicateNames" severity="error" enabled="true"/>
+ * <checkDuplicateNames severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckDuplicateNames" category="AntLint"
+ * @ant.task name="checkDuplicateNames" category="AntLint"
*/
-public class CheckDuplicateNames extends AbstractCheck {
+public class CheckDuplicateNames extends AbstractProjectCheck {
- private File antFile;
+ private static final String HELIUM_URI = "http://www.nokia.com/helium";
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
+ private List<String> heliumTaskList;
+
+ /**
+ * {@inheritDoc}
*/
- @SuppressWarnings("unchecked")
- public void run(File antFilename) {
- this.antFile = antFilename;
- Hashtable<String, Class<Object>> taskdefs = getProject()
- .getTaskDefinitions();
- ArrayList<String> macros = new ArrayList<String>(taskdefs.keySet());
-
- for (String macroName : macros) {
- if (macros.contains(macroName + "Macro")
- || macros.contains(macroName + "macro")) {
- this.getReporter()
- .report(
- this.getSeverity(),
- macroName + " and " + macroName + "Macro"
- + " found duplicate name",
- this.getAntFile(), 0);
+ protected void run(RootAntObjectMeta root) {
+ if (heliumTaskList == null) {
+ setHeliumTaskList(root);
+ }
+ List<MacroMeta> macros = root.getMacros();
+ if (heliumTaskList != null ) {
+ for (MacroMeta macroMeta : macros) {
+ if (heliumTaskList.contains(macroMeta.getName())) {
+ report("Task '" + macroMeta.getName() + "' and macro '" + macroMeta.getName()
+ + "' has duplicate name.", macroMeta.getLineNumber());
+ }
}
}
}
- /*
- * (non-Javadoc)
+ /**
+ * Method sets a list of helium tasks.
*
- * @see org.apache.tools.ant.types.DataType#toString()
+ * @param root is the {@link RootAntObjectMeta} used to lookup for tasks.
*/
- public String toString() {
- return "CheckDuplicateNames";
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ private void setHeliumTaskList(RootAntObjectMeta root) {
+ heliumTaskList = new ArrayList<String>();
+ Hashtable<String, Class<Object>> taskdefs = root.getRuntimeProject().getTaskDefinitions();
+ List<String> list = new ArrayList<String>(taskdefs.keySet());
+ for (String taskName : list) {
+ Class clazz = taskdefs.get(taskName);
+ int index = taskName.lastIndexOf(":");
+ if (taskName.startsWith(HELIUM_URI)
+ && !(clazz.equals(MacroInstance.class) || clazz.equals(ScriptDefBase.class))) {
+ heliumTaskList.add(taskName.substring(index + 1));
+ }
+ }
}
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckFileName.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckFileName.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,10 +16,6 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
/**
* <code>CheckFileName</code> is used to check the naming convention of the ant
* files.
@@ -33,71 +29,42 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckFileName" severity="error" enabled="true" regexp="([a-z0-9[\\d\\-]]*)"/>
+ * <checkFileName severity="error" regexp="([a-z0-9[\\d\\-]]*)"/>
* </antlint>
* </pre>
*
- * @ant.task name="CheckFileName" category="AntLint"
+ * @ant.task name="checkFileName" category="AntLint"
*
*/
public class CheckFileName extends AbstractCheck {
private String regExp;
- private File antFile;
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
+ /**
+ * {@inheritDoc}
*/
- public void run(File antFilename) {
- if (antFilename != null) {
- this.antFile = antFilename;
- boolean found = false;
- Pattern p1 = Pattern.compile(getRegExp());
- Matcher m1 = p1.matcher(antFilename.getName());
- while (m1.find()) {
- found = true;
- }
- if (!found) {
- this.getReporter().report(this.getSeverity(),
- "INVALID File Name: " + antFilename.getName(),
- this.getAntFile(), 0);
- }
+ public void run() {
+ String fileName = getAntFile().getFile().getName();
+ if (!matchFound(fileName, getRegExp())) {
+ report("Invalid file Name: " + fileName);
}
}
/**
- * @param regExp
- * the regExp to set
+ * Method to set the regular expression.
+ *
+ * @param regExp the regExp to set
*/
public void setRegExp(String regExp) {
this.regExp = regExp;
}
/**
- * @return the regExp
+ * Method returns the regular expression.
+ *
+ * @return the regular expression
*/
public String getRegExp() {
return regExp;
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckFileName";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckIndentation.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckIndentation.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,18 +16,6 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.xml.sax.SAXException;
-
-import com.nokia.helium.antlint.AntLintHandler;
-import com.nokia.helium.antlint.ant.AntlintException;
-
/**
* <code>CheckIndentation</code> is used to check the indentations in the ant
* files.
@@ -41,58 +29,96 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckIndentation" severity="error" enabled="true" />
+ * <checkIndentation severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckIndentation" category="AntLint"
+ * @ant.task name="checkIndentation" category="AntLint"
*
*/
-public class CheckIndentation extends AbstractCheck {
- private File antFile;
+public class CheckIndentation extends AbstractAntFileStyleCheck {
+ private static final int INDENT_SPACES = 4;
+ private int indentLevel;
+ private int totalNoOfSpaces;
+ private boolean textElement;
+ private int currentLine;
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
+ /**
+ * {@inheritDoc}
+ */
+ public void handleStartDocument() {
+ indentLevel -= INDENT_SPACES;
+ }
+
+ @Override
+ protected void handleEndDocument() {
+ indentLevel = 0;
+ }
+
+ /**
+ * {@inheritDoc}
*/
- public void run(File antFilename) throws AntlintException {
- try {
- this.antFile = antFilename;
- SAXParserFactory saxFactory = SAXParserFactory.newInstance();
- saxFactory.setNamespaceAware(true);
- saxFactory.setValidating(true);
- SAXParser parser = saxFactory.newSAXParser();
- AntLintHandler handler = new AntLintHandler(this);
- handler.setIndentationCheck(true);
- parser.parse(antFilename, handler);
- } catch (ParserConfigurationException e) {
- throw new AntlintException("Not able to parse XML file "
- + e.getMessage());
- } catch (SAXException e) {
- throw new AntlintException("Not able to parse XML file "
- + e.getMessage());
- } catch (IOException e) {
- throw new AntlintException("Not able to find XML file "
- + e.getMessage());
+ public void handleStartElement(String text) {
+ countSpaces(text);
+
+ // When an element start tag is encountered,
+ // indentLevel is increased 4 spaces.
+ indentLevel += INDENT_SPACES;
+
+ checkIndent(text);
+ currentLine = getLocator().getLineNumber();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void handleEndElement(String text) {
+ countSpaces(text);
+ // Ignore end tags in the same line
+ if (currentLine != getLocator().getLineNumber()) {
+ checkIndent(text);
+ }
+ // When an element end tag is encountered,
+ // indentLevel is decreased 4 spaces.
+ indentLevel -= INDENT_SPACES;
+ textElement = false;
+ }
+
+ /**
+ * Check for indentation.
+ *
+ */
+ private void checkIndent(String text) {
+ if ((totalNoOfSpaces != indentLevel) && !textElement) {
+ report("Bad indentation : ", getLocator().getLineNumber());
}
}
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
+ /**
+ * Method counts the number of spaces.
*/
- public String toString() {
- return "CheckIndentation";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
+ public void countSpaces(String text) {
+ // Counts spaces and tabs in every newline.
+ int numSpaces = 0;
+ for (int i = 0; i < text.length(); i++) {
+ switch (text.charAt(i)) {
+ case '\t':
+ numSpaces += 4;
+ break;
+ case '\n':
+ numSpaces = 0;
+ break;
+ case ' ':
+ numSpaces++;
+ break;
+ default:
+ // An alphanumeric character encountered
+ // set the text element flag
+ textElement = true;
+ break;
+ }
+ }
+ totalNoOfSpaces = numSpaces;
+ clearBuffer();
}
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckJythonScript.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckJythonScript.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,20 +16,11 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.MacroMeta;
/**
- * <code>CheckJepJythonScript</code> is used to check the coding convention in
- * Jep and Jython scripts
+ * <code>CheckJythonScript</code> is used to check the coding convention of
+ * Jython scripts
*
* <pre>
* Usage:
@@ -40,110 +31,36 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckJepJythonScript" severity="error" enabled="true" />
+ * <checkJythonScript severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckJepJythonScript" category="AntLint"
+ * @ant.task name="checkJythonScript" category="AntLint"
*
*/
public class CheckJythonScript extends AbstractScriptCheck {
- private File outputDir;
- private File antFile;
-
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("target")) {
- checkScripts(node);
- }
-
- if (node.getName().equals("scriptdef")) {
- String scriptdefname = node.attributeValue("name");
- String language = node.attributeValue("language");
- if (language.equals("jython")) {
- writeJythonFile(scriptdefname, node.getText(), outputDir);
- }
- }
+ protected String getMacroXPathExpression() {
+ return "//scriptdef";
}
/**
- * Check against the given node.
- *
- * @param node
- * is the node to check.
+ * {@inheritDoc}
*/
- @SuppressWarnings("unchecked")
- private void checkScripts(Element node) {
- String target = node.attributeValue("name");
- List<Element> scriptList = node.selectNodes("//target[@name='" + target
- + "']/descendant::script");
- for (Element scriptElement : scriptList) {
- String language = scriptElement.attributeValue("language");
- if (language.equals("jython")) {
- writeJythonFile("target_" + target, scriptElement.getText(),
- outputDir);
- }
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
- List<Element> scriptNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "target", scriptNodes);
- elementTreeWalk(doc.getRootElement(), "scriptdef", scriptNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element targetNode : scriptNodes) {
- run(targetNode);
- }
-
+ protected String getScriptXPathExpression(String targetName) {
+ return ".//script";
}
/**
- * @param outputDir
- * the outputDir to set
+ * {@inheritDoc}
*/
- public void setOutputDir(File outputDir) {
- this.outputDir = outputDir;
- }
-
- /**
- * @return the outputDir
- */
- public File getOutputDir() {
- return outputDir;
+ protected void run(MacroMeta macroMeta) {
+ String language = macroMeta.getAttr("language");
+ if (language != null && language.equals("jython") && macroMeta.getText().contains("${")) {
+ report("${ found in " + getScriptName(macroMeta));
+ }
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckJepJythonScript";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckPresetDefMacroDefName.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckPresetDefMacroDefName.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,18 +16,10 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.AntObjectMeta;
+import com.nokia.helium.ant.data.MacroMeta;
/**
* <code>CheckPresetDefMacroDefName</code> is used to check the naming
@@ -42,108 +34,63 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckPresetDefMacroDefName" severity="error" enabled="true" />
+ * <checkPresetDefMacroDefName severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckPresetDefMacroDefName" category="AntLint"
+ * @ant.task name="checkPresetDefMacroDefName" category="AntLint"
*
*/
-public class CheckPresetDefMacroDefName extends AbstractCheck {
+public class CheckPresetDefMacroDefName extends AbstractScriptCheck {
private String regExp;
- private File antFile;
/**
* {@inheritDoc}
*/
- @SuppressWarnings("unchecked")
- public void run(Element node) {
- if (node.getName().equals("presetdef")
- || node.getName().equals("macrodef")) {
- String text = node.attributeValue("name");
- if (text != null && !text.isEmpty()) {
- checkDefName(text);
+ protected String getMacroXPathExpression() {
+ return "//macrodef | //presetdef";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String getScriptXPathExpression(String targetName) {
+ return ".//script";
+ }
- }
+ /**
+ * {@inheritDoc}
+ */
+ protected void run(MacroMeta macroMeta) {
+ validateName(macroMeta.getName(), macroMeta);
+ List<String> attributes = macroMeta.getAttributes();
+ for (String attrName : attributes) {
+ validateName(attrName, macroMeta);
+ }
+ }
- List<Element> attributeList = node.elements("attribute");
- for (Element attributeElement : attributeList) {
- String attributeName = attributeElement.attributeValue("name");
- checkDefName(attributeName);
- }
+ private void validateName(String name, AntObjectMeta object) {
+ if (name != null && !name.isEmpty() && !matches(name, getRegExp())) {
+ report("Invalid presetdef/macrodef name: " + name, object.getLineNumber());
}
}
/**
- * Check the given text.
- *
- * @param text
- * is the text to check.
- */
- private void checkDefName(String text) {
- Pattern p1 = Pattern.compile(getRegExp());
- Matcher m1 = p1.matcher(text);
- if (!m1.matches()) {
- this.getReporter().report(this.getSeverity(),
- "INVALID PRESETDEF/MACRODEF Name: " + text,
- this.getAntFile(), 0);
- }
- }
-
- /*
- * (non-Javadoc)
+ * Set the regular expression.
*
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- List<Element> presetDefNodes = new ArrayList<Element>();
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "presetdef", presetDefNodes);
- elementTreeWalk(doc.getRootElement(), "macrodef", presetDefNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element presetDefNode : presetDefNodes) {
- run(presetDefNode);
- }
- }
-
- /**
- * @param regExp
- * the regExp to set
+ * @param regExp the regExp to set
*/
public void setRegExp(String regExp) {
this.regExp = regExp;
}
/**
+ * Get the regular expression.
+ *
* @return the regExp
*/
public String getRegExp() {
return regExp;
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckPresetDefMacroDefName";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckProjectName.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckProjectName.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,16 +16,7 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
/**
* <code>CheckProjectName</code> is used to check the naming convention of
@@ -40,98 +31,44 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckProjectName" severity="error" enabled="true" regexp="([a-z0-9[\\d\\-]]*)" />
+ * <checkProjectName severity="error" regexp="([a-z0-9[\\d\\-]]*)" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckProjectName" category="AntLint"
+ * @ant.task name="checkProjectName" category="AntLint"
*
*/
-public class CheckProjectName extends AbstractCheck {
+public class CheckProjectName extends AbstractProjectCheck {
private String regExp;
- private File antFile;
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("project")) {
- String text = node.attributeValue("name");
- if (text != null && !text.isEmpty()) {
- checkProjectName(text);
- } else {
- this.getReporter().report(this.getSeverity(),
- "Project name not specified!", this.getAntFile(), 0);
- }
+ protected void run(RootAntObjectMeta root) {
+ if (root != null && !root.getName().isEmpty() && !matches(root.getName(), getRegExp())) {
+ report("Invalid project name: " + root.getName(), root.getLineNumber());
+ }
+ if (root != null && root.getName().isEmpty()) {
+ report("Project name not specified!", root.getLineNumber());
}
}
/**
- * Check the given the project name.
- *
- * @param text
- * is the text to check.
- */
- private void checkProjectName(String text) {
- Pattern p1 = Pattern.compile(getRegExp());
- Matcher m1 = p1.matcher(text);
- if (!m1.matches()) {
- this.getReporter().report(this.getSeverity(),
- "INVALID Project Name: " + text, this.getAntFile(), 0);
- }
- }
-
- /*
- * (non-Javadoc)
+ * Set the regular expresssion.
*
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- run(doc.getRootElement());
-
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
-
- }
-
- /**
- * @param regExp
- * the regExp to set
+ * @param regExp the regExp to set
*/
public void setRegExp(String regExp) {
this.regExp = regExp;
}
/**
+ * Get the regular expression.
+ *
* @return the regExp
*/
public String getRegExp() {
return regExp;
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckProjectName";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckPropertyName.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckPropertyName.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,18 +16,11 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.ProjectMeta;
+import com.nokia.helium.ant.data.PropertyMeta;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
/**
* <code>CheckPropertyName</code> is used to check the naming convention of
@@ -42,121 +35,48 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckPropertyName" severity="error" enabled="true" regexp="([a-z0-9[\\d\\-]]*)" />
+ * <checkPropertyName severity="error" regexp="([a-z0-9[\\d\\-]]*)" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckPropertyName" category="AntLint"
+ * @ant.task name="checkPropertyName" category="AntLint"
*
*/
-public class CheckPropertyName extends AbstractCheck {
+public class CheckPropertyName extends AbstractProjectCheck {
- private ArrayList<String> propertiesVisited = new ArrayList<String>();
private String regExp;
- private File antFile;
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("property")) {
- String text = node.attributeValue("name");
- if (text != null && !text.isEmpty()) {
- checkPropertyName(text);
+ protected void run(RootAntObjectMeta root) {
+ if (root instanceof ProjectMeta) {
+ ProjectMeta projectMeta = (ProjectMeta) root;
+ List<PropertyMeta> properties = projectMeta.getProperties();
+ for (PropertyMeta propertyMeta : properties) {
+ if (!matches(propertyMeta.getName(), getRegExp())) {
+ report("Invalid property name: " + propertyMeta.getName(),
+ propertyMeta.getLineNumber());
+ }
}
}
}
/**
- * Check the given property name.
- *
- * @param propertyName
- * is the property name to check.
- */
- private void checkPropertyName(String propertyName) {
- Pattern p1 = Pattern.compile(getRegExp());
- Matcher m1 = p1.matcher(propertyName);
- if (!m1.matches() && !isPropertyAlreadyVisited(propertyName)) {
- this.getReporter().report(this.getSeverity(),
- "INVALID Property Name: " + propertyName,
- this.getAntFile(), 0);
- markPropertyAsVisited(propertyName);
- }
- }
-
- /*
- * (non-Javadoc)
+ * Set the regular expression.
*
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
- List<Element> propertyNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "property", propertyNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element propertyNode : propertyNodes) {
- run(propertyNode);
- }
- }
-
- /**
- * Check whether the property is already visited or not.
- *
- * @param propertyName
- * is the property to be checked.
- * @return true, if already been visited; otherwise false
- */
- private boolean isPropertyAlreadyVisited(String propertyName) {
- return propertiesVisited.contains(propertyName);
- }
-
- /**
- * Mark the given property as visited.
- *
- * @param propertyName
- * is the property to be marked.
- */
- private void markPropertyAsVisited(String propertyName) {
- propertiesVisited.add(propertyName);
- }
-
- /**
- * @param regExp
- * the regExp to set
+ * @param regExp the regExp to set
*/
public void setRegExp(String regExp) {
this.regExp = regExp;
}
/**
+ * Get the regular expression.
+ *
* @return the regExp
*/
public String getRegExp() {
return regExp;
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckPropertyName";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckPropertyTypeAndValueMismatch.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,174 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import com.nokia.helium.ant.data.ProjectMeta;
+import com.nokia.helium.ant.data.PropertyCommentMeta;
+import com.nokia.helium.ant.data.PropertyMeta;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
+
+/**
+ * <code>CheckPropertyTypeAndValueMismatch</code> is used to check the property
+ * type and value mismatch.
+ *
+ * <pre>
+ * Usage:
+ *
+ * <antlint>
+ * <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ * <include name="*.ant.xml"/>
+ * <include name="*build.xml"/>
+ * <include name="*.antlib.xml"/>
+ * </fileset>
+ * <checkPropertyTypeAndValueMismatch severity="error" />
+ * </antlint>
+ * </pre>
+ *
+ * @ant.task name="checkPropertyTypeAndValueMismatch" category="AntLint"
+ *
+ */
+public class CheckPropertyTypeAndValueMismatch extends AbstractProjectCheck {
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void run(RootAntObjectMeta root) {
+ if (root instanceof ProjectMeta) {
+ ProjectMeta projectMeta = (ProjectMeta) root;
+ for (PropertyMeta propertyMeta : projectMeta.getProperties()) {
+ validateType(propertyMeta.getName(), propertyMeta.getType(),
+ propertyMeta.getLineNumber());
+ validateValue(propertyMeta);
+ }
+ for (PropertyCommentMeta propertyMeta : projectMeta.getPropertyCommentBlocks()) {
+ validateType(propertyMeta.getName(), propertyMeta.getType(),
+ propertyMeta.getLineNumber());
+ validateValue(propertyMeta);
+ }
+
+ }
+ }
+
+ /**
+ * Method validates the type of the given property.
+ *
+ * @param propetyName is the name of the property to be validated.
+ * @param propertyType is the type of property to be validated.
+ * @param lineNumber indicates the location of property.
+ */
+ private void validateType(String propetyName, String propertyType, int lineNumber) {
+ if (!(propertyType.equalsIgnoreCase(PropertyMeta.BOOLEAN_TYPE)
+ || propertyType.equalsIgnoreCase(PropertyMeta.FLOAT_TYPE)
+ || propertyType.equalsIgnoreCase(PropertyMeta.INTEGER_TYPE) || propertyType
+ .equalsIgnoreCase(PropertyMeta.STRING_TYPE))) {
+ report("Property '" + propetyName + "' has invalid type as '" + propertyType
+ + "'. (Valid types: boolean|float|integer|string)", lineNumber);
+ }
+ }
+
+ /**
+ * Method validates the given property.
+ *
+ * @param propertyMeta is the property to be validated.
+ */
+ private void validateValue(PropertyMeta propertyMeta) {
+ String type = propertyMeta.getType();
+ String value = propertyMeta.getRuntimeProject().getProperty(propertyMeta.getName());
+ if (PropertyMeta.BOOLEAN_TYPE.equalsIgnoreCase(type)) {
+ validateBooleanValue(propertyMeta.getName(), value, propertyMeta.getLineNumber());
+ }
+
+ if (PropertyMeta.INTEGER_TYPE.equalsIgnoreCase(type)) {
+ validateIntegerValue(propertyMeta.getName(), value, propertyMeta.getLineNumber());
+ }
+
+ if (PropertyMeta.FLOAT_TYPE.equalsIgnoreCase(type)) {
+ validateFloatValue(propertyMeta.getName(), value, propertyMeta.getLineNumber());
+ }
+ }
+
+ /**
+ * Method validates the given comment property.
+ *
+ * @param propertyMeta is the comment property to be validated.
+ */
+ private void validateValue(PropertyCommentMeta propertyMeta) {
+ String type = propertyMeta.getType();
+ String value = propertyMeta.getRuntimeProject().getProperty(propertyMeta.getName());
+ if (PropertyMeta.BOOLEAN_TYPE.equalsIgnoreCase(type)) {
+ validateBooleanValue(propertyMeta.getName(), value, propertyMeta.getLineNumber());
+ }
+
+ if (PropertyMeta.INTEGER_TYPE.equalsIgnoreCase(type)) {
+ validateIntegerValue(propertyMeta.getName(), value, propertyMeta.getLineNumber());
+ }
+
+ if (PropertyMeta.FLOAT_TYPE.equalsIgnoreCase(type)) {
+ validateFloatValue(propertyMeta.getName(), value, propertyMeta.getLineNumber());
+ }
+ }
+
+ /**
+ * Method validates the given boolean property.
+ *
+ * @param propertyName is the name of the property to be validated.
+ * @param value is the property value to be validated.
+ * @param lineNumber indicates the location of the property.
+ */
+ private void validateBooleanValue(String propertyName, String value, int lineNumber) {
+ if (value != null && !value.equalsIgnoreCase("true") && !value.equalsIgnoreCase("false")) {
+ report("Property '" + propertyName + "' has invalid boolean value set as '" + value
+ + "'. (Valid values: true|false)", lineNumber);
+ }
+ }
+
+ /**
+ * Method validates the given integer property.
+ *
+ * @param propertyName is the name of the property to be validated.
+ * @param value is the property value to be validated.
+ * @param lineNumber indicates the location of the property.
+ */
+ private void validateIntegerValue(String propertyName, String value, int lineNumber) {
+ try {
+ if (value != null) {
+ Integer.parseInt(value);
+ }
+ } catch (NumberFormatException nfe) {
+ report("Property '" + propertyName + "' has invalid integer value set as '" + value
+ + "'.", lineNumber);
+ }
+ }
+
+ /**
+ * Method validates the given float property.
+ *
+ * @param propertyName is the name of the property to be validated.
+ * @param value is the property value to be validated.
+ * @param lineNumber indicates the location of the property.
+ */
+ private void validateFloatValue(String propertyName, String value, int lineNumber) {
+ try {
+ if (value != null) {
+ Double.parseDouble(value);
+ }
+ } catch (NumberFormatException nfe) {
+ report("Property '" + propertyName + "' has invalid float value set as '" + value
+ + "'.", lineNumber);
+ }
+ }
+}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckPythonTasks.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-package com.nokia.helium.antlint.ant.types;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.tools.ant.BuildException;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
-
-/**
- * <code>CheckPythonTasks</code> is used to the check the coding convention of
- * python tasks.
- *
- * <pre>
- * Usage:
- *
- * <antlint>
- * <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- * <include name="*.ant.xml"/>
- * <include name="*build.xml"/>
- * <include name="*.antlib.xml"/>
- * </fileset>
- * <CheckPythonTasks" severity="error" enabled="true" outputDir="${antlint.test.dir}/output"/>
- * </antlint>
- * </pre>
- *
- * @ant.task name="CheckPythonTasks" category="AntLint"
- */
-public class CheckPythonTasks extends AbstractCheck {
-
- private File outputDir;
- private File antFile;
-
- /**
- * {@inheritDoc}
- */
- @SuppressWarnings("unchecked")
- public void run(Element node) {
- if (node.getName().equals("target")) {
- String target = node.attributeValue("name");
- List<Element> pythonList = node.selectNodes("//target[@name='"
- + target + "']/descendant::*[name()=\"hlm:python\"]");
- int i = 0;
- for (Element pythonElement : pythonList) {
- writePythonFile(i + "_" + target, pythonElement.getText());
- i++;
- }
- }
- }
-
- /**
- * Writes the given text to a python file.
- *
- * @param name
- * is the name of the file to be written.
- * @param text
- * is the text to be written inside the file.
- */
- private void writePythonFile(String name, String text) {
- if (getOutputDir() == null) {
- throw new BuildException("'output' attribute for the checker '"
- + this.toString() + "' should be specified.");
- }
- try {
- String heliumpath = getOutputDir().getCanonicalPath();
- new File(heliumpath + File.separator + "python").mkdirs();
- File file = new File(heliumpath + File.separator + "python"
- + File.separator + "target" + name + ".py");
- PrintWriter output = new PrintWriter(new FileOutputStream(file));
- if (!text.equals("")) {
- output.write("def abc():");
- for (String line : text.split("\n")) {
- output.write(" " + line + "\n");
- }
- }
- output.close();
- } catch (IOException e) {
- throw new BuildException(
- "IOException:Not able to write python file " + name + ".py");
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
- List<Element> targetNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "target", targetNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element targetNode : targetNodes) {
- run(targetNode);
- }
-
- }
-
- /**
- * @param outputDir
- * the outputDir to set
- */
- public void setOutputDir(File outputDir) {
- this.outputDir = outputDir;
- }
-
- /**
- * @return the outputDir
- */
- public File getOutputDir() {
- return outputDir;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckPythonTasks";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckRunTarget.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckRunTarget.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,17 +16,10 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
-import org.apache.tools.ant.Target;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.TargetMeta;
+import com.nokia.helium.ant.data.TaskMeta;
/**
* <code>CheckRunTarget</code> is used to check whether runtarget calls a target
@@ -41,105 +34,25 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckRunTarget" severity="error" enabled="true" />
+ * <checkRunTarget severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckRunTarget" category="AntLint"
+ * @ant.task name="checkRunTarget" category="AntLint"
*
*/
-public class CheckRunTarget extends AbstractCheck {
-
- private File antFile;
+public class CheckRunTarget extends AbstractTargetCheck {
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("target")) {
- checkRunTargets(node);
- }
- }
-
- /**
- * Check against the given node.
- *
- * @param node
- * is the node to check.
- */
- @SuppressWarnings("unchecked")
- private void checkRunTargets(Element node) {
- if (node.elements("runtarget") != null) {
- List<Element> runTargetList = node.elements("runtarget");
- for (Element runTargetElement : runTargetList) {
- String runTargetName = runTargetElement
- .attributeValue("target");
- if (checkTargetDependency(runTargetName)) {
- this.getReporter().report(
- this.getSeverity(),
- "<runtarget> calls the target " + runTargetName
- + " that has dependencies!",
- this.getAntFile(), 0);
- }
+ protected void run(TargetMeta targetMeta) {
+ List<TaskMeta> runTargets = targetMeta.getTasks("runtarget");
+ for (TaskMeta runTargetMeta : runTargets) {
+ if (checkTargetDependency(runTargetMeta.getAttr("target"))) {
+ report("<runtarget> calls the target " + runTargetMeta.getAttr("target")
+ + " that has dependencies!", runTargetMeta.getLineNumber());
}
}
}
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
- List<Element> targetNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "target", targetNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element targetNode : targetNodes) {
- run(targetNode);
- }
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckRunTarget";
- }
-
- /**
- * Check the availability dependent targets of the given target.
- *
- * @param targetName
- * is the target for which dependent targets to be loked up.
- * @return true, if the dependant targets are available; otherwise false
- */
- private boolean checkTargetDependency(String targetName) {
- boolean dependencyCheck = false;
- Target targetDependency = (Target) getProject().getTargets().get(
- targetName);
- dependencyCheck = targetDependency != null
- && targetDependency.getDependencies().hasMoreElements();
- return dependencyCheck;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptCondition.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptCondition.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,16 +16,7 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.MacroMeta;
/**
* <code>CheckScriptCondition</code> is used to check the coding convention in
@@ -40,100 +31,36 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckScriptCondition" severity="error" enabled="true" />
+ * <checkScriptCondition" severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckScriptCondition" category="AntLint"
+ * @ant.task name="checkScriptCondition" category="AntLint"
*
*/
public class CheckScriptCondition extends AbstractScriptCheck {
- private File outputDir;
- private File antFile;
-
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("target")) {
- checkScriptConditions(node);
- }
+ protected String getScriptXPathExpression(String targetName) {
+ return ".//scriptcondition";
}
/**
- * Check against the given node.
- *
- * @param node
- * is the node to check.
+ * {@inheritDoc}
*/
- @SuppressWarnings("unchecked")
- private void checkScriptConditions(Element node) {
- String target = node.attributeValue("name");
- List<Element> scriptList = node.selectNodes("//target[@name='" + target
- + "']/descendant::scriptcondition");
- for (Element scriptElement : scriptList) {
- String language = scriptElement.attributeValue("language");
- if (language.equals("jython")) {
- writeJythonFile("scriptcondition_" + target, scriptElement
- .getText(), outputDir);
- }
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
- List<Element> targetNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "target", targetNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element targetNode : targetNodes) {
- run(targetNode);
- }
-
+ protected String getMacroXPathExpression() {
+ return null;
}
/**
- * @param outputDir
- * the outputDir to set
- */
- public void setOutputDir(File outputDir) {
- this.outputDir = outputDir;
- }
-
- /**
- * @return the outputDir
+ * {@inheritDoc}
*/
- public File getOutputDir() {
- return outputDir;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckScriptCondition";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
+ protected void run(MacroMeta macroMeta) {
+ String language = macroMeta.getAttr("language");
+ if (language != null && language.equals("jython") && macroMeta.getText().contains("${")) {
+ report("${ found in " + getScriptName(macroMeta));
+ }
}
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptDef.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,208 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-package com.nokia.helium.antlint.ant.types;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.tools.ant.BuildException;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
-
-/**
- * <code>CheckScriptDef</code> is used to check the coding convention in
- * scriptdef.
- *
- * <pre>
- * Usage:
- *
- * <antlint>
- * <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- * <include name="*.ant.xml"/>
- * <include name="*build.xml"/>
- * <include name="*.antlib.xml"/>
- * </fileset>
- * <CheckScriptDef" severity="error" enabled="true" outputDir="${antlint.test.dir}/output"/>
- * </antlint>
- * </pre>
- *
- * @ant.task name="CheckScriptDef" category="AntLint"
- *
- */
-public class CheckScriptDef extends AbstractScriptCheck {
-
- private File outputDir;
- private File antFile;
-
- /**
- * {@inheritDoc}
- */
- public void run(Element node) {
- if (node.getName().equals("scriptdef")) {
- String scriptdefname = node.attributeValue("name");
- String language = node.attributeValue("language");
-
- checkScriptDef(scriptdefname, node);
-
- if (language.equals("beanshell")) {
- writeBeanshellFile(scriptdefname, node.getText());
- }
- }
- }
-
- /**
- * Check against the given node.
- *
- * @param node
- * is the node to check.
- */
- @SuppressWarnings("unchecked")
- public void checkScriptDef(String name, Node node) {
- List<Node> statements = node.selectNodes("//scriptdef[@name='" + name
- + "']/attribute");
- Pattern p1 = Pattern.compile("attributes.get\\([\"']([^\"']*)[\"']\\)");
- Matcher m1 = p1.matcher(node.getText());
- ArrayList<String> props = new ArrayList<String>();
- while (m1.find()) {
- props.add(m1.group(1));
- }
-
- if (!statements.isEmpty() && !props.isEmpty()) {
- for (Node statement : statements) {
- if (!props.contains(statement.valueOf("@name"))) {
- this.getReporter().report(
- this.getSeverity(),
- "Scriptdef " + name + " does not use "
- + statement.valueOf("@name"),
- this.getAntFile(), 0);
- }
- }
- }
- }
-
- /**
- * Write a bean shell file with the given text.
- *
- * @param scriptdefname
- * is the name of the file to be written.
- * @param text
- * is the text to be written inside the file.
- */
- private void writeBeanshellFile(String scriptdefname, String text) {
- if (getOutputDir() == null) {
- throw new BuildException("'output' attribute for the checker '"
- + this.toString() + "' should be specified.");
- }
- scriptdefname = "Beanshell" + scriptdefname;
- try {
- String heliumpath = getOutputDir().getCanonicalPath();
- new File(heliumpath + File.separator + "beanshell").mkdirs();
- File file = new File(heliumpath + File.separator + "beanshell"
- + File.separator + scriptdefname + ".java");
- PrintWriter output = new PrintWriter(new FileOutputStream(file));
-
- for (String line : text.split("\n")) {
- if (line.trim().startsWith("import")) {
- output.write(line + "\n");
- }
- }
-
- output.write("/**\n * x\n */\npublic final class " + scriptdefname
- + " {\n");
- output.write(" private " + scriptdefname + "() { }\n");
- output.write(" public static void main(String[] args) {\n");
- for (String line : text.split("\n")) {
- if (!line.trim().startsWith("import")) {
- output.write(" " + line + "\n");
- }
- }
- output.write(" }\n");
- output.write("}\n");
- output.close();
- } catch (IOException e) {
- throw new BuildException("Not able to write Beanshell File "
- + scriptdefname + ".java");
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
-
- List<Element> scriptDefNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "scriptdef", scriptDefNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element scriptDefNode : scriptDefNodes) {
- run(scriptDefNode);
- }
- }
-
- /**
- * @param outputDir
- * the outputDir to set
- */
- public void setOutputDir(File outputDir) {
- this.outputDir = outputDir;
- }
-
- /**
- * @return the outputDir
- */
- public File getOutputDir() {
- return outputDir;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckScriptDef";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptDefAttributes.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.util.List;
+
+import com.nokia.helium.ant.data.MacroMeta;
+
+/**
+ * <code>CheckScriptDefAttributes</code> is used to check for unused scriptdef attributes
+ *
+ * <pre>
+ * Usage:
+ *
+ * <antlint>
+ * <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ * <include name="*.ant.xml"/>
+ * <include name="*build.xml"/>
+ * <include name="*.antlib.xml"/>
+ * </fileset>
+ * <checkScriptDefAttributes severity="warning" />
+ * </antlint>
+ * </pre>
+ *
+ * @ant.task name="checkScriptDefAttributes" category="AntLint"
+ */
+public class CheckScriptDefAttributes extends AbstractScriptCheck {
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String getMacroXPathExpression() {
+ return "//scriptdef";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String getScriptXPathExpression(String targetName) {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void run(MacroMeta macroMeta) {
+ checkUnusedAttributes(macroMeta);
+ }
+
+ /**
+ * Method to check for unused attributes.
+ */
+ private void checkUnusedAttributes(MacroMeta macroMeta) {
+ List<String> usedPropertyList = getUsedProperties(macroMeta);
+ List<String> attributes = macroMeta.getAttributes();
+
+ if (!usedPropertyList.isEmpty()) {
+ for (String attrName : attributes) {
+ if (!usedPropertyList.contains(attrName)) {
+ report("Scriptdef " + macroMeta.getName() + " does not use " + attrName,
+ macroMeta.getLineNumber());
+ }
+ }
+
+ for (String attrName : usedPropertyList) {
+ if (!attributes.contains(attrName)) {
+ report("Scriptdef " + macroMeta.getName() + " does not have attribute "
+ + attrName, macroMeta.getLineNumber());
+ }
+ }
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptDefName.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.util.List;
+
+import com.nokia.helium.ant.data.AntObjectMeta;
+import com.nokia.helium.ant.data.MacroMeta;
+
+/**
+ *
+ */
+public class CheckScriptDefName extends AbstractScriptCheck {
+
+ private String regExp;
+
+ /**
+ * Set the regular expression.
+ *
+ * @param regExp the regExp to set
+ */
+ public void setRegExp(String regExp) {
+ this.regExp = regExp;
+ }
+
+ /**
+ * Get the regular expression.
+ *
+ * @return the regExp
+ */
+ public String getRegExp() {
+ return regExp;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String getMacroXPathExpression() {
+ return "//scriptdef";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String getScriptXPathExpression(String targetName) {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void run(MacroMeta macroMeta) {
+ validateName(macroMeta.getName(), macroMeta);
+ List<String> attributes = macroMeta.getAttributes();
+ for (String attrName : attributes) {
+ validateName(attrName, macroMeta);
+ }
+ }
+
+ private void validateName(String name, AntObjectMeta object) {
+ if (name != null && !name.isEmpty() && getRegExp() != null && !matches(name, getRegExp())) {
+ report("Invalid scriptdef name: " + name, object.getLineNumber());
+ }
+ }
+
+}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptDefNameAttributes.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,136 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-package com.nokia.helium.antlint.ant.types;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
-
-/**
- * <code>CheckScriptDefNameAttributes</code> is used to check the naming
- * convention of scriptdef name attributes
- *
- * <pre>
- * Usage:
- *
- * <antlint>
- * <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- * <include name="*.ant.xml"/>
- * <include name="*build.xml"/>
- * <include name="*.antlib.xml"/>
- * </fileset>
- * <CheckScriptDefNameAttributes" severity="error" enabled="true" />
- * </antlint>
- * </pre>
- *
- * @ant.task name="CheckScriptDefNameAttributes" category="AntLint"
- */
-public class CheckScriptDefNameAttributes extends AbstractCheck {
-
- private File antFile;
-
- /**
- * {@inheritDoc}
- */
- public void run(Element node) {
- if (node.getName().equals("scriptdef")) {
- String scriptdefname = node.attributeValue("name");
- checkScriptDefNameAttributes(scriptdefname, node);
- }
- }
-
- /**
- * Check against the given node.
- *
- * @param node
- * is the node to check.
- */
- @SuppressWarnings("unchecked")
- public void checkScriptDefNameAttributes(String name, Node node) {
- List<Node> statements = node.selectNodes("//scriptdef[@name='" + name
- + "']/attribute");
- Pattern p1 = Pattern.compile("attributes.get\\([\"']([^\"']*)[\"']\\)");
- Matcher m1 = p1.matcher(node.getText());
- ArrayList<String> props = new ArrayList<String>();
- while (m1.find()) {
- props.add(m1.group(1));
- }
-
- ArrayList<String> attributes = new ArrayList<String>();
- for (Node statement : statements) {
- attributes.add(statement.valueOf("@name"));
- }
- for (String attribute : props) {
- if (!attributes.contains(attribute)) {
- this.getReporter().report(this.getSeverity(),
- "Scriptdef " + name + " does not have attribute " + attribute,
- this.getAntFile(), 0);
- }
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
-
- List<Element> scriptDefNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "scriptdef", scriptDefNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element scriptDefNode : scriptDefNodes) {
- run(scriptDefNode);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckScriptDefNameAttributes";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptDefStyle.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptDefStyle.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,19 +16,9 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.MacroMeta;
/**
* <code>CheckScriptDefStyle</code> is used to check the coding style of
@@ -43,99 +33,41 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckScriptDefStyle" severity="error" enabled="true" />
+ * <checkScriptDefStyle severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckScriptDefStyle" category="AntLint"
+ * @ant.task name="checkScriptDefStyle" category="AntLint"
*
*/
-public class CheckScriptDefStyle extends AbstractCheck {
+public class CheckScriptDefStyle extends AbstractScriptCheck {
- private File antFile;
+ /**
+ * {@inheritDoc}
+ */
+ protected String getMacroXPathExpression() {
+ return "//scriptdef";
+ }
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("scriptdef")) {
- String scriptdefname = node.attributeValue("name");
- checkScriptDefStyle(scriptdefname, node);
- }
+ protected String getScriptXPathExpression(String targetName) {
+ return null;
}
/**
- * Check against the given node.
- *
- * @param node
- * is the node to check.
+ * {@inheritDoc}
*/
- @SuppressWarnings("unchecked")
- public void checkScriptDefStyle(String name, Node node) {
- List<Node> statements = node.selectNodes("//scriptdef[@name='" + name
- + "']/attribute");
- Pattern p1 = Pattern.compile("attributes.get\\([\"']([^\"']*)[\"']\\)");
- Matcher m1 = p1.matcher(node.getText());
- ArrayList<String> props = new ArrayList<String>();
- while (m1.find()) {
- props.add(m1.group(1));
- }
+ protected void run(MacroMeta macroMeta) {
+ List<String> usedPropertyList = getUsedProperties(macroMeta);
+ List<String> attributes = macroMeta.getAttributes();
- ArrayList<String> attributes = new ArrayList<String>();
- for (Node statement : statements) {
- attributes.add(statement.valueOf("@name"));
+ if (usedPropertyList.isEmpty() && !attributes.isEmpty()) {
+ report("Scriptdef " + macroMeta.getName()
+ + " doesn't reference attributes directly, poor style",
+ macroMeta.getLineNumber());
}
- if (!statements.isEmpty() && props.isEmpty()) {
- this
- .getReporter()
- .report(
- this.getSeverity(),
- "Scriptdef "
- + name
- + " doesn't reference attributes directly, poor style",
- this.getAntFile(), 0);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
-
- List<Element> scriptDefNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "scriptdef", scriptDefNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element scriptDefNode : scriptDefNodes) {
- run(scriptDefNode);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckScriptDefStyle";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
}
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptSize.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckScriptSize.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,17 +16,7 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.MacroMeta;
/**
* <code>CheckScriptSize</code> is used to check the size of script. By default,
@@ -41,91 +31,37 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckScriptSize" severity="error" enabled="true" />
+ * <checkScriptSize severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckScriptSize" category="AntLint"
+ * @ant.task name="checkScriptSize" category="AntLint"
*
*/
-public class CheckScriptSize extends AbstractCheck {
-
- private File antFile;
+public class CheckScriptSize extends AbstractScriptCheck {
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("target")) {
- checkSizeOfScript(node);
- }
+ protected String getMacroXPathExpression() {
+ return null;
}
/**
- * Check against the given node.
- *
- * @param node
- * is the node to check.
+ * {@inheritDoc}
*/
- @SuppressWarnings("unchecked")
- private void checkSizeOfScript(Element node) {
- String target = node.attributeValue("name");
-
- List<Node> statements = node.selectNodes("//target[@name='" + target
- + "']/script | //target[@name='" + target
- + "']/*[name()=\"hlm:python\"]");
-
- for (Node statement : statements) {
- int size = statement.getText().length();
- if (size > 1000) {
- this
- .getReporter()
- .report(
- this.getSeverity(),
- "Target "
- + target
- + " has a script with "
- + size
- + " characters, code should be inside a python file",
- this.getAntFile(), 0);
- }
- }
+ protected String getScriptXPathExpression(String targetName) {
+ return ".//script | " + "//target[@name='" + targetName + "']/*[name()=\"hlm:python\"]";
}
- public void run(File antFilename) throws AntlintException {
-
- List<Element> targetNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "target", targetNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element targetNode : targetNodes) {
- run(targetNode);
+ /**
+ * {@inheritDoc}
+ */
+ protected void run(MacroMeta macroMeta) {
+ int size = macroMeta.getText().length();
+ if (size > 1000) {
+ report("Target " + macroMeta.getParent().getName() + " has a script with " + size
+ + " characters, code should be inside a python file", macroMeta.getLineNumber());
}
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckScriptSize";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
}
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckTabCharacter.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckTabCharacter.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,19 +16,12 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.io.IOException;
import java.util.List;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.xml.sax.SAXException;
-
-import com.nokia.helium.antlint.AntLintHandler;
+import com.nokia.helium.ant.data.MacroMeta;
+import com.nokia.helium.ant.data.ProjectMeta;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
+import com.nokia.helium.ant.data.TargetMeta;
import com.nokia.helium.antlint.ant.AntlintException;
/**
@@ -44,92 +37,94 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckTabCharacter" severity="error" enabled="true" />
+ * <checkTabCharacter" severity="error" enabled="true" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckTabCharacter" category="AntLint"
+ * @ant.task name="checkTabCharacter" category="AntLint"
*
*/
-public class CheckTabCharacter extends AbstractCheck {
+public class CheckTabCharacter extends AbstractAntFileStyleCheck {
- private File antFile;
+ private static final String TAB_CHAR = "\t";
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- checkTabsInScript(node);
+ public void run() throws AntlintException {
+ super.run();
+ RootAntObjectMeta rootObjectMeta = getAntFile().getRootObjectMeta();
+ run(rootObjectMeta);
}
/**
- * Check against the given node.
+ * Method runs the check against the given {@link RootAntObjectMeta}.
*
- * @param node
- * is the node to check.
+ * @param root is the {@link RootAntObjectMeta} against which the check is
+ * run.
*/
- @SuppressWarnings("unchecked")
- private void checkTabsInScript(Element node) {
- if (node.getName().equals("target")) {
- String target = node.attributeValue("name");
-
- List<Node> statements = node.selectNodes("//target[@name='"
- + target + "']/script | //target[@name='" + target
- + "']/*[name()=\"hlm:python\"]");
-
- for (Node statement : statements) {
- if (statement.getText().contains("\t")) {
- this.getReporter().report(getSeverity(),
- "Target " + target + " has a script with tabs",
- getAntFile(), 0);
- }
+ private void run(RootAntObjectMeta root) {
+ if (root instanceof ProjectMeta) {
+ ProjectMeta projectMeta = (ProjectMeta) root;
+ List<TargetMeta> targets = projectMeta.getTargets();
+ for (TargetMeta targetMeta : targets) {
+ run(targetMeta);
}
}
}
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
+ /**
+ * {@inheritDoc}
+ */
+ protected void handleStartDocument() {
+ // Do nothing
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void handleEndDocument() {
+ // Do nothing
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void handleEndElement(String text) {
+ checkTabChars(text, getLocator().getLineNumber());
+ }
+
+ /**
+ * {@inheritDoc}
*/
- public void run(File antFilename) throws AntlintException {
- try {
- this.antFile = antFilename;
- SAXParserFactory saxFactory = SAXParserFactory.newInstance();
- saxFactory.setNamespaceAware(true);
- saxFactory.setValidating(true);
- SAXParser parser = saxFactory.newSAXParser();
- AntLintHandler handler = new AntLintHandler(this);
- handler.setTabCharacterCheck(true);
- parser.parse(antFilename, handler);
- } catch (ParserConfigurationException e) {
- throw new AntlintException("Not able to parse XML file "
- + e.getMessage());
- } catch (SAXException e) {
- throw new AntlintException("Not able to parse XML file "
- + e.getMessage());
- } catch (IOException e) {
- throw new AntlintException("Not able to find XML file "
- + e.getMessage());
+ protected void handleStartElement(String text) {
+ checkTabChars(text, getLocator().getLineNumber());
+ }
+
+ private void checkTabChars(String text, int lineNum) {
+ if (text.contains(TAB_CHAR)) {
+ report("Tabs should not be used!", lineNum);
+ }
+ clearBuffer();
+ }
+
+ /**
+ * Method to run the check against the input {@link TargetMeta}.
+ *
+ * @param targetMeta is the {@link TargetMeta} against whom the check is
+ * run.
+ */
+ private void run(TargetMeta targetMeta) {
+ List<MacroMeta> macros = targetMeta.getScriptDefinitions("//target[@name='"
+ + targetMeta.getName() + "']/descendant::script | //target[@name='"
+ + targetMeta.getName() + "']/descendant::*[name()=\"hlm:python\"]");
+ if (macros != null) {
+ for (MacroMeta macroMeta : macros) {
+ if (macroMeta.getText().contains(TAB_CHAR)) {
+ report("Target " + targetMeta.getName() + " has a script with tabs",
+ macroMeta.getLineNumber());
+ }
+ }
}
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckTabCharacter";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckTargetName.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckTargetName.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,18 +16,7 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.TargetMeta;
/**
* <code>CheckTargetName</code> is used to check the naming convention of the
@@ -42,73 +31,30 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckTargetName" severity="error" enabled="true" regexp="([a-z0-9[\\d\\-]]*)" />
+ * <checkTargetName" severity="error" regexp="([a-z0-9[\\d\\-]]*)" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckTargetName" category="AntLint"
+ * @ant.task name="checkTargetName" category="AntLint"
*
*/
-public class CheckTargetName extends AbstractCheck {
+public class CheckTargetName extends AbstractTargetCheck {
private String regExp;
- private File antFile;
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("target")) {
- String target = node.attributeValue("name");
+ protected void run(TargetMeta targetMeta) {
+ String target = targetMeta.getName();
+ if (target != null && !target.isEmpty()) {
if (!target.equals("tearDown") && !target.equals("setUp")
- && !target.equals("suiteTearDown")
- && !target.equals("suiteSetUp")) {
- checkTargetName(target);
- }
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
-
- List<Element> targetNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "target", targetNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element targetNode : targetNodes) {
- run(targetNode);
- }
-
- }
-
- /**
- * Check the given target name.
- *
- * @param targetName
- * is the target name to check.
- */
- private void checkTargetName(String targetName) {
- if (targetName != null && !targetName.isEmpty()) {
- Pattern p1 = Pattern.compile(getRegExp());
- Matcher m1 = p1.matcher(targetName);
- if (!m1.matches()) {
- this.getReporter().report(this.getSeverity(),
- "INVALID Target Name: " + targetName,
- this.getAntFile(), 0);
+ && !target.equals("suiteTearDown") && !target.equals("suiteSetUp")
+ && !matches(target, getRegExp())) {
+ report("INVALID Target Name: " + target, targetMeta.getLineNumber());
}
} else {
- log("Target name not specified!");
+ report("Target name not specified!", targetMeta.getLineNumber());
}
}
@@ -120,28 +66,9 @@
}
/**
- * @param regExp
- * the regExp to set
+ * @param regExp the regExp to set
*/
public void setRegExp(String regExp) {
this.regExp = regExp;
}
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckTargetName";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckTryCatchBlock.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckTryCatchBlock.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,19 +16,10 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.io.IOException;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
+import java.util.List;
-import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.TargetMeta;
+import com.nokia.helium.ant.data.TaskMeta;
/**
* <code>CheckTryCatchBlock</code> is used to check for empty and more than one
@@ -43,92 +34,28 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <checkTryCatchBlock" severity="error" enabled="true" />
+ * <checkTryCatchBlock" severity="error" />
* </antlint>
* </pre>
*
* @ant.task name="checkTryCatchBlock" category="AntLint"
*
*/
-public class CheckTryCatchBlock extends AbstractCheck {
-
- private File antFile;
-
- /**
- * {@inheritDoc}
- */
- public File getAntFile() {
- return antFile;
- }
+public class CheckTryCatchBlock extends AbstractTargetCheck {
/**
* {@inheritDoc}
*/
- public void run(File antFilename) throws AntlintException {
- try {
- this.antFile = antFilename;
- SAXParserFactory saxFactory = SAXParserFactory.newInstance();
- saxFactory.setNamespaceAware(true);
- saxFactory.setValidating(true);
- SAXParser parser = saxFactory.newSAXParser();
- TryCatchBlockHandler handler = new TryCatchBlockHandler();
- parser.parse(antFilename, handler);
- } catch (ParserConfigurationException e) {
- throw new AntlintException("Not able to parse XML file "
- + e.getMessage());
- } catch (SAXException e) {
- throw new AntlintException("Not able to parse XML file "
- + e.getMessage());
- } catch (IOException e) {
- throw new AntlintException("Not able to find XML file "
- + e.getMessage());
- }
- }
-
- public String toString() {
- return "CheckTryCatchBlock";
- }
-
- private class TryCatchBlockHandler extends DefaultHandler {
-
- private Locator locator;
- private int catchCounter;
+ protected void run(TargetMeta targetMeta) {
+ List<TaskMeta> trycatches = targetMeta.getTasks("trycatch");
+ List<TaskMeta> catches = targetMeta.getTasks("trycatch//catch");
- /**
- * {@inheritDoc}
- */
- public void setDocumentLocator(Locator locator) {
- this.locator = locator;
- }
-
- /**
- * {@inheritDoc}
- */
- public void startElement(String uri, String localName, String qName,
- Attributes attributes) throws SAXException {
- if (localName.equals("trycatch")) {
- catchCounter = 0;
- } else if (localName.equals("catch")) {
- catchCounter++;
- }
+ if (!trycatches.isEmpty() && catches.isEmpty()) {
+ report("<trycatch> block found without <catch> element", targetMeta.getLineNumber());
}
-
- /**
- * {@inheritDoc}
- */
- public void endElement(String uri, String localName, String qName)
- throws SAXException {
- if (localName.equals("trycatch") && catchCounter == 0) {
- getReporter().report(getSeverity(),
- "<trycatch> block found without <catch> element",
- getAntFile(), locator.getLineNumber());
- } else if (localName.equals("trycatch") && catchCounter > 1) {
- getReporter().report(
- getSeverity(),
- "<trycatch> block found with " + catchCounter
- + " <catch> elements.", getAntFile(),
- locator.getLineNumber());
- }
+ if (!trycatches.isEmpty() && catches.size() > 1) {
+ report("<trycatch> block found with " + catches.size() + " <catch> elements.",
+ targetMeta.getLineNumber());
}
}
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckUseOfEqualsTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckUseOfEqualsTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,16 +16,10 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
+import com.nokia.helium.ant.data.TaskMeta;
/**
* <code>CheckUseOfEqualsTask</code> is used to check the usage of equals task
@@ -40,72 +34,25 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckUseOfEqualsTask" severity="error" enabled="true" />
+ * <checkUseOfEqualsTask" severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckUseOfEqualsTask" category="AntLint"
+ * @ant.task name="checkUseOfEqualsTask" category="AntLint"
*/
-public class CheckUseOfEqualsTask extends AbstractCheck {
-
- private File antFile;
+public class CheckUseOfEqualsTask extends AbstractProjectCheck {
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("equals")) {
- String text = node.attributeValue("arg2");
+ protected void run(RootAntObjectMeta root) {
+ List<TaskMeta> conditions = root.getTaskDefinitions("//equals");
+ for (TaskMeta taskMeta : conditions) {
+ String text = taskMeta.getAttr("arg2");
if (text.equals("true") || text.equals("yes")) {
- this.getReporter().report(
- this.getSeverity(),
- node.attributeValue("arg1")
- + " uses 'equals' should use 'istrue' task",
- this.getAntFile(), 0);
+ report(taskMeta.getAttr("arg1") + " uses 'equals', should use 'istrue' task",
+ taskMeta.getLineNumber());
}
}
}
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
-
- List<Element> equalNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "equals", equalNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element equalNode : equalNodes) {
- run(equalNode);
- }
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckUseOfEqualsTask";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-
}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckUseOfIfInTargets.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckUseOfIfInTargets.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,17 +16,10 @@
*/
package com.nokia.helium.antlint.ant.types;
-import java.io.File;
-import java.util.ArrayList;
import java.util.List;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.ant.data.TargetMeta;
+import com.nokia.helium.ant.data.TaskMeta;
/**
* <code>CheckUseOfIfInTargets</code> is used to check the usage of if task as
@@ -42,122 +35,49 @@
* <include name="*build.xml"/>
* <include name="*.antlib.xml"/>
* </fileset>
- * <CheckUseOfIfInTargets" severity="error" enabled="true" />
+ * <checkUseOfIfInTargets" severity="error" />
* </antlint>
* </pre>
*
- * @ant.task name="CheckUseOfIfInTargets" category="AntLint"
+ * @ant.task name="checkUseOfIfInTargets" category="AntLint"
*
*/
-public class CheckUseOfIfInTargets extends AbstractCheck {
-
- private File antFile;
+public class CheckUseOfIfInTargets extends AbstractTargetCheck {
/**
* {@inheritDoc}
*/
- public void run(Element node) {
- if (node.getName().equals("target")) {
- checkUseOfIf(node);
- }
- }
-
- /**
- * Check against the given node.
- *
- * @param node
- * is the node to check.
- */
- @SuppressWarnings("unchecked")
- private void checkUseOfIf(Element node) {
- String target = node.attributeValue("name");
- String targetxpath = "//target[@name='" + target + "']//if";
+ protected void run(TargetMeta targetMeta) {
+ String target = targetMeta.getName();
+ List<TaskMeta> conditions = targetMeta.getTasks("if");
+ for (TaskMeta taskMeta : conditions) {
+ List<TaskMeta> ifThenPropertyConditions = taskMeta.getTasks("./then/property");
+ List<TaskMeta> ifElsePropertyConditions = taskMeta.getTasks("./else/property");
+ if (ifThenPropertyConditions.size() == 1 && ifElsePropertyConditions.size() == 1) {
+ report("Target " + target
+ + " poor use of if-else-property statement, use condition task",
+ taskMeta.getLineNumber());
+ }
+ List<TaskMeta> elseConditions = taskMeta.getTasks("./else");
- List<Node> statements2 = node.selectNodes(targetxpath);
- for (Node statement : statements2) {
- List<Node> conditiontest = statement.selectNodes("./then/property");
- if (conditiontest != null && conditiontest.size() == 1) {
- List<Node> conditiontest2 = statement
- .selectNodes("./else/property");
- if (conditiontest2 != null && conditiontest2.size() == 1) {
- this
- .getReporter()
- .report(
- this.getSeverity(),
- "Target "
- + target
- + " poor use of if-else-property statement, use condition task",
- this.getAntFile(), 0);
- } else if (statement.selectNodes("./else").size() == 0) {
- this
- .getReporter()
- .report(
- this.getSeverity(),
- "Target "
- + target
- + " poor use of if-then-property statement, use condition task",
- this.getAntFile(), 0);
- }
+ if (ifThenPropertyConditions.size() == 1 && elseConditions.size() == 0) {
+ report("Target " + target
+ + " poor use of if-then-property statement, use condition task",
+ taskMeta.getLineNumber());
}
}
- List<Node> statements = node.selectNodes("//target[@name='" + target
+
+ List<TaskMeta> conditions2 = targetMeta.getTaskDefinitions("//target[@name='" + target
+ "']/*");
- if (!(statements.size() > 1)) {
- if (node.selectSingleNode(targetxpath + "/else") == null) {
- if (node.selectSingleNode(targetxpath + "/isset") != null
- || node.selectSingleNode(targetxpath + "/not/isset") != null) {
- this
- .getReporter()
- .report(
- this.getSeverity(),
- "Target "
- + target
- + " poor use of if statement, use <target if|unless=\"prop\"",
- this.getAntFile(), 0);
- }
+ if (conditions2.size() == 1) {
+ List<TaskMeta> ifElseConditions = targetMeta.getTasks("./if/else");
+ List<TaskMeta> isSetConds = targetMeta.getTasks("./if/isset");
+ List<TaskMeta> notConds = targetMeta.getTaskDefinitions("./if/not/isset");
+ if (ifElseConditions.isEmpty() && (!isSetConds.isEmpty() || !notConds.isEmpty())) {
+ report("Target " + target
+ + " poor use of if statement, use <target if|unless=\"prop\"",
+ targetMeta.getLineNumber());
}
}
}
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#run(java.io.File)
- */
- public void run(File antFilename) throws AntlintException {
-
- List<Element> targetNodes = new ArrayList<Element>();
-
- this.antFile = antFilename;
- SAXReader saxReader = new SAXReader();
- Document doc;
- try {
- doc = saxReader.read(antFilename);
- elementTreeWalk(doc.getRootElement(), "target", targetNodes);
- } catch (DocumentException e) {
- throw new AntlintException("Invalid XML file " + e.getMessage());
- }
- for (Element targetNode : targetNodes) {
- run(targetNode);
- }
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.apache.tools.ant.types.DataType#toString()
- */
- public String toString() {
- return "CheckUseOfIfInTargets";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see com.nokia.helium.antlint.ant.types.Check#getAntFile()
- */
- public File getAntFile() {
- return this.antFile;
- }
-}
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckVariableTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.util.List;
+
+import com.nokia.helium.ant.data.RootAntObjectMeta;
+import com.nokia.helium.ant.data.TaskMeta;
+
+/**
+ * <code>CheckVariableTask</code> is used to check whether the value attribute
+ * of the ant-contrib variable task is set when attribute unset is set to true.
+ *
+ * <pre>
+ * Usage:
+ *
+ * <antlint>
+ * <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ * <include name="*.ant.xml"/>
+ * <include name="*build.xml"/>
+ * <include name="*.antlib.xml"/>
+ * </fileset>
+ * <checkVariableTask severity="error" />
+ * </antlint>
+ * </pre>
+ *
+ * @ant.task name="checkVariableTask" category="AntLint"
+ */
+public class CheckVariableTask extends AbstractProjectCheck {
+
+ /**
+ * {@inheritDoc}
+ */
+ protected void run(RootAntObjectMeta root) {
+ List<TaskMeta> tasks = root.getTaskDefinitions("//var");
+ String name, value, unset = null;
+ for (TaskMeta taskMeta : tasks) {
+ name = taskMeta.getAttr("name");
+ value = taskMeta.getAttr("value");
+ unset = taskMeta.getAttr("unset");
+ if (!value.trim().isEmpty() && unset.equals("true")) {
+ report("Variable '" + name + "' should not have 'value' attribute set "
+ + "when 'unset' is true.", taskMeta.getLineNumber());
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckstyleExecutor.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.io.File;
+
+import org.apache.tools.ant.types.FileSet;
+
+import com.puppycrawl.tools.checkstyle.CheckStyleTask;
+import com.puppycrawl.tools.checkstyle.CheckStyleTask.Formatter;
+
+/**
+ * <code>CheckstyleExecutor</code> extends {@link Executor} and is used to check
+ * the coding conventions of beanshell script.
+ */
+public class CheckstyleExecutor extends Executor {
+
+ private CheckStyleTask checkStyleTask;
+ private ScriptDump scriptDump;
+
+ /**
+ * Default constructor
+ */
+ public CheckstyleExecutor() {
+ scriptDump = new BeanshellScriptDump();
+ checkStyleTask = new CheckStyleTask();
+ }
+
+ /**
+ * Set the checkstyle configuration file.
+ *
+ * @param config is the checkstyle configuration file.
+ */
+ public void setConfig(File config) {
+ checkStyleTask.setConfig(config);
+ }
+
+ /**
+ * Add the checkstyle formatter.
+ *
+ * @param aFormatter the checkstyle formatter to add.
+ */
+ public void addFormatter(Formatter aFormatter) {
+ checkStyleTask.addFormatter(aFormatter);
+ }
+
+ protected ScriptDump getScriptDump() {
+ return scriptDump;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void execute() {
+
+ FileSet fileset = new FileSet();
+ fileset.setDir(getOutputDir());
+ fileset.setIncludes("**/*.java");
+
+ checkStyleTask.setTaskName(getClass().getSimpleName());
+ checkStyleTask.addFileset(fileset);
+ checkStyleTask.setProject(getProject());
+ checkStyleTask.execute();
+ }
+
+}
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckstyleXmlReporter.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/CheckstyleXmlReporter.java Mon Oct 18 10:23:52 2010 +0100
@@ -41,8 +41,8 @@
import com.nokia.helium.antlint.ant.Severity;
/**
- * This reporter will generate a Checkstyle compatible XML to
- * report Antlint issues.
+ * This reporter will generate a Checkstyle compatible XML to report Antlint
+ * issues.
*
* Usage:
*
@@ -59,7 +59,7 @@
* <antlintCheckstyleReporter file="report.xml" />
* </antlint>
* </pre>
- *
+ *
* @ant.type name="antlintCheckstyleReporter" category="AntLint"
*/
public class CheckstyleXmlReporter extends DataType implements Reporter {
@@ -74,8 +74,7 @@
* {@inheritDoc}
*/
@Override
- public void report(Severity severity, String message, File filename,
- int lineNo) {
+ public void report(Severity severity, String message, File filename, int lineNo) {
if (doc != null) {
if (currentFile == null || !currentFile.equals(filename)) {
currentFileNode = doc.createElement("file");
@@ -101,8 +100,7 @@
}
/**
- * Closing the reporting session. It will generates
- * the xml file.
+ * Closing the reporting session. It will generates the xml file.
*/
@Override
public void close() {
@@ -129,7 +127,7 @@
}
/**
- * {@inheritDoc}
+ * {@inheritDoc}
*/
@Override
public void open() {
--- a/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/ConsoleReporter.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/ConsoleReporter.java Mon Oct 18 10:23:52 2010 +0100
@@ -25,9 +25,8 @@
import com.nokia.helium.antlint.ant.Severity;
/**
- * This reporter will produce Antlint reporting using ant logging
- * system.
- *
+ * This reporter will produce Antlint reporting using ant logging system.
+ *
* Usage:
*
* <pre>
@@ -43,7 +42,7 @@
* <antlintCheckstyleReporter />
* </antlint>
* </pre>
- *
+ *
* @ant.type name="antlintConsoleReporter" category="AntLint"
*/
public class ConsoleReporter extends DataType implements Reporter {
@@ -53,29 +52,24 @@
/*
* (non-Javadoc)
- *
* @see
* com.nokia.helium.antlint.ant.Reporter#report(com.nokia.helium.antlint
* .ant.Severity, java.lang.String, java.io.File, int)
*/
@Override
- public void report(Severity severity, String message, File filename,
- int lineNo) {
+ public void report(Severity severity, String message, File filename, int lineNo) {
String errorMessage;
if (this.antFilename == null) {
this.antFilename = filename;
task.log("\nError(s)/Warning(s) for: " + this.antFilename);
- task
- .log("----------------------------------------------------------");
+ task.log("----------------------------------------------------------");
} else if (!this.antFilename.equals(filename)) {
this.antFilename = filename;
task.log("\nError(s)/Warning(s) for: " + this.antFilename);
- task
- .log("----------------------------------------------------------");
+ task.log("----------------------------------------------------------");
}
if (lineNo > 0) {
- errorMessage = severity.getValue().toUpperCase() + ": " + lineNo
- + ": " + message;
+ errorMessage = severity.getValue().toUpperCase() + ": " + lineNo + ": " + message;
} else {
errorMessage = severity.getValue().toUpperCase() + ": " + message;
@@ -86,7 +80,6 @@
/*
* (non-Javadoc)
- *
* @see
* com.nokia.helium.antlint.ant.Reporter#setTask(org.apache.tools.ant.Task)
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/Executor.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.io.File;
+import java.util.Collection;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.ant.data.AntFile;
+import com.nokia.helium.ant.data.Database;
+
+/**
+ * <code>Executor</code> is used to run any external tool or command from within
+ * the antlint task.
+ */
+public abstract class Executor extends DataType {
+
+ private File outputDir;
+ private Database database;
+
+ /**
+ * Set the Database.
+ * @param database is the Database to set.
+ */
+ public void setDatabase(Database database) {
+ this.database = database;
+ }
+
+ /**
+ * Set the output directory.
+ * @param outputDir is the output directory.
+ */
+ public void setOutputDir(File outputDir) {
+ this.outputDir = outputDir;
+ }
+
+ public File getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ * Method to run the configured external tool or command.
+ */
+ public void run() {
+ extractScripts();
+ execute();
+ }
+
+ /**
+ * Method to validate configured attributes.
+ *
+ */
+ public void validateAttributes() {
+ if (outputDir == null) {
+ throw new BuildException("'outputDir' attribute should be specified for '" + toString()
+ + "'");
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+ return getClass().getSimpleName();
+ }
+
+ private void extractScripts() {
+ Collection<AntFile> antFiles = database.getAntFiles();
+ for (AntFile antFile : antFiles) {
+ getScriptDump().setAntFile(antFile);
+ getScriptDump().setOutputDir(outputDir);
+ getScriptDump().dump();
+ }
+ }
+
+ /**
+ * Get the script dump.
+ *
+ * @return the script dump task.
+ */
+ protected abstract ScriptDump getScriptDump();
+
+ /**
+ * Method executes the configured tool or task.
+ */
+ protected abstract void execute();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/PylintExecutor.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.ExecTask;
+import org.apache.tools.ant.taskdefs.PathConvert;
+import org.apache.tools.ant.types.Commandline;
+import org.apache.tools.ant.types.Environment;
+import org.apache.tools.ant.types.FileSet;
+
+/**
+ * <code>PylintExecutor</code> extends {@link Executor} and is used to check the
+ * lint issues of jython/python scripts.
+ */
+public class PylintExecutor extends Executor {
+
+ private ScriptDump scriptDump;
+ private ExecTask execTask;
+
+ public PylintExecutor() {
+ execTask = new ExecTask();
+ scriptDump = new PythonScriptDump();
+ }
+
+ /**
+ * Add an environment variable to the launched process.
+ *
+ * @param var new environment variable.
+ */
+ public void addEnv(Environment.Variable var) {
+ execTask.addEnv(var);
+ }
+
+ /**
+ * Adds a command-line argument.
+ *
+ * @return new command line argument created.
+ */
+ public Commandline.Argument createArg() {
+ return execTask.createArg();
+ }
+
+ @Override
+ protected ScriptDump getScriptDump() {
+ return scriptDump;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void execute() {
+ FileSet fileset = new FileSet();
+ fileset.setDir(getOutputDir());
+ fileset.setIncludes("**/*.py");
+ fileset.setProject(getProject());
+
+ PathConvert pathConvert = new PathConvert();
+ pathConvert.add(fileset);
+ pathConvert.setPathSep(" ");
+ pathConvert.setProperty("python.modules");
+ pathConvert.setProject(getProject());
+ pathConvert.execute();
+
+ execTask.createArg().setLine(getProject().getProperty("python.modules"));
+ execTask.setExecutable("python");
+ execTask.setTaskName(getClass().getSimpleName());
+ execTask.setProject(getProject());
+ execTask.setResultProperty("pylint.result");
+ execTask.execute();
+
+ int result = getResult();
+ if ((result & 2) == 2) {
+ throw new BuildException("Error: Pylint contains errors.");
+ }
+ }
+
+ private int getResult() {
+ String resultString = getProject().getProperty("pylint.result");
+ int result = -1;
+ try {
+ result = Integer.parseInt(resultString);
+ } catch (NumberFormatException e) {
+ log(e.getMessage(), Project.MSG_WARN);
+ }
+ return result;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/PythonScriptDump.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.helium.ant.data.MacroMeta;
+import com.nokia.helium.ant.data.TargetMeta;
+
+/**
+ * <code>PythonScriptDumper</code> is used to extract and dump Python and Jython
+ * scripts from the Ant files.
+ */
+public class PythonScriptDump extends ScriptDump {
+
+ protected void run(TargetMeta targetMeta) {
+ String xpath = "//target[@name='" + targetMeta.getName()
+ + "']/descendant::*[name()=\"hlm:python\"]";
+ List<MacroMeta> macros = targetMeta.getScriptDefinitions(xpath);
+ int i = 0;
+ for (MacroMeta macroMeta : macros) {
+ writePythonFile(i + "_" + targetMeta.getName(), macroMeta.getText());
+ i++;
+ }
+ super.run(targetMeta);
+ }
+
+ protected void run(MacroMeta macroMeta) {
+ String language = macroMeta.getAttr("language");
+ if (language != null && language.equals("jython")) {
+ writeJythonFile(getScriptName(macroMeta), macroMeta.getText());
+ }
+ }
+
+ private String getScriptName(MacroMeta macroMeta) {
+ String name = macroMeta.getName();
+ if (name.isEmpty()) {
+ name = "target_" + macroMeta.getParent().getName();
+ }
+ return name;
+ }
+
+ protected String getMacroXPathExpression() {
+ return "//scriptdef";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected String getScriptXPathExpression(String targetName) {
+ return ".//script | .//scriptcondition";
+ }
+
+ /**
+ * Writes the given text to a python file.
+ *
+ * @param name is the name of the file to be written.
+ * @param text is the text to be written inside the file.
+ */
+ private void writePythonFile(String name, String text) {
+ PrintWriter output = null;
+ try {
+ String outputPath = getOutputDir().getCanonicalPath() + File.separator + "python";
+ new File(outputPath).mkdirs();
+ File file = new File(outputPath + File.separator + "target" + name + ".py");
+ output = new PrintWriter(new FileOutputStream(file));
+ if (!text.equals("")) {
+ output.write("def abc():");
+ for (String line : text.split("\n")) {
+ output.write(" " + line + "\n");
+ }
+ }
+ } catch (IOException e) {
+ throw new BuildException("IOException:Not able to write python file " + name + ".py");
+ } finally {
+ if (output != null) {
+ output.close();
+ }
+ }
+ }
+
+ /**
+ * Write a script with the given name and the text.
+ *
+ * @param name is the name of the script
+ * @param text is the script text.
+ */
+ private void writeJythonFile(String name, String text) {
+ PrintWriter output = null, output2 = null;
+ try {
+ String outputPath = getOutputDir().getCanonicalPath() + File.separator + "jep";
+ new File(outputPath).mkdirs();
+ File file = new File(outputPath + File.separator + name + "_jep.py");
+ output = new PrintWriter(new FileOutputStream(file));
+ output.write("def abc():\n");
+ output.write(" attributes = {} # pylint: disable=C0103\n");
+ output.write(" elements = {} # pylint: disable=C0103\n");
+ output.write(" project = None # pylint: disable=C0103\n");
+ output.write(" self = None # pylint: disable=C0103\n");
+ text = text.replace(" File(", " self.File(");
+
+ for (String line : text.split("\n")) {
+ output.write(" " + line + "\n");
+ }
+
+ if (text.contains("import ")) {
+ File file2 = new File(getOutputDir().getCanonicalPath() + File.separator
+ + "test_jython.xml");
+ output2 = new PrintWriter(new FileOutputStream(file2, true));
+ output2.write("try:\n");
+ for (String line : text.split("\n")) {
+ if (line.trim().startsWith("import ") || line.trim().startsWith("from ")) {
+ output2.write(" " + line + "\n");
+ }
+ }
+ output2.write("except ImportError, e:\n");
+ output2.write(" print '" + name + " failed: ' + str(e)\n");
+ }
+ } catch (IOException e) {
+ throw new BuildException("Not able to write JEP File " + name + "_jep.py");
+ } finally {
+ if (output != null) {
+ output.close();
+ }
+ if (output2 != null) {
+ output2.close();
+ }
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/src/com/nokia/helium/antlint/ant/types/ScriptDump.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.antlint.ant.types;
+
+import java.io.File;
+import java.util.List;
+
+import com.nokia.helium.ant.data.AntFile;
+import com.nokia.helium.ant.data.AntlibMeta;
+import com.nokia.helium.ant.data.MacroMeta;
+import com.nokia.helium.ant.data.ProjectMeta;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
+import com.nokia.helium.ant.data.TargetMeta;
+
+/**
+ * <code>ScriptDump</code> is an abstract implementation for extracting and
+ * dumping of various scripts from within an Ant file.
+ */
+public abstract class ScriptDump {
+
+ private File outputDir;
+ private AntFile antFile;
+
+ /**
+ * Return the ant file.
+ *
+ * @return the ant file.
+ */
+ protected AntFile getAntFile() {
+ return antFile;
+ }
+
+ /**
+ * Set the ant file.
+ *
+ * @param the ant file to set.
+ */
+ public void setAntFile(AntFile antFile) {
+ this.antFile = antFile;
+ }
+
+ /**
+ * Method extracts and dumps the requested scripts.
+ */
+ public void dump() {
+ RootAntObjectMeta root = getAntFile().getRootObjectMeta();
+ if (root instanceof ProjectMeta) {
+ ProjectMeta projectMeta = (ProjectMeta) root;
+ List<TargetMeta> targets = projectMeta.getTargets();
+ for (TargetMeta targetMeta : targets) {
+ run(targetMeta);
+ }
+ List<MacroMeta> macros = projectMeta.getScriptDefinitions(getMacroXPathExpression());
+ for (MacroMeta macroMeta : macros) {
+ run(macroMeta);
+ }
+ } else {
+ AntlibMeta antlibMeta = (AntlibMeta) root;
+ List<MacroMeta> macros = antlibMeta.getScriptDefinitions(getMacroXPathExpression());
+ for (MacroMeta macroMeta : macros) {
+ run(macroMeta);
+ }
+ }
+ }
+
+ protected void run(TargetMeta targetMeta) {
+ String xpath = getScriptXPathExpression(targetMeta.getName());
+ if (xpath != null) {
+ List<MacroMeta> macros = targetMeta.getScriptDefinitions(xpath);
+ for (MacroMeta macroMeta : macros) {
+ run(macroMeta);
+ }
+ }
+ }
+
+ public void setOutputDir(File outputDir) {
+ this.outputDir = outputDir;
+ }
+
+ public File getOutputDir() {
+ return outputDir;
+ }
+
+ /**
+ * Get the xpath expression of the macro.
+ *
+ * @return the xpath expression of the macro.
+ */
+ protected abstract String getMacroXPathExpression();
+
+ /**
+ * Get the xpath expression for the input target.
+ *
+ * @param targetName is the name of the target.
+ * @return the xpath expression for the input target.
+ */
+ protected abstract String getScriptXPathExpression(String targetName);
+
+ /**
+ * Method runs the check against the input {@link MacroMeta}.
+ *
+ * @param macroMeta is the {@link MacroMeta} against whom the check is run.
+ */
+ protected abstract void run(MacroMeta macroMeta);
+
+}
--- a/buildframework/helium/sf/java/antlint/tests/antunit/test_antlint.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/tests/antunit/test_antlint.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -20,7 +20,7 @@
============================================================================
-->
-<project name="test-antlint" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+<project name="test-antlint" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium" xmlns:cs="antlib:com.puppycrawl.tools.checkstyle">
<description>Helium Antlib AntLint unittests.</description>
<dirname property="antlint.test.dir" file="${ant.file.test-antlint}/.."/>
@@ -42,6 +42,102 @@
<delete dir="${antlint.test.dir}/data/output" failonerror="false" />
</target>
+ <target name="test-check-antcall">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.ant.xml"/>
+ </fileset>
+ <hlm:checkAntCall severity="warning"/>
+ </hlm:antlint>
+ <au:assertLogContains text="antcall> is used with no param elements and calls the target 'hello' that has no dependencies!" level="info"/>
+ </target>
+
+ <target name="test-check-description">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="build.xml"/>
+ </fileset>
+ <hlm:checkDescription severity="warning"/>
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: 23: Description not specified!" level="info"/>
+ </target>
+
+ <target name="test-check-duplicate-names">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="*.xml"/>
+ <include name="*.ant.xml"/>
+ <include name="build.xml"/>
+ <include name="*.antlib.xml"/>
+ </fileset>
+ <hlm:checkDuplicateNames severity="warning"/>
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: 101: Task 'antlint' and macro 'antlint' has duplicate name." level="info"/>
+ </target>
+
+ <target name="test-check-filename">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="invalid.build.xml"/>
+ </fileset>
+ <hlm:checkFileName severity="warning" regexp="^build.xml$|ant.xml$|antlib.xml$" />
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: Invalid file Name:" level="info"/>
+ </target>
+
+ <target name="test-check-script-size">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.ant.xml"/>
+ </fileset>
+ <hlm:checkScriptSize enabled="true" severity="warning"/>
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: 77: Target check-script-size has a script with 1188 characters, code should be inside a python file" level="info"/>
+ </target>
+
+ <target name="test-check-presetdef-macrodef-name">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.antlib.xml"/>
+ <include name="sample.ant.xml"/>
+ </fileset>
+ <hlm:checkPresetDefMacroDefName severity="warning" regexp="([a-z0-9][a-zA-Z0-9]*)"/>
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: 45: Invalid presetdef/macrodef name: check_PresetDef.Name" level="info"/>
+ <au:assertLogContains text="WARNING: 27: Invalid presetdef/macrodef name: foo_Macro" level="info"/>
+ </target>
+
+ <target name="test-check-runtarget">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.ant.xml"/>
+ </fileset>
+ <hlm:checkRunTarget enabled="true" severity="warning"/>
+ </hlm:antlint>
+ <au:assertLogContains text="runtarget> calls the target smile that has dependencies!" level="info"/>
+ </target>
+
+ <target name="test-check-scriptdef-style">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.antlib.xml"/>
+ </fileset>
+ <hlm:checkScriptDefStyle severity="warning" />
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: 65: Scriptdef check-scriptdef-style doesn't reference attributes directly, poor style" level="info"/>
+ </target>
+
+ <target name="test-check-script-condition">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.ant.xml"/>
+ <include name="sample.antlib.xml"/>
+ </fileset>
+ <hlm:checkScriptCondition severity="warning"/>
+ </hlm:antlint>
+ <au:assertLogContains text=" found in target_check-scriptcondition" level="info"/>
+ </target>
+
<target name="test-check-tab-character">
<hlm:antlint>
<fileset id="antlint.files" dir="${antlint.test.dir}/data">
@@ -50,7 +146,7 @@
<hlm:checkTabCharacter severity="warning" enabled="true"/>
</hlm:antlint>
<au:assertLogContains text="WARNING: 25: Tabs should not be used!" level="info"/>
- <au:assertLogContains text="WARNING: 29: Tabs should not be used!" level="info"/>
+ <au:assertLogContains text="WARNING: 31: Target test2 has a script with tabs" level="info"/>
</target>
<target name="test-check-property-name">
@@ -60,7 +156,7 @@
</fileset>
<hlm:checkPropertyName severity="warning" enabled="true" regexp="([a-z0-9[\\d\\_\\.\\@\\{\\}\\$]]*)" />
</hlm:antlint>
- <au:assertLogContains text="WARNING: INVALID Property Name: check-property-name" level="info"/>
+ <au:assertLogContains text="WARNING: 42: Invalid property name: check-property-name" level="info"/>
</target>
<target name="test-check-target-name">
@@ -70,9 +166,50 @@
</fileset>
<hlm:checkTargetName severity="warning" enabled="true" regexp="([a-z0-9[\\d\\-]]*)" />
</hlm:antlint>
- <au:assertLogContains text="WARNING: INVALID Target Name: Check_target.Name" level="info"/>
+ <au:assertLogContains text="WARNING: 64: INVALID Target Name: Check_target.Name" level="info"/>
</target>
+ <target name="test-check-use-of-equals-task">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.ant.xml"/>
+ </fileset>
+ <hlm:checkUseOfEqualsTask severity="warning" enabled="true"/>
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: 209: test.boolean1 uses 'equals', should use 'istrue' task" level="info"/>
+ <au:assertLogContains text="WARNING: 210: test.boolean2 uses 'equals', should use 'istrue' task" level="info"/>
+ </target>
+
+ <target name="test-check-use-of-if-in-targets">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.ant.xml"/>
+ </fileset>
+ <hlm:checkUseOfIfInTargets enabled="true" severity="warning"/>
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: 126: Target check-use-of-if-in-targets poor use of if statement, use" level="info"/>
+ <au:assertLogContains text="WARNING: 136: Target check-use-of-if-else-in-targets poor use of if-else-property statement, use condition task" level="info"/>
+ <au:assertLogContains text="WARNING: 151: Target check-use-of-if-then-in-targets poor use of if-then-property statement, use condition task" level="info"/>
+ <au:assertLogContains text="WARNING: 173: Target check-prop-in-scriptcondition poor use of if-else-property statement, use condition task" level="info"/>
+ <au:assertLogContains text="WARNING: 229: Target check-scriptcondition poor use of if-else-property statement, use condition task" level="info"/>
+ </target>
+
+ <target name="test-check-try-catch-block-with-empty-catch-block">
+ <hlm:antlint>
+ <fileset file="${antlint.test.dir}/data/sample.ant.xml"/>
+ <hlm:checkTryCatchBlock severity="warning" />
+ </hlm:antlint>
+ <au:assertLogContains text="trycatch> block found without " level="info"/>
+ </target>
+
+ <target name="test-check-try-catch-block-with-multiple-catch-block">
+ <hlm:antlint>
+ <fileset file="${antlint.test.dir}/data/sample.ant.xml"/>
+ <hlm:checkTryCatchBlock severity="warning" />
+ </hlm:antlint>
+ <au:assertLogContains text="trycatch> block found with 2 " level="info"/>
+ </target>
+
<target name="test-check-indentation">
<hlm:antlint>
<fileset id="antlint.files" dir="${antlint.test.dir}/data">
@@ -80,19 +217,7 @@
</fileset>
<hlm:checkIndentation severity="warning" enabled="true"/>
</hlm:antlint>
- <au:assertLogContains text="WARNING: 248: Bad indentation" level="info"/>
- </target>
-
- <target name="test-check-presetdef-macrodef-name">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.antlib.xml"/>
- <include name="sample.ant.xml"/>
- </fileset>
- <hlm:checkPresetDefMacroDefName enabled="true" severity="warning" regexp="([a-z0-9][a-zA-Z0-9]*)"/>
- </hlm:antlint>
- <au:assertLogContains text="WARNING: INVALID PRESETDEF/MACRODEF Name: check_PresetDef.Name" level="info"/>
- <au:assertLogContains text="WARNING: INVALID PRESETDEF/MACRODEF Name: foo_Macro" level="info"/>
+ <au:assertLogContains text="WARNING: 252: Bad indentation" level="info"/>
</target>
<target name="test-check-project-name">
@@ -103,164 +228,8 @@
</fileset>
<hlm:checkProjectName enabled="true" severity="warning" regexp="([a-z0-9[\\d\\.\\_\\-]]*)"/>
</hlm:antlint>
- <au:assertLogContains text="WARNING: INVALID Project Name: Sample" level="info"/>
- <au:assertLogContains text="WARNING: Project name not specified!" level="info"/>
- </target>
-
- <target name="test-check-description">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="build.xml"/>
- </fileset>
- <hlm:checkDescription enabled="true" severity="warning"/>
- </hlm:antlint>
- <au:assertLogContains text="WARNING: Description not specified!" level="info"/>
- </target>
-
- <target name="test-check-runtarget">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.ant.xml"/>
- </fileset>
- <hlm:checkRunTarget enabled="true" severity="warning"/>
- </hlm:antlint>
- <au:assertLogContains text="runtarget> calls the target smile that has dependencies!" level="info"/>
- </target>
-
- <target name="test-check-antcall">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.ant.xml"/>
- </fileset>
- <hlm:checkAntCall enabled="true" severity="warning"/>
- </hlm:antlint>
- <au:assertLogContains text="antcall> is used with no param elements and calls the target hello that has no dependencies!" level="info"/>
- </target>
-
- <target name="test-check-script-size">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.ant.xml"/>
- </fileset>
- <hlm:checkScriptSize enabled="true" severity="warning"/>
- </hlm:antlint>
- <au:assertLogContains text="WARNING: Target check-script-size has a script with 1098 characters, code should be inside a python file" level="info"/>
- </target>
-
- <target name="test-check-use-of-if-in-targets">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.ant.xml"/>
- </fileset>
- <hlm:checkUseOfIfInTargets enabled="true" severity="warning"/>
- </hlm:antlint>
- <au:assertLogContains text="WARNING: Target check-use-of-if-in-targets poor use of if statement, use " level="info"/>
- <au:assertLogContains text="WARNING: Target check-use-of-if-else-in-targets poor use of if-else-property statement, use condition task" level="info"/>
- <au:assertLogContains text="WARNING: Target check-use-of-if-then-in-targets poor use of if-then-property statement, use condition task" level="info"/>
- <au:assertLogContains text="WARNING: Target check-prop-in-scriptcondition poor use of if-else-property statement, use condition task" level="info"/>
- <au:assertLogContains text="WARNING: Target check-scriptcondition poor use of if-else-property statement, use condition task" level="info"/>
- </target>
-
- <target name="test-check-jython-script">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.ant.xml"/>
- <include name="sample.antlib.xml"/>
- </fileset>
- <hlm:checkJythonScript enabled="true" severity="warning" outputDir="${antlint.test.dir}/data/output"/>
- </hlm:antlint>
- <au:assertLogContains text="found in target_check-jython-script" level="info"/>
- <au:assertLogContains text="found in check-script" level="info"/>
- </target>
-
- <target name="test-check-use-of-equals-task">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.ant.xml"/>
- </fileset>
- <hlm:checkUseOfEqualsTask severity="warning" enabled="true"/>
- </hlm:antlint>
- <au:assertLogContains text="WARNING: test.boolean1 uses 'equals' should use 'istrue' task" level="info"/>
- <au:assertLogContains text="WARNING: test.boolean2 uses 'equals' should use 'istrue' task" level="info"/>
- </target>
-
- <target name="test-check-script-condition">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.ant.xml"/>
- <include name="sample.antlib.xml"/>
- </fileset>
- <hlm:checkScriptCondition enabled="true" severity="warning" outputDir="${antlint.test.dir}/data/output"/>
- </hlm:antlint>
- <au:assertLogContains text="found in scriptcondition_check-scriptcondition" level="info"/>
- </target>
-
- <target name="test-check-python-tasks">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="*.xml"/>
- <include name="*.ant.xml"/>
- <include name="build.xml"/>
- <include name="*.antlib.xml"/>
- </fileset>
- <hlm:checkPythonTasks severity="warning" enabled="true" outputDir="${antlint.test.dir}/data/output"/>
- </hlm:antlint>
- <au:assertFileExists file="${antlint.test.dir}/data/output/python/target0_check-prop-in-pythontask.py"/>
- <au:assertFileExists file="${antlint.test.dir}/data/output/python/target0_check-script-size.py"/>
- </target>
-
- <target name="test-check-scriptdef-name-attributes">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.antlib.xml"/>
- </fileset>
- <hlm:checkScriptDefNameAttributes severity="warning" enabled="true" />
- </hlm:antlint>
- <au:assertLogContains text="WARNING: Scriptdef check-scriptdef-attributes does not have attribute target" level="info"/>
- </target>
-
-
- <target name="test-check-scriptdef-style">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.antlib.xml"/>
- </fileset>
- <hlm:checkScriptDefStyle severity="warning" enabled="true" />
- </hlm:antlint>
- <au:assertLogContains text="WARNING: Scriptdef check-scriptdef-style doesn't reference attributes directly, poor style" level="info"/>
- </target>
-
- <target name="test-check-scriptdef">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="sample.antlib.xml"/>
- </fileset>
- <hlm:checkScriptDef severity="warning" enabled="true" outputDir="${antlint.test.dir}/data/output"/>
- </hlm:antlint>
- <au:assertLogContains text="WARNING: Scriptdef check-scriptdef does not use attr2" level="info"/>
- <au:assertLogContains text="WARNING: Scriptdef check-scriptdef-beanshell does not use attr2" level="info"/>
- </target>
-
- <target name="test-check-duplicate-names">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="*.xml"/>
- <include name="*.ant.xml"/>
- <include name="build.xml"/>
- <include name="*.antlib.xml"/>
- </fileset>
- <hlm:checkDuplicateNames enabled="true" severity="warning"/>
- </hlm:antlint>
- </target>
-
- <target name="test-check-filename">
- <hlm:antlint>
- <fileset id="antlint.files" dir="${antlint.test.dir}/data">
- <include name="invalid.build.xml"/>
- </fileset>
- <hlm:checkFileName severity="warning" enabled="true" regexp="^build.xml$|ant.xml$|antlib.xml$" />
- </hlm:antlint>
- <au:assertLogContains text="WARNING: INVALID File Name:" level="info"/>
+ <au:assertLogContains text="WARNING: 23: Invalid project name: Sample" level="info"/>
+ <au:assertLogContains text="WARNING: 23: Project name not specified!" level="info"/>
</target>
<target name="test-antlint-failonerror-false">
@@ -273,10 +242,10 @@
</fileset>
<hlm:checkTabCharacter severity="error" enabled="true"/>
<hlm:checkProjectName enabled="true" severity="error" regexp="([a-z0-9[\\d\\.\\_\\-]]*)"/>
- <hlm:checkScriptDefNameAttributes severity="error" enabled="true" />
+ <hlm:checkScriptDefAttributes severity="error" />
</hlm:antlint>
- <au:assertLogContains text="ERROR: Scriptdef check-scriptdef-attributes does not have attribute target" level="info"/>
- <au:assertLogContains text="ERROR: Project name not specified!" level="info"/>
+ <au:assertLogContains text="ERROR: 80: Scriptdef check-scriptdef-attributes does not have attribute target" level="info"/>
+ <au:assertLogContains text="ERROR: 23: Project name not specified!" level="info"/>
</target>
<target name="test-antlint-failonerror-true">
@@ -290,11 +259,11 @@
</fileset>
<hlm:checkTabCharacter severity="error" enabled="true"/>
<hlm:checkProjectName enabled="true" severity="error" regexp="([a-z0-9[\\d\\.\\_\\-]]*)"/>
- <hlm:checkScriptDefNameAttributes severity="error" enabled="true" />
+ <hlm:checkScriptDefAttributes severity="error" />
</hlm:antlint>
</au:expectfailure>
- <au:assertLogContains text="ERROR: Scriptdef check-scriptdef-attributes does not have attribute target" level="info"/>
- <au:assertLogContains text="ERROR: Project name not specified!" level="info"/>
+ <au:assertLogContains text="ERROR: 80: Scriptdef check-scriptdef-attributes does not have attribute target" level="info"/>
+ <au:assertLogContains text="ERROR: 23: Project name not specified!" level="info"/>
</target>
<target name="test-antlint-console-and-xml-reporting">
@@ -308,15 +277,15 @@
</fileset>
<hlm:checkTabCharacter severity="error" enabled="true"/>
<hlm:checkProjectName enabled="true" severity="error" regexp="([a-z0-9[\\d\\.\\_\\-]]*)"/>
- <hlm:checkScriptDefNameAttributes severity="error" enabled="true" />
-
+ <hlm:checkScriptDefAttributes severity="error" />
+
<!-- reporters -->
<hlm:antlintCheckstyleReporter file="${antlint.test.dir}/data/output/report.xml" />
<hlm:antlintConsoleReporter />
</hlm:antlint>
</au:expectfailure>
- <au:assertLogContains text="ERROR: Scriptdef check-scriptdef-attributes does not have attribute target" level="info"/>
- <au:assertLogContains text="ERROR: Project name not specified!" level="info"/>
+ <au:assertLogContains text="ERROR: 80: Scriptdef check-scriptdef-attributes does not have attribute target" level="info"/>
+ <au:assertLogContains text="ERROR: 23: Project name not specified!" level="info"/>
<au:assertFileExists file="${antlint.test.dir}/data/output/report.xml" />
<loadfile property="report.xml" srcfile="${antlint.test.dir}/data/output/report.xml" />
<echo>${report.xml}</echo>
@@ -328,24 +297,114 @@
</and>
</au:assertTrue>
</target>
-
- <target name="test-check-try-catch-block-with-empty-catch-block">
+
+ <target name="test-antcontrib-var-type-value-unset-set-case">
+ <au:expectfailure>
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.ant.xml"/>
+ </fileset>
+ <hlm:checkVariableTask severity="error" />
+ </hlm:antlint>
+ </au:expectfailure>
+ <au:assertLogContains text="ERROR: 30: Variable 'var1' should not have 'value' attribute set when 'unset' is true." level="info"/>
+ </target>
+
+ <target name="test-invalid-property-type-values">
<au:expectfailure>
<hlm:antlint>
- <fileset file="${antlint.test.dir}/data/sample.ant.xml"/>
- <hlm:checkTryCatchBlock severity="error" />
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.ant.xml"/>
+ </fileset>
+ <hlm:checkPropertyTypeAndValueMismatch severity="error" />
</hlm:antlint>
</au:expectfailure>
- <au:assertLogContains text="trycatch> block found without " level="info"/>
+ <au:assertLogContains text="ERROR: 324: Property 'test.prop.int.2' has invalid integer value set as '123abc'." level="info"/>
+ <au:assertLogContains text="ERROR: 342: Property 'test.prop.bool.3' has invalid boolean value set as 't'. (Valid values: true|false)" level="info"/>
+ <au:assertLogContains text="ERROR: 348: Property 'test.prop.bool.4' has invalid boolean value set as 'f'. (Valid values: true|false)" level="info"/>
+ <au:assertLogContains text="ERROR: 354: Property 'test.prop.bool.5' has invalid boolean value set as 'yes'. (Valid values: true|false)" level="info"/>
+ <au:assertLogContains text="ERROR: 360: Property 'test.prop.bool.6' has invalid boolean value set as 'no'. (Valid values: true|false)" level="info"/>
+ <au:assertLogContains text="ERROR: 366: Property 'test.prop.bool.7' has invalid boolean value set as 'poo'. (Valid values: true|false)" level="info"/>
+ <au:assertLogContains text="ERROR: 393: Property 'test.prop.number.1' has invalid type as 'number'. (Valid types: boolean|float|integer|string)" level="info"/>
+ <au:assertLogContains text="ERROR: 399: Property 'test.prop.flag' has invalid type as 'flag'. (Valid types: boolean|float|integer|string)" level="info"/>
+ <au:assertLogContains text="ERROR: 411: Property 'test.prop.float.2' has invalid float value set as '1.5a'." level="info"/>
+ <au:assertLogContains text="ERROR: 417: Property 'test.prop.int.3' has invalid integer value set as '1.8'." level="info"/>
+ </target>
+
+
+ <target name="test-check-scriptdef-name">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.antlib.xml"/>
+ </fileset>
+ <hlm:checkScriptDefName severity="warning" regexp="([a-z0-9][a-zA-Z0-9]*)"/>
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: 34: Invalid scriptdef name: check-prop-in-scriptdef" level="info"/>
+ <au:assertLogContains text="WARNING: 65: Invalid scriptdef name: check-scriptdef-style" level="info"/>
</target>
- <target name="test-check-try-catch-block-with-multiple-catch-block">
+ <target name="test-check-scriptdef-attributes">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.antlib.xml"/>
+ </fileset>
+ <hlm:checkScriptDefAttributes severity="warning"/>
+ </hlm:antlint>
+ <au:assertLogContains text="WARNING: 40: Scriptdef check-scriptdef does not use attr2" level="info"/>
+ <au:assertLogContains text="WARNING: 46: Scriptdef checkScriptdefBeanshell does not use attr2" level="info"/>
+ <au:assertLogContains text="WARNING: 80: Scriptdef check-scriptdef-attributes does not have attribute target" level="info"/>
+ <au:assertLogContains text="WARNING: 84: Scriptdef checkScriptdefAttributes does not have attribute attr0" level="info"/>
+ </target>
+
+ <target name="test-beanshell-script-dump-task">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.antlib.xml"/>
+ </fileset>
+ <hlm:checkstyleExecutor outputDir="${antlint.test.dir}/data/output/beanshell" config="${antlint.test.dir}/data/config/java_checkstyle_config.xml">
+ <formatter type="plain"/>
+ </hlm:checkstyleExecutor>
+ </hlm:antlint>
+ <au:assertLogContains text="BeanshellcheckScriptdefAttributes.java:1: warning: Using the '.*' form of import should be avoided - java.io.*." level="info"/>
+ <au:assertLogContains text="BeanshellcheckScriptdefBeanshell.java:1: warning: Using the '.*' form of import should be avoided - java.io.*." level="info"/>
+ </target>
+
+ <target name="test-check-jython-script">
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="sample.ant.xml"/>
+ <include name="sample.antlib.xml"/>
+ </fileset>
+ <hlm:checkJythonScript severity="warning"/>
+ </hlm:antlint>
+ <au:assertLogContains text="found in target_check-jython-script" level="info"/>
+ <au:assertLogContains text="found in check-script" level="info"/>
+ </target>
+
+ <target name="test-python-script-dump-task">
+ <pathconvert pathsep="${path.separator}" property="python.tools.path">
+ <fileset dir="./../../../../../nokia_builder" includes="tools/pylint/**/*.egg" />
+ <dirset dir="./../../../../../nokia_builder" includes="tools/pylint/**/*.egg" />
+ </pathconvert>
<au:expectfailure>
<hlm:antlint>
- <fileset file="${antlint.test.dir}/data/sample.ant.xml"/>
- <hlm:checkTryCatchBlock severity="error" />
+ <fileset id="antlint.files" dir="${antlint.test.dir}/data">
+ <include name="*.xml"/>
+ <include name="*.ant.xml"/>
+ <include name="build.xml"/>
+ <include name="*.antlib.xml"/>
+ </fileset>
+ <hlm:pylintExecutor outputDir="${antlint.test.dir}/data/output/python" >
+ <env key="PYTHONPATH" value="${python.tools.path}"/>
+ <arg file="${antlint.test.dir}/data/config/pylint-script.py"/>
+ <arg value="--output-format=parseable"/>
+ <arg line="--rcfile=${antlint.test.dir}/data/config/pylintrc.txt"/>
+ </hlm:pylintExecutor>
</hlm:antlint>
</au:expectfailure>
- <au:assertLogContains text="trycatch> block found with 2 " level="info"/>
+ <au:assertFileExists file="${antlint.test.dir}/data/output/python/python/target0_check-prop-in-pythontask.py"/>
+ <au:assertFileExists file="${antlint.test.dir}/data/output/python/python/target0_check-script-size.py"/>
+ <au:assertLogContains text="target0_check-prop-in-pythontask.py:3: [E0602, abc] Undefined variable 'abcd'" level="info"/>
</target>
+
</project>
--- a/buildframework/helium/sf/java/antlint/tests/build.bat Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/tests/build.bat Mon Oct 18 10:23:52 2010 +0100
@@ -21,7 +21,7 @@
set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
) ELSE set TESTED_JAVA=%JAVA_6_HOME%
if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
-call ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %*
+call ant %*
if "%ERRORLEVEL%" neq "0" (goto error)
endlocal
goto :eof
--- a/buildframework/helium/sf/java/antlint/tests/data/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/tests/data/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -25,5 +25,12 @@
<target name="test">
<echo> Test target </echo>
</target>
-
-</project>
+
+ <target name="test2">
+ <echo>Test target test2</echo>
+ <script language="jython">
+if ${build.drive} is None:
+ print "Not found"
+ </script>
+ </target>
+</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/tests/data/config/java_checkstyle_config.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : java_checkstyle_config.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!DOCTYPE module PUBLIC
+ "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
+ "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
+
+<!--
+
+ Checkstyle configuration using Eclipse Helium profile
+
+-->
+
+<module name="Checker">
+
+
+ <!-- Allow exception in the code, but comment is needed -->
+ <module name="SuppressionCommentFilter" />
+ <module name="SuppressionCommentFilter">
+ <property name="offCommentFormat" value="CheckStyle\:([\w\|]+) OFF"/>
+ <property name="onCommentFormat" value="CheckStyle\:([\w\|]+) ON"/>
+ <property name="checkFormat" value="$1"/>
+ </module>
+
+ <!-- Checks that a package.html file exists for each package. -->
+ <!-- See http://checkstyle.sf.net/config_javadoc.html#PackageHtml -->
+ <!-- module name="PackageHtml"/-->
+
+ <!-- Checks whether files end with a new line. -->
+ <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
+ <!--<module name="NewlineAtEndOfFile"/>-->
+
+ <!-- Checks that property files contain the same keys. -->
+ <!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
+ <module name="Translation"/>
+ <module name="FileLength"/>
+ <module name="FileTabCharacter"/>
+
+ <module name="TreeWalker">
+ <module name="FileContentsHolder"/>
+
+ <!-- Checks for Javadoc comments. -->
+ <!-- See http://checkstyle.sf.net/config_javadoc.html -->
+ <!--<module name="JavadocMethod"/>
+ <module name="JavadocVariable"/>
+ <module name="JavadocStyle"/>-->
+
+ <module name="JavadocType">
+ <property name="scope" value="public"/>
+ </module>
+
+ <!-- Checks for Naming Conventions. -->
+ <!-- See http://checkstyle.sf.net/config_naming.html -->
+ <module name="ConstantName"/>
+ <module name="LocalFinalVariableName"/>
+ <module name="LocalVariableName">
+ <property name="format" value="^[ij]$|^[a-z][a-zA-Z0-9]+$"/>
+ <property name="tokens" value="VARIABLE_DEF"/>
+ </module>
+ <module name="MemberName"/>
+ <module name="MethodName"/>
+ <module name="PackageName"/>
+ <module name="ParameterName"/>
+ <module name="StaticVariableName"/>
+ <module name="TypeName"/>
+
+
+ <!-- Checks for Headers -->
+ <!-- See http://checkstyle.sf.net/config_header.html -->
+ <!-- <module name="Header"> -->
+ <!-- The follow property value demonstrates the ability -->
+ <!-- to have access to ANT properties. In this case it uses -->
+ <!-- the ${basedir} property to allow Checkstyle to be run -->
+ <!-- from any directory within a project. See property -->
+ <!-- expansion, -->
+ <!-- http://checkstyle.sf.net/config.html#properties -->
+ <!-- <property -->
+ <!-- name="headerFile" -->
+ <!-- value="${basedir}/java.header"/> -->
+ <!-- </module> -->
+
+ <!-- Following interprets the header file as regular expressions. -->
+ <!-- <module name="RegexpHeader"/> -->
+
+
+ <!-- Checks for imports -->
+ <!-- See http://checkstyle.sf.net/config_import.html -->
+ <module name="AvoidStarImport">
+ <property name="severity" value="warning"/>
+ </module>
+ <module name="IllegalImport"/> <!-- defaults to sun.* packages -->
+ <module name="RedundantImport"/>
+ <module name="UnusedImports"/>
+
+
+ <!-- Checks for Size Violations. -->
+ <!-- See http://checkstyle.sf.net/config_sizes.html -->
+ <module name="LineLength">
+ <property name="max" value="180"/>
+ <property name="ignorePattern" value="^ *\* *[^ ]+$"/>
+ <property name="severity" value="warning"/>
+ </module>
+ <module name="MethodLength"/>
+ <module name="ParameterNumber"/>
+
+
+ <!-- Checks for whitespace -->
+ <!-- See http://checkstyle.sf.net/config_whitespace.html -->
+ <!--<module name="EmptyForIteratorPad"/>
+ <module name="MethodParamPad"/>
+ <module name="NoWhitespaceAfter"/>
+ <module name="NoWhitespaceBefore"/>
+ <module name="OperatorWrap"/>
+ <module name="TypecastParenPad"/>
+ <module name="WhitespaceAfter"/>
+ <module name="ParenPad">
+ <property name="severity" value="warning"/>
+ </module>
+ -->
+ <module name="WhitespaceAround"/>
+ <module name="GenericWhitespace"/>
+
+ <!-- Modifier Checks -->
+ <!-- See http://checkstyle.sf.net/config_modifiers.html -->
+ <module name="ModifierOrder"/>
+ <module name="RedundantModifier"/>
+
+
+ <!-- Checks for blocks. You know, those {}'s -->
+ <!-- See http://checkstyle.sf.net/config_blocks.html -->
+ <module name="AvoidNestedBlocks"/>
+ <module name="EmptyBlock"/>
+ <!--<module name="LeftCurly">-->
+ <module name="NeedBraces" />
+ <!--<module name="RightCurly">-->
+
+
+ <!-- Checks for common coding problems -->
+ <!-- See http://checkstyle.sf.net/config_coding.html -->
+ <module name="DoubleCheckedLocking"/> <!-- MY FAVOURITE -->
+ <module name="EmptyStatement"/>
+ <module name="EqualsHashCode"/>
+ <!--<module name="HiddenField"/>-->
+ <module name="IllegalInstantiation"/>
+ <module name="InnerAssignment"/>
+ <!--<module name="MagicNumber"/>-->
+ <module name="MissingSwitchDefault"/>
+ <module name="RedundantThrows"/>
+ <module name="SimplifyBooleanExpression"/>
+ <module name="SimplifyBooleanReturn"/>
+
+ <!-- Checks for class design -->
+ <!-- See http://checkstyle.sf.net/config_design.html -->
+ <!--<module name="DesignForExtension"/>-->
+ <module name="FinalClass"/>
+ <module name="HideUtilityClassConstructor"/>
+ <module name="InterfaceIsType"/>
+ <module name="VisibilityModifier"/>
+
+
+ <!-- Miscellaneous other checks. -->
+ <!-- See http://checkstyle.sf.net/config_misc.html -->
+ <module name="ArrayTypeStyle"/>
+ <!--<module name="FinalParameters"/>
+ <module name="GenericIllegalRegexp">
+ <property name="format" value="\s+$"/>
+ <property name="message" value="Line has trailing spaces."/>
+ </module>-->
+ <module name="TodoComment"/>
+ <module name="UpperEll"/>
+
+ <module name="ExplicitInitialization"/>
+ <module name="UnnecessaryParentheses"/>
+ <module name="DeclarationOrder"/>
+
+ <module name="StringLiteralEquality"/>
+
+ <module name="CyclomaticComplexity">
+ <property name="max" value="26"/>
+ </module>
+
+ <module name="SuperFinalize"/>
+
+ <module name="IllegalCatch"/>
+
+ <module name="MethodParamPad"/>
+ <module name="Indentation"/>
+ </module>
+
+</module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/tests/data/config/pylint-script.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,22 @@
+#============================================================================
+#Name : pylint-script.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+#!/usr/bin/env python
+import sys
+from pylint import lint
+lint.Run(sys.argv[1:])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/tests/data/config/pylintrc.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,303 @@
+
+[MASTER]
+
+# Add <file or directory> to the black list. It should be a base name, not a
+# path. You may set this option multiple times.
+ignore=CVS
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Set the cache size for astng objects.
+cache-size=500
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+
+[MESSAGES CONTROL]
+
+# Enable only checker(s) with the given id(s). This option conflicts with the
+# disable-checker option
+#enable-checker=
+
+# Enable all checker(s) except those with the given id(s). This option
+# conflicts with the enable-checker option
+#disable-checker=
+
+# Enable all messages in the listed categories.
+#enable-msg-cat=
+
+# Disable all messages in the listed categories.
+#disable-msg-cat=
+
+# Enable the message(s) with the given id(s).
+#enable-msg=
+
+# Disable the message(s) with the given id(s).
+# R0912: Too many branches
+# F0401: Unable to import 'x'
+# C0111: Missing docstring
+# R0201: Method could be a function
+# R0915: Too many statements
+# R0902: Too many instance attributes
+# R0913: Too many arguments
+# R0904: Too many public methods
+# C0103: Invalid name
+# W0603: Using the global statement
+# W0142: Used * or ** magic
+# W0612: Unused variable
+# R0922: Abstract class is only referenced 1 times
+# W0232: Class has no __init__ method
+# I0011: Locally disabling *
+disable=C0301,W0401,W0611,W0614,R0801,W0402,R0914,C0302,R0903,R0912,F0401,C0111,R0201,R0915,R0902,R0913,R0904,C0103,W0603,W0142,W0612,R0922,W0232,I0011
+
+
+[REPORTS]
+
+# set the output format. Available formats are text, parseable, colorized, msvs
+# (visual studio) and html
+output-format=text
+
+# Include message's id in output
+include-ids=yes
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]".
+files-output=no
+
+# Tells wether to display a full report or only the messages
+reports=yes
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note).You have access to the variables errors warning, statement which
+# respectivly contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (R0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Add a comment according to your evaluation note. This is used by the global
+# evaluation report (R0004).
+comment=no
+
+# Enable the report(s) with the given id(s).
+#enable-report=
+
+# Disable the report(s) with the given id(s).
+#disable-report=
+
+
+# checks for :
+# * doc strings
+# * modules / classes / functions / methods / arguments / variables name
+# * number of arguments, local variables, branchs, returns and statements in
+# functions, methods
+# * required module attributes
+# * dangerous default values as arguments
+# * redefinition of function / method / class
+# * uses of the global statement
+#
+[BASIC]
+
+# Required attributes for module, separated by a comma
+required-attributes=
+
+# Regular expression which should only match functions or classes name which do
+# not require a docstring
+no-docstring-rgx=__.*__
+
+# Regular expression which should only match correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression which should only match correct module level names
+const-rgx=(([A-Z_][A-Z1-9_]*)|(__.*__)|(_[a-zA-Z0-9_]{2,40}))$
+
+# Regular expression which should only match correct class names
+class-rgx=[A-Z_][a-zA-Z0-9]+$
+
+# Regular expression which should only match correct function names
+function-rgx=[a-z_][a-zA-Z0-9_]{2,40}$
+
+# Regular expression which should only match correct method names
+method-rgx=[a-z_][a-zA-Z0-9_]{2,40}$
+
+# Regular expression which should only match correct instance attribute names
+attr-rgx=[a-z_][a-zA-Z0-9_]{2,40}$
+
+# Regular expression which should only match correct argument names
+argument-rgx=[a-z_][a-zA-Z0-9_]{2,30}$
+
+# Regular expression which should only match correct variable names
+variable-rgx=[a-z_][a-zA-Z0-9_]{2,30}$
+
+# Regular expression which should only match correct list comprehension /
+# generator expression variable names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# List of builtins function names that should not be used, separated by a comma
+bad-functions=map,filter,apply,input
+
+
+# try to find bugs in the code using type inference
+#
+[TYPECHECK]
+
+# Tells wether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# When zope mode is activated, consider the acquired-members option to ignore
+# access to some undefined attributes.
+zope=no
+
+# List of members which are usually get through zope's acquisition mecanism and
+# so shouldn't trigger E0201 when accessed (need zope=yes to be considered).
+acquired-members=REQUEST,acl_users,aq_parent
+
+
+# checks for
+# * unused variables / imports
+# * undefined variables
+# * redefinition of variable from builtins or from an outer scope
+# * use of variable before assigment
+#
+[VARIABLES]
+
+# Tells wether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=_|dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+
+# checks for :
+# * methods without self as first argument
+# * overridden methods signature
+# * access only to existant members via self
+# * attributes not defined in the __init__ method
+# * supported interfaces implementation
+# * unreachable code
+#
+[CLASSES]
+
+# List of interface methods to ignore, separated by a comma. This is used for
+# instance to not check methods defines in Zope's Interface base class.
+ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+
+# checks for sign of poor/misdesign:
+# * number of methods, attributes, local variables...
+# * size, complexity of functions, methods
+#
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of branch for function / method body
+max-branchs=12
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+
+# checks for
+# * external modules dependencies
+# * relative / wildcard imports
+# * cyclic imports
+# * uses of deprecated modules
+#
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,string,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report R0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report R0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report R0402 must
+# not be disabled)
+int-import-graph=
+
+
+# checks for :
+# * unauthorized constructions
+# * strict indentation
+# * line length
+# * use of <> instead of !=
+#
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=80
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string=' '
+
+
+# checks for:
+# * warning notes in the code like FIXME, XXX
+# * PEP 263: source code with non ascii character but no encoding declaration
+#
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+# checks for similarities and duplicated code. This computation may be
+# memory / CPU intensive, so you should disable it if you experiments some
+# problems.
+#
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
--- a/buildframework/helium/sf/java/antlint/tests/data/sample.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/tests/data/sample.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -27,7 +27,10 @@
<taskdef resource="net/sf/antcontrib/antlib.xml"/>
-
+ <var name="var1" value="bar" unset="true"/>
+ <var name="var2" value="bar" />
+ <var name="var3" unset="true" />
+
<macrodef name="pow" uri="http://www.nokia.com/helium">
<sequential>
<echo>pow</echo>
@@ -72,51 +75,51 @@
<target name="check-script-size">
<hlm:python>
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
-print check-script-size
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
+print 'check-script-size'
</hlm:python>
</target>
@@ -187,6 +190,7 @@
<target name="check-prop-in-pythontask">
<hlm:python>
from path import path
+print abcd
print "Writing version file...."
vfile = path(r'${build.drive}'+"/").joinpath('s60_version.txt')
f = open(str(vfile), 'w')
@@ -294,5 +298,122 @@
</catch>
</trycatch>
</target>
+
+ <!-- Test property to check for invalid string property types.
+ @type string
+ @scope public
+ -->
+ <property name="test.prop.str.1" value="str.prop"/>
+
+ <!-- Test property to check for invalid string property types.
+ @type string
+ @scope private
+ -->
+ <property name="test.prop.str.2" value="12345"/>
+
+ <!-- Test property to check for invalid integer property types.
+ @type integer
+ @scope public
+ -->
+ <property name="test.prop.int.1" value="123"/>
+
+ <!-- Test property to check for invalid integer property types.
+ @type integer
+ @scope public
+ -->
+ <property name="test.prop.int.2" value="123abc"/>
+ <!-- Test property to check for invalid boolean property types.
+ @type boolean
+ @scope public
+ -->
+ <property name="test.prop.bool.1" value="true"/>
+
+ <!-- Test property to check for invalid boolean property types.
+ @type boolean
+ @scope public
+ -->
+ <property name="test.prop.bool.2" value="false"/>
+
+ <!-- Test property to check for invalid boolean property types.
+ @type boolean
+ @scope public
+ -->
+ <property name="test.prop.bool.3" value="t"/>
+
+ <!-- Test property to check for invalid boolean property types.
+ @type boolean
+ @scope public
+ -->
+ <property name="test.prop.bool.4" value="f"/>
+
+ <!-- Test property to check for invalid boolean property types.
+ @type boolean
+ @scope public
+ -->
+ <property name="test.prop.bool.5" value="yes"/>
+
+ <!-- Test property to check for invalid boolean property types.
+ @type boolean
+ @scope public
+ -->
+ <property name="test.prop.bool.6" value="no"/>
+
+ <!-- Test property to check for invalid boolean property types.
+ @type boolean
+ @scope public
+ -->
+ <property name="test.prop.bool.7" value="poo"/>
+
+ <!--* @property test.comment.str.prop
+ Test comment property to check for invalid string values.
+ @type string
+ @scope public
+ @since 10.0
+ -->
+
+ <!--* @property test.comment.int.prop
+ Test comment property to check for invalid integer values.
+ @type integer
+ @scope public
+ @since 10.0
+ -->
+
+ <!--* @property test.comment.bool.prop
+ Test comment property to check for invalid string values.
+ @type boolean
+ @scope public
+ @since 10.0
+ -->
+
+ <!-- Test property to check for invalid integer property types.
+ @type number
+ @scope public
+ -->
+ <property name="test.prop.number.1" value="1234"/>
+
+ <!-- Test property to check for invalid boolean property types.
+ @type flag
+ @scope public
+ -->
+ <property name="test.prop.flag" value="true"/>
+
+ <!-- Test property to check for valid float property types.
+ @type float
+ @scope public
+ -->
+ <property name="test.prop.float.1" value="1.5"/>
+
+ <!-- Test property to check for invalid float property types.
+ @type float
+ @scope public
+ -->
+ <property name="test.prop.float.2" value="1.5a"/>
+
+ <!-- Test property to check for invalid integer property types.
+ @type integer
+ @scope public
+ -->
+ <property name="test.prop.int.3" value="1.8"/>
+
</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/antlint/tests/data/sample.antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antlint/tests/data/sample.antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -31,8 +31,6 @@
</sequential>
</macrodef>
-
-
<scriptdef name="check-prop-in-scriptdef" language="jython">
result = None
if project.getProperty("test.scriptdef.property")is not None:
@@ -45,10 +43,23 @@
target = str(attributes.get('attr0'))
</scriptdef>
- <scriptdef name="check-scriptdef-beanshell" language="beanshell">
+ <scriptdef name="checkScriptdefBeanshell" language="beanshell">
<attribute name="attr0"/>
<attribute name="attr2"/>
-target = str(attributes.get('attr0'))
+ <element name="path" type="path"/>
+ <![CDATA[
+import java.io.*;
+FileWriter out = new FileWriter(attributes.get("attr0"));
+
+paths = elements.get("path");
+for (int i = 0 ; i < paths.size() ; i++) {
+ String[] files = paths.get(i).list();
+ for (int j = 0; j < files.length ; j++) {
+ out.write(files[j] + "\n");
+ }
+}
+out.close();
+ ]]>
</scriptdef>
<scriptdef name="check-scriptdef-style" language="jython" uri="http://www.nokia.com/helium">
@@ -70,7 +81,28 @@
target = str(attributes.get('target'))
</scriptdef>
- <scriptdef name="check-scriptdef-attributes" language="beanshell">
-target = str(attributes.get('target'))
+ <scriptdef name="checkScriptdefAttributes" language="beanshell">
+ <element name="path" type="path"/>
+ <![CDATA[
+import java.io.*;
+FileWriter out = new FileWriter(attributes.get("attr0"));
+
+paths = elements.get("path");
+for (int i = 0 ; i < paths.size() ; i++) {
+ String[] files = paths.get(i).list();
+ for (int j = 0; j < files.length ; j++) {
+ out.write(files[j] + "\n");
+ }
+}
+out.close();
+ ]]>
</scriptdef>
+
+ <macrodef name="antlint" uri="http://www.nokia.com/helium">
+ <sequential>
+ <echo>antlintMacro</echo>
+ <runtarget target="hello"/>
+ </sequential>
+ </macrodef>
+
</antlib>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/antlint/tests/hlm_debug.log Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1 @@
+11:02:12,823 DEBUG - Calling final target : null
--- a/buildframework/helium/sf/java/antunit/src/com/nokia/helium/antunit/ant/types/CustomListener.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/antunit/src/com/nokia/helium/antunit/ant/types/CustomListener.java Mon Oct 18 10:23:52 2010 +0100
@@ -32,14 +32,14 @@
* The customListener type allows you to defines additional custom
* listener to be run while running test. Each test are considered
* as single build.
- *
+ * <pre>
* <au:antunit<
* .......
* <hlm:customListener<
* <hlm:listener classname="org.apache.tools.ant.listener.XmlLogger" /<
* </hlm:customListener<
* </au:antunit<
- *
+ * </pre>
* @ant.type name="customListener" category="antunit"
*/
public class CustomListener extends DataType implements AntUnitListener {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-blocks">
+ <description>Helium Antlib Blocks build file.</description>
+
+ <dirname property="blocks.root.dir" file="${ant.file.helium-blocks}" />
+
+ <import file="${builder.dir}/java/macros.ant.xml"/>
+
+ <property name="name" value="blocks"/>
+
+</project>
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/demo/build.bat Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,27 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set OLDANT_ARGS=-lib %CD%\..\lib -lib %CD%\..\..\..\sf\lib -lib %CD%\..\..\bin\helium-blocks.jar -lib %CD%\..\..\..\sf\antlibs
+ant %*
+endlocal
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/demo/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-blocks-demo" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium Antlib blocks demo.</description>
+
+ <taskdef resource="com/nokia/helium/blocks/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+ <import file="../../../companyproperties.ant.xml" />
+
+ <target name="demo">
+ <mkdir dir="./workspace-demo" />
+ <hlm:blocksAddWorkspace name="unittest-addworkspace" dir="./workspace-demo" wsidproperty="wsid" verbose="true" />
+ <echo>wsid: ${wsid}</echo>
+ <condition property="name.exists" else="false">
+ <hlm:blocksWorkspaceExists name="unittest-addworkspace" />
+ </condition>
+ <echo>unittest-addworkspace exists: ${name.exists}</echo>
+ <condition property="dir.exists" else="false">
+ <hlm:blocksWorkspaceExists dir="workspace-demo" />
+ </condition>
+ <echo>workspace-demo dir exists: ${dir.exists}</echo>
+ <hlm:blocksRemoveWorkspace wsid="${wsid}" verbose="true" />
+ </target>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/ivy.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+============================================================================
+Name : ivy.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
+ <info
+ organisation="com.nokia.helium"
+ module="helium-blocks"
+ status="integration">
+ </info>
+ <dependencies>
+ <dependency name="helium-core" rev="latest.integration" conf="default" />
+ </dependencies>
+</ivy-module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/AddWorkspaceStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Implements a parser of add workspace calls.
+ *
+ */
+public class AddWorkspaceStreamConsumer implements StreamConsumer {
+
+ public static final String MARKER = "Workspace id: ";
+ private int wsid;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void consumeLine(String line) {
+ // Workspace id: 2
+ if (line.startsWith(MARKER)) {
+ wsid = Integer.valueOf(line.substring(MARKER.length()));
+ }
+ }
+
+ /**
+ * Get the discovered workspace ID.
+ * @return the workspace ID. Zero value means an invalid ID.
+ */
+ public int getWsid() {
+ return wsid;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/Blocks.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,257 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+import java.io.File;
+import java.util.List;
+
+import com.nokia.helium.core.plexus.CommandBase;
+
+/**
+ * This class is the base abstraction layer for invoking
+ * Blocks commands.
+ *
+ */
+public class Blocks extends CommandBase<BlocksException> {
+ public static final String SEARCH_ALL_BUNDLES_EXPRESSION = ".";
+ private String executable = "blocks";
+
+ /**
+ * Default constructor.
+ */
+ public Blocks() {
+ }
+
+ /**
+ * New blocks instance with proper blocks script location.
+ * @param executable
+ */
+ public Blocks(String executable) {
+ this.executable = executable;
+ }
+
+ /**
+ * Add a new Blocks workspace.
+ * @param location the location of the workspace
+ * @param name the name of the workspace
+ * @return a Workspace object
+ * @throws BlocksException
+ */
+ public Workspace addWorkspace(File location, String name) throws BlocksException {
+ String[] args = new String[3];
+ args[0] = "workspace-add";
+ args[1] = location.getAbsolutePath();
+ args[2] = "--name=" + name;
+ AddWorkspaceStreamConsumer consumer = new AddWorkspaceStreamConsumer();
+ execute(args, consumer);
+
+ Workspace workspace = new Workspace();
+ workspace.setWsid(consumer.getWsid());
+ workspace.setLocation(location);
+ workspace.setName(name);
+ return workspace;
+ }
+
+ /**
+ * Remove a workspace.
+ * @param wsid the id of the workspace to remove.
+ * @throws BlocksException
+ */
+ public void removeWorkspace(int wsid) throws BlocksException {
+ String[] args = new String[3];
+ args[0] = "--force";
+ args[1] = "workspace-remove";
+ args[2] = "" + wsid;
+ execute(args);
+ }
+
+ /**
+ * List all existing workspaces.
+ * @return an array of Workspace objects.
+ * @throws BlocksException
+ */
+ public Workspace[] listWorkspaces() throws BlocksException {
+ String[] args = new String[1];
+ args[0] = "workspace-list";
+ WorkspaceListStreamConsumer consumer = new WorkspaceListStreamConsumer();
+ execute(args, consumer);
+ return consumer.getWorkspaces();
+ }
+
+ /**
+ * Search for a bundles matching the expression.
+ * @param expression the expression to match
+ * @return a list of string representing the list of bundles.
+ * @throws BlocksException in case of execution errors.
+ */
+ public List<String> search(int wsid, String expression) throws BlocksException {
+ String[] args = new String[3];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "search";
+ args[2] = expression;
+ SearchStreamConsumer consumer = new SearchStreamConsumer();
+ execute(args, consumer);
+ return consumer.getSearchResults();
+ }
+
+ /**
+ * Installing a bundles defines by a name.
+ * @param bundleName the name of the bundle to install
+ * @throws BlocksException
+ */
+ public void installBundle(int wsid, String bundleName) throws BlocksException {
+ String[] args = new String[4];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "--force";
+ args[2] = "bundle-install";
+ args[3] = bundleName;
+ execute(args);
+ }
+
+ /**
+ * Installing a bundles defines by a group name.
+ * @param groupName the group name to install
+ * @throws BlocksException
+ */
+ public void installGroup(int wsid, String groupName) throws BlocksException {
+ String[] args = new String[4];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "--force";
+ args[2] = "group-install";
+ args[3] = groupName;
+ execute(args);
+ }
+
+ /**
+ * Get the list of groups available.
+ * @return
+ * @throws BlocksException
+ */
+ public List<Group> listGroup(int wsid) throws BlocksException {
+ String[] args = new String[2];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "group-list";
+ GroupListStreamConsumer consumer = new GroupListStreamConsumer();
+ execute(args, consumer);
+ return consumer.getGroups();
+ }
+
+ /**
+ * Add a repository to a workspace, using a generated name.
+ * @param wsid
+ * @param url
+ * @throws BlocksException
+ */
+ public void addRepository(int wsid, String url) throws BlocksException {
+ String[] args = new String[4];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "--force";
+ args[2] = "repo-add";
+ args[3] = url;
+ execute(args);
+ }
+
+ /**
+ * Add a repository to a workspace, using a given name.
+ * @param wsid the workspace id
+ * @param name the repository name
+ * @param url the repository location.
+ * @throws BlocksException
+ */
+ public void addRepository(int wsid, String name, String url) throws BlocksException {
+ String[] args = new String[5];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "--force";
+ args[2] = "repo-add";
+ args[3] = "--name=" + name;
+ args[4] = url;
+ execute(args);
+ }
+
+ /**
+ * Remove a repository base on its id.
+ * @param wsid the workspace id
+ * @param id the repository id to remove
+ * @throws BlocksException
+ */
+ public void removeRepository(int wsid, int id) throws BlocksException {
+ String[] args = new String[4];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "--force";
+ args[2] = "repo-remove";
+ args[3] = "" + id;
+ execute(args);
+ }
+
+ /**
+ * Remove a repository base on its name.
+ * @param wsid the workspace id
+ * @param name the repository name to remove
+ * @throws BlocksException
+ */
+ public void removeRepository(int wsid, String name) throws BlocksException {
+ String[] args = new String[3];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "repo-remove";
+ args[2] = name;
+ execute(args);
+ }
+
+ /**
+ * Get the repository list for current workspace.
+ * @param wsid the current workspace id.
+ * @return the repository list
+ * @throws BlocksException
+ */
+ public List<Repository> listRepository(int wsid) throws BlocksException {
+ String[] args = new String[2];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "repo-list";
+ RepositoryListStreamConsumer consumer = new RepositoryListStreamConsumer();
+ execute(args, consumer);
+ return consumer.getRepositories();
+ }
+
+ /**
+ * Updating the workspace pointed by wsid.
+ * @param wsid the workspace id to update
+ * @throws BlocksException
+ */
+ public void update(int wsid) throws BlocksException {
+ String[] args = new String[3];
+ args[0] = "--wsid=" + wsid;
+ args[1] = "--force";
+ args[2] = "update";
+ execute(args);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected String getExecutable() {
+ return executable;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void throwException(String message, Throwable t) throws BlocksException {
+ throw new BlocksException(message, t);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/BlocksException.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+/**
+ * Exception thrown by the Blocks framework.
+ *
+ */
+public class BlocksException extends Exception {
+
+ private static final long serialVersionUID = 8563679708827021881L;
+
+ /**
+ * Default constructor
+ * @param error the error message.
+ */
+ public BlocksException(String error) {
+ super(error);
+ }
+
+ /**
+ * Constructor which accept a message and a cause.
+ * @param error the error message.
+ */
+ public BlocksException(String message, Throwable t) {
+ super(message, t);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/Bundle.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.blocks;
+
+import java.io.File;
+
+import com.nokia.helium.core.plexus.CommandBase;
+
+/**
+ * Wrapper class for the bundle application. The bundle application will help to do simple
+ * operations on bundles, like creating repository index or sign a bundle.
+ *
+ */
+public class Bundle extends CommandBase<BundleException> {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected String getExecutable() {
+ return "bundle";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void throwException(String message, Throwable t) throws BundleException {
+ throw new BundleException(message, t);
+ }
+
+ /**
+ * Create a repository index base on a directory.
+ *
+ * @param path the directory which contains the debs packages.
+ * @throws BundleException in case of error.
+ */
+ public void createRepositoryIndex(File path) throws BundleException {
+ createRepositoryIndex(path, false);
+ }
+
+ /**
+ * Create a signed repository index base on a directory.
+ *
+ * @param path the directory which contains the debs packages.
+ * @param sign defines if the repository should be signed.
+ * @throws BundleException in case of error.
+ */
+ public void createRepositoryIndex(File path, boolean sign) throws BundleException {
+ if (path == null) {
+ throw new BundleException("Impossible to create the index, no directory specified.");
+ }
+ if (!path.isDirectory()) {
+ throw new BundleException("Invalid directory: " + path.getAbsolutePath());
+ }
+ String[] args = null;
+ if (sign) {
+ args = new String[3];
+ args[0] = "create-repo";
+ args[1] = "--sign";
+ args[2] = path.getAbsolutePath();
+ }
+ else {
+ args = new String[2];
+ args[0] = "create-repo";
+ args[1] = path.getAbsolutePath();
+ }
+ this.execute(args);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/BundleException.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+/**
+ * Exception thrown by the Bundle manipulation framework.
+ *
+ */
+public class BundleException extends Exception {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Default constructor.
+ * @param error the error message.
+ */
+ public BundleException(String error) {
+ super(error);
+ }
+
+ /**
+ * Constructor which accept a message and a cause.
+ * @param error the error message.
+ */
+ public BundleException(String message, Throwable t) {
+ super(message, t);
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/Group.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,43 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+/**
+ * This class represents information related to
+ * a group.
+ *
+ */
+public class Group {
+ private String name;
+
+ /**
+ * Create a new Group with a name.
+ * @param name
+ */
+ public Group(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Get the group name.
+ * @return the group name as a string.
+ */
+ public String getName() {
+ return name;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/GroupListStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Implements group-list results parsing.
+ *
+ */
+public class GroupListStreamConsumer implements StreamConsumer {
+ private List<Group> groups = new ArrayList<Group>();
+
+ @Override
+ public void consumeLine(String line) {
+ if (line.trim().length() > 0) {
+ groups.add(new Group(line.trim()));
+ }
+ }
+
+ /**
+ * Get the group list from blocks output.
+ * @return a list of Group instance.
+ */
+ public List<Group> getGroups() {
+ return groups;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/Repository.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+
+/**
+ * This class stores the information related to a
+ * repository.
+ *
+ */
+public class Repository {
+ private int id;
+ private String name;
+ private String url;
+
+ /**
+ * Set the repository id.
+ * @param id
+ */
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ /**
+ * Set the repository name.
+ * @param id
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Set the repository location.
+ * @param id
+ */
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ /**
+ * Get the repository id.
+ * @param id
+ */
+ public int getId() {
+ return id;
+ }
+
+ /**
+ * Get the repository name.
+ * @param id
+ */
+ public String getName() {
+ return name;
+ }
+
+
+ /**
+ * Get the repository location.
+ * @param id
+ */
+ public String getUrl() {
+ return url;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/RepositoryListStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Implements repo-list results parsing.
+ *
+ */
+public class RepositoryListStreamConsumer implements StreamConsumer {
+ private List<Repository> repositories = new ArrayList<Repository>();
+ private Repository repository;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void consumeLine(String line) {
+ if (repository == null && line.matches("^\\d+\\*?$")) {
+ repository = new Repository();
+ repository.setId(Integer.parseInt(line.trim().replaceAll("\\*", "")));
+ } else if (repository != null && line.matches("^\\s+Name:\\s+.+$")) {
+ repository.setName(line.split("Name:")[1].trim());
+ } else if (repository != null && line.matches("^\\s+URI:\\s+.+$")) {
+ repository.setUrl(line.split("URI:")[1].trim());
+ repositories.add(repository);
+ repository = null;
+ }
+ }
+
+ /**
+ * Get the list of repositories found.
+ * @return the list of repositories.
+ */
+ public List<Repository> getRepositories() {
+ return repositories;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/SearchStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Implements search results parsing.
+ *
+ */
+public class SearchStreamConsumer implements StreamConsumer {
+ private static final String SEPARATOR = " - ";
+ private List<String> results = new ArrayList<String>();
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void consumeLine(String line) {
+ if (line.contains(SEPARATOR)) {
+ results.add(line.substring(0, line.indexOf(SEPARATOR)));
+ }
+ }
+
+ /**
+ * Get the search result list.
+ * @return
+ */
+ public List<String> getSearchResults() {
+ return results;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/Workspace.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+import java.io.File;
+
+/**
+ * Holder for workspace information:
+ * - ID
+ * - Name
+ * - Location
+ *
+ */
+public class Workspace {
+ private int wsid;
+ private String name;
+ private File location;
+
+
+ /**
+ * Get the workspace id.
+ * @return the workspace id.
+ */
+ public int getWsid() {
+ return wsid;
+ }
+
+ /**
+ * Set the workspace id.
+ * @param wsid the workspace id
+ */
+ public void setWsid(int wsid) {
+ this.wsid = wsid;
+ }
+
+ /**
+ * Get the workspace name.
+ * @return the workspace name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set the workspace name.
+ * @param name The workspace name
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Get the workspace location.
+ * @return the workspace directory.
+ */
+ public File getLocation() {
+ return location;
+ }
+
+ /**
+ * Set the workspace location.
+ * @param location the location to set.
+ */
+ public void setLocation(File location) {
+ this.location = location;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/WorkspaceListStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,54 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks;
+
+import java.io.File;
+import java.util.Vector;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Implements a parser of workspace list calls.
+ *
+ */
+public class WorkspaceListStreamConsumer implements StreamConsumer {
+
+ private Workspace workspace;
+ private Vector<Workspace> workspaces = new Vector<Workspace>();
+
+ @Override
+ public void consumeLine(String line) {
+ if (workspace == null && line.matches("^\\d+\\*?$")) {
+ workspace = new Workspace();
+ workspace.setWsid(Integer.parseInt(line.trim().replaceAll("\\*", "")));
+ } else if (workspace != null && line.matches("^\\s+name:\\s+.+$")) {
+ workspace.setName(line.split("name:")[1].trim());
+ } else if (workspace != null && line.matches("^\\s+path:\\s+.+$")) {
+ workspace.setLocation(new File(line.split("path:")[1].trim()));
+ workspaces.add(workspace);
+ workspace = null;
+ }
+ }
+
+ /**
+ * Returns the list of found workspaces.
+ * @return
+ */
+ public Workspace[] getWorkspaces() {
+ return workspaces.toArray(new Workspace[workspaces.size()]);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/AbstractBlocksTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,88 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+import com.nokia.helium.blocks.Blocks;
+import com.nokia.helium.core.plexus.AntStreamConsumer;
+
+/**
+ * This class implement an abstract Blocks task. It predefines
+ * some method to handle the workspace id.
+ *
+ */
+public abstract class AbstractBlocksTask extends Task {
+
+ private Blocks blocks;
+ private boolean verbose;
+ private Integer wsid;
+
+ /**
+ * The workspace id.
+ * @param wsid
+ * @ant.not-required
+ */
+ public void setWsid(Integer wsid) {
+ this.wsid = wsid;
+ }
+
+ /**
+ * Get the workspace id, it throws a BuildException if not set.
+ * @return
+ */
+ public int getWsid() {
+ if (wsid == null) {
+ throw new BuildException("wsid has not been specified.");
+ }
+ return wsid.intValue();
+ }
+
+
+ /**
+ * Are we execution the task in verbose mode.
+ * @return
+ */
+ public boolean isVerbose() {
+ return verbose;
+ }
+
+ /**
+ * Set true to show the output from blocks command execution.
+ * @param verbose
+ * @ant.not-required Default to false.
+ */
+ public void setVerbose(boolean verbose) {
+ this.verbose = verbose;
+ }
+
+ protected Blocks getBlocks() {
+ if (blocks == null) {
+ blocks = new Blocks();
+ if (isVerbose()) {
+ blocks.addOutputLineHandler(new AntStreamConsumer(this, Project.MSG_INFO));
+ } else {
+ blocks.addOutputLineHandler(new AntStreamConsumer(this, Project.MSG_DEBUG));
+ }
+ blocks.addErrorLineHandler(new AntStreamConsumer(this, Project.MSG_ERR));
+ }
+ return blocks;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : antlib.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+ <!-- Task definition -->
+ <taskdef name="blocksAddWorkspace" classname="com.nokia.helium.blocks.ant.taskdefs.AddWorkspaceTask"/>
+ <taskdef name="blocksRemoveWorkspace" classname="com.nokia.helium.blocks.ant.taskdefs.RemoveWorkspaceTask"/>
+ <taskdef name="blocksGetWorkspaceId" classname="com.nokia.helium.blocks.ant.taskdefs.GetWorkspaceIdTask"/>
+ <taskdef name="blocksCreateRepositoryIndex" classname="com.nokia.helium.blocks.ant.taskdefs.CreateRepositoryIndexTask"/>
+ <taskdef name="blocksInstallBundle" classname="com.nokia.helium.blocks.ant.taskdefs.InstallBundleTask"/>
+ <taskdef name="blocksAddRepository" classname="com.nokia.helium.blocks.ant.taskdefs.AddRepoTask"/>
+ <taskdef name="blocksRemoveRepository" classname="com.nokia.helium.blocks.ant.taskdefs.RemoveRepoTask"/>
+ <taskdef name="blocksUpdate" classname="com.nokia.helium.blocks.ant.taskdefs.UpdateTask"/>
+
+ <!-- Type definition -->
+ <typedef name="blocksWorkspaceExists" classname="com.nokia.helium.blocks.ant.conditions.WorkspaceExists"/>
+ <typedef name="blocksRepositoryExists" classname="com.nokia.helium.blocks.ant.conditions.RepositoryExists"/>
+ <typedef name="blocksRepositorySet" classname="com.nokia.helium.blocks.ant.types.RepositorySet"/>
+</antlib>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/conditions/RepositoryExists.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.conditions;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+
+import com.nokia.helium.blocks.Blocks;
+import com.nokia.helium.blocks.BlocksException;
+import com.nokia.helium.blocks.Repository;
+import com.nokia.helium.blocks.ant.AbstractBlocksTask;
+
+/**
+ * The blocksRepositoryExists condition help you to check the existence of a repository definition under
+ * a specific workspace.
+ *
+ * This example will set the 'exists' property if a 'my_repository_name' repository is defined in the wsid workspace:
+ * <pre>
+ * <condition property="exists" >
+ * <hlm:blocksRepositoryExists name="my_repository_name" />
+ * </condition>
+ * </pre>
+
+ * This example will set the 'exists' property if any repository are defined in the wsid workspace:
+ * <pre>
+ * <condition property="exists" >
+ * <hlm:blocksRepositoryExists />
+ * </condition>
+ * </pre>
+ *
+ * @ant.type name="blocksRepositoryExists" category="Blocks"
+ */
+
+public class RepositoryExists extends AbstractBlocksTask implements Condition {
+ private String name;
+
+ /**
+ * The name of the repository to check the existence.
+ * @param name
+ * @ant.not-required
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean eval() {
+ Blocks blocks = getBlocks();
+ try {
+ for (Repository repository : blocks.listRepository(getWsid())) {
+ if (name != null && name.equals(repository.getName())) {
+ return true;
+ } else if (name == null) {
+ return true;
+ }
+
+ }
+ } catch (BlocksException e) {
+ throw new BuildException(e);
+ }
+ return false;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/conditions/WorkspaceExists.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,112 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.conditions;
+
+import hidden.org.codehaus.plexus.interpolation.os.Os;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.condition.Condition;
+
+import com.nokia.helium.blocks.Blocks;
+import com.nokia.helium.blocks.BlocksException;
+import com.nokia.helium.blocks.Workspace;
+import com.nokia.helium.blocks.ant.AbstractBlocksTask;
+import com.nokia.helium.core.filesystem.windows.Subst;
+
+/**
+ * The blocksWorkspaceExists condition help you to check the existence of a workspace
+ * based on his name or location.
+ *
+ * In the following example the property 'exists' is set if the blocks workspace named 'workspace_name' exists:
+ * <pre>
+ * <condition property="exists" >
+ * <hlm:blocksWorkspaceExists name="workspace_name" />
+ * </condition>
+ * </pre>
+ *
+ * @ant.type name="blocksWorkspaceExists" category="Blocks"
+ */
+public class WorkspaceExists extends AbstractBlocksTask implements Condition {
+
+ private File dir;
+ private String name;
+
+ /**
+ * The directory of the workspace to check the existence.
+ * @param dir
+ * @ant.not-required
+ */
+ public void setDir(File dir) {
+ this.dir = dir;
+ }
+
+ /**
+ * The name of the workspace to check the existence.
+ * @param name
+ * @ant.not-required
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean eval() {
+ if (dir == null && name == null) {
+ throw new BuildException("Either name or dir should be defined.");
+ }
+ if (dir != null && name != null) {
+ throw new BuildException("name or dir should not be defined at the same time.");
+ }
+
+ Blocks blocks = getBlocks();
+ try {
+ for (Workspace workspace : blocks.listWorkspaces()) {
+ if (dir != null && getRealDir().equals(workspace.getLocation().getCanonicalFile())) {
+ return true;
+ }
+ if (name != null && name.equals(workspace.getName())) {
+ return true;
+ }
+ }
+ } catch (BlocksException e) {
+ throw new BuildException(e);
+ } catch (IOException e) {
+ throw new BuildException(e);
+ }
+ return false;
+ }
+
+ /**
+ * Solve subst drives on windows.
+ * @return the realpath.
+ * @throws IOException
+ */
+ protected File getRealDir() throws IOException {
+ if (Os.isFamily(Os.FAMILY_WINDOWS) && dir != null) {
+ Subst subst = new Subst();
+ log("Real path: " + subst.getRealPath(dir).getCanonicalFile());
+ return subst.getRealPath(dir).getCanonicalFile();
+ }
+ return dir != null ? dir.getCanonicalFile() : null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/helium.antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : helium.antlib.xml
+Part of : Helium Antlib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="libs-blocks" xmlns:hlm="http://www.nokia.com/helium">
+ <description>
+ Ant task definition declarations.
+ </description>
+ <taskdef resource="com/nokia/helium/blocks/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/taskdefs/AddRepoTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,131 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.taskdefs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.helium.blocks.BlocksException;
+import com.nokia.helium.blocks.ant.AbstractBlocksTask;
+import com.nokia.helium.blocks.ant.types.RepositorySet;
+import com.nokia.helium.blocks.ant.types.RepositorySet.Repository;
+
+/**
+ * Adding repository to a workspace.
+ *
+ * Adding a repository with generated name:
+ * <pre>
+ * <hlm:blocksAddRepository wsid="1" url="file:e:/repo" />
+ * </pre>
+ *
+ * Adding repository with a given name:
+ * <pre>
+ * <hlm:blocksAddRepository wsid="1" name="repo1" url="file:e:/repo1" />
+ * </pre>
+ *
+ * Adding several repositories using nested repositorySet elements:
+ * <pre>
+ * <hlm:blocksAddRepository wsid="1">
+ * <repositorySet>
+ * <repository name="repo1" url="file:e:/repo1"/>
+ * <repository name="repo2" url="file:e:/repo2"/>
+ * </repositorySet>
+ * </hlm:blocksAddRepository>
+ * </pre>
+
+ * @ant.task name="blocksAddRepository" category="Blocks"
+ */
+public class AddRepoTask extends AbstractBlocksTask {
+ private String url;
+ private String name;
+ private List<RepositorySet> repositorySets = new ArrayList<RepositorySet>();
+
+ /**
+ * Add this repository URL to the
+ * workspace.
+ * @param url
+ */
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ /**
+ * Name of this repository.
+ * @param name
+ * @ant.not-required Blocks will generate a name.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Adding a nested RepositorySet element.
+ * @return a new RepositorySet instance.
+ */
+ public RepositorySet createRepositorySet() {
+ RepositorySet repositorySet = new RepositorySet();
+ this.add(repositorySet);
+ return repositorySet;
+ }
+
+ /**
+ * Adding a nested RepositorySet element.
+ * @param repositorySet
+ */
+ public void add(RepositorySet repositorySet) {
+ repositorySets.add(repositorySet);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void execute() {
+ if (url == null && repositorySets.isEmpty()) {
+ throw new BuildException("'url' attribute has not been defined.");
+ }
+ if (url != null && !repositorySets.isEmpty()) {
+ throw new BuildException("'url' attribute and nested repositorySet element cannot be used at the same time.");
+ }
+ try {
+ if (url != null) {
+ if (name == null) {
+ getBlocks().addRepository(getWsid(), url);
+ log("The repository " + url + " has been added successfully to workspace " + getWsid() + ".");
+ } else {
+ getBlocks().addRepository(getWsid(), name, url);
+ log("The repository " + name + " => " + url +
+ " has been added successfully to workspace " + getWsid() + ".");
+ }
+ } else {
+ for (RepositorySet repositorySet : repositorySets) {
+ for (Repository repository : repositorySet.getRepositories()) {
+ if (repository.getName() == null || repository.getUrl() == null) {
+ throw new BuildException("Either name or url attribute missing at " + repository.getLocation());
+ }
+ getBlocks().addRepository(getWsid(), repository.getName(), repository.getUrl());
+ }
+ }
+ }
+ } catch (BlocksException e) {
+ throw new BuildException(e.getMessage(), e);
+ }
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/taskdefs/AddWorkspaceTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.taskdefs;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import com.nokia.helium.blocks.BlocksException;
+import com.nokia.helium.blocks.Workspace;
+import com.nokia.helium.blocks.ant.AbstractBlocksTask;
+
+/**
+ * Declare a directory as a Blocks workspace.
+ *
+ * <pre>
+ * <hlm:blocksAddWorkspace name="myworkspace" dir="/path/to/workspace/dir/" wsidproperty="wsid" />
+ * </pre>
+ *
+ * @ant.task name="blocksAddWorkspace" category="Blocks"
+ */
+public class AddWorkspaceTask extends AbstractBlocksTask {
+
+ private String name;
+ private File dir;
+ private String wsidproperty;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void execute() {
+ if (dir == null) {
+ throw new BuildException("dir attribute is not defined.");
+ }
+ if (name == null) {
+ throw new BuildException("name attribute is not defined.");
+ }
+ try {
+ Workspace workspace = getBlocks().addWorkspace(dir, name);
+ log("Workspace " + workspace.getWsid() + " has been created successfully.");
+ if (wsidproperty != null) {
+ getProject().setNewProperty(wsidproperty, "" + workspace.getWsid());
+ }
+ } catch (BlocksException exc) {
+ throw new BuildException(exc);
+ }
+ }
+
+ /**
+ * The name of the output property.
+ * @param wsidproperty
+ * @ant.required
+ */
+ public void setWsidproperty(String wsidproperty) {
+ this.wsidproperty = wsidproperty;
+ }
+
+ /**
+ * The name of the workspace.
+ * @param name
+ * @ant.required
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ /**
+ * The location of the workspace.
+ * @param dir
+ * @ant.required
+ */
+ public void setDir(File dir) {
+ this.dir = dir;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/taskdefs/CreateRepositoryIndexTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,149 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.taskdefs;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+import com.nokia.helium.blocks.Bundle;
+import com.nokia.helium.blocks.BundleException;
+import com.nokia.helium.core.plexus.AntStreamConsumer;
+
+/**
+ * This task will help you to create a debian repository index.
+ * To generate the index you need to set the dest attribute to point
+ * to a directory containing .deb packages. The outcome of the process
+ * will be a Package file under the mentioned directory.
+ *
+ * <pre>
+ * <hlm:blocksCreateRepositoryIndex dest="E:\some\path\to\a\repo"
+ * verbose="true" sign="false" />
+ * </pre>
+ * @ant.task name="blocksCreateRepositoryIndex" category="Blocks"
+ */
+public class CreateRepositoryIndexTask extends Task {
+
+ private File dest;
+ private boolean sign;
+ private boolean failOnError = true;
+ private boolean verbose;
+
+ /**
+ * Location where to create the repository index.
+ * @param dest
+ * @ant.required
+ */
+ public void setDest(File dest) {
+ this.dest = dest;
+ }
+
+ /**
+ * Get the location where to create the repository index.
+ * @return the dest folder.
+ */
+ public File getDest() {
+ return dest;
+ }
+
+ /**
+ * Defines if the repository index creation should be signed.
+ * @param sign If true the repository will be signed
+ * @ant.not-required Default is false
+ */
+ public void setSign(boolean sign) {
+ this.sign = sign;
+ }
+
+ /**
+ * Shall we sign the repository?
+ * @return true is the repository should be signed.
+ */
+ public boolean isSign() {
+ return sign;
+ }
+
+ /**
+ * If defined as true it will fail the build in case of error,
+ * else it will keepgoing.
+ * @param failOnError
+ * @ant.not-required Default is true.
+ */
+ public void setFailOnError(boolean failOnError) {
+ this.failOnError = failOnError;
+ }
+
+ /**
+ * Shall we fail on error?
+ * @return return true if should fails on error.
+ */
+ public boolean isFailOnError() {
+ return failOnError;
+ }
+
+ /**
+ * Set true to show the output from blocks command execution.
+ * @param verbose
+ * @ant.not-required Default to false.
+ */
+ public void setVerbose(boolean verbose) {
+ this.verbose = verbose;
+ }
+
+ /**
+ * Are we execution the task in verbose mode.
+ * @return
+ */
+ public boolean isVerbose() {
+ return verbose;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void execute() {
+ if (getDest() == null) {
+ throw new BuildException("'dest' attribute must be defined.");
+ }
+ try {
+ getBundle().createRepositoryIndex(getDest(), isSign());
+ } catch (BundleException e) {
+ if (isFailOnError()) {
+ throw new BuildException(e.getMessage(), e);
+ } else {
+ log(e.getMessage(), Project.MSG_ERR);
+ }
+ }
+ }
+
+ /**
+ * Get a pre-configured Bundle application wrapper instance.
+ * @return a new bundle object.
+ */
+ protected Bundle getBundle() {
+ Bundle bundle = new Bundle();
+ if (isVerbose()) {
+ bundle.addOutputLineHandler(new AntStreamConsumer(this, Project.MSG_INFO));
+ } else {
+ bundle.addOutputLineHandler(new AntStreamConsumer(this, Project.MSG_DEBUG));
+ }
+ bundle.addErrorLineHandler(new AntStreamConsumer(this, Project.MSG_ERR));
+ return bundle;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/taskdefs/GetWorkspaceIdTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,119 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.taskdefs;
+
+import hidden.org.codehaus.plexus.interpolation.os.Os;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.helium.blocks.BlocksException;
+import com.nokia.helium.blocks.Workspace;
+import com.nokia.helium.blocks.ant.AbstractBlocksTask;
+import com.nokia.helium.core.filesystem.windows.Subst;
+
+/**
+ * Get the workspace based on the a name or a directory. The task fails if it can't find the information.
+ *
+ * This call will set the id of the workspace named myworkspace into the wsid property:
+ * <pre>
+ * <hlm:blocksGetWorkspaceId wsidoutput="wsid" name="myworkspace"/>
+ * </pre>
+ *
+ * @ant.task name="blocksGetWorkspaceId" category="Blocks"
+ */
+public class GetWorkspaceIdTask extends AbstractBlocksTask {
+
+ private File dir;
+ private String name;
+ private String wsidoutput;
+
+ /**
+ * The directory to get the wsid.
+ * @param dir the directory
+ * @ant.not-required
+ */
+ public void setDir(File dir) {
+ this.dir = dir;
+ }
+
+ /**
+ * The name of the workspace to get the wsid.
+ * @param name the name of a workspace
+ * @ant.not-required
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * The name of the output property.
+ * @param wsidoutput
+ * @ant.required
+ */
+ public void setWsidoutput(String wsidoutput) {
+ this.wsidoutput = wsidoutput;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void execute() {
+ if ((dir == null && name == null) || (dir != null && name != null)) {
+ throw new BuildException("You must define either name or dir attribute");
+ }
+
+ Workspace fw = null;
+ try {
+ File realDir = getRealDir();
+ for (Workspace workspace : getBlocks().listWorkspaces()) {
+ if (workspace.getLocation().getCanonicalFile().equals(realDir) || workspace.getName().equals(name)) {
+ fw = workspace;
+ break;
+ }
+ }
+ if (fw != null) {
+ log("Found matching workspace: " + fw.getWsid());
+ if (wsidoutput != null) {
+ log("Setting property " + wsidoutput);
+ getProject().setNewProperty(wsidoutput, "" + fw.getWsid());
+ }
+ }
+ } catch (BlocksException exc) {
+ throw new BuildException(exc);
+ } catch (IOException exc) {
+ throw new BuildException(exc);
+ }
+ }
+
+ /**
+ * Solve subst drives on windows.
+ * @return the realpath.
+ * @throws IOException
+ */
+ protected File getRealDir() throws IOException {
+ if (Os.isFamily(Os.FAMILY_WINDOWS) && dir != null) {
+ Subst subst = new Subst();
+ log("Real path: " + subst.getRealPath(dir).getCanonicalFile());
+ return subst.getRealPath(dir).getCanonicalFile();
+ }
+ return dir != null ? dir.getCanonicalFile() : null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/taskdefs/InstallBundleTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,188 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.taskdefs;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.PatternSet;
+
+import com.nokia.helium.blocks.Blocks;
+import com.nokia.helium.blocks.BlocksException;
+import com.nokia.helium.blocks.Group;
+import com.nokia.helium.blocks.ant.AbstractBlocksTask;
+
+/**
+ * Installing a bundle under a workspace.
+ *
+ * The bundle "my-bundle-name" will be installed under the workspace 1:
+ * <pre>
+ * <hlm:blocksInstallBundle wsid="1" bundle="my-bundle-name" />
+ * </pre>
+ *
+ * The bundles matching the "my-bundle-name.*" pattern will be installed under the workspace 1:
+ * <pre>
+ * <hlm:blocksInstallBundle wsid="1">
+ * <bundleFilterSet>
+ * <include name="my-bundle-name.*" />
+ * <include name=".*src.*" />
+ * </bundleFilterSet>
+ * </hlm:blocksInstallBundle>
+ * </pre>
+ *
+ * The groups matching the ".*bin.*" pattern will be installed under the workspace 1:
+ * <pre>
+ * <hlm:blocksInstallBundle wsid="1">
+ * <groupFilterSet>
+ * <include name=".*bin.*" />
+ * </groupFilterSet>
+ * </hlm:blocksInstallBundle>
+ * </pre>
+ *
+ * bundleFilterSet and groupFilterSet are regular patternset, so any reference to patternset
+ * will be working:
+ * <pre>
+ * <patternset id="my.patternset" />
+ * ...
+ * <groupFilterSet refid="my.patternset" />
+ * ...
+ * </pre>
+ *
+ * @ant.task name="blocksInstallBundle" category="Blocks"
+ */
+public class InstallBundleTask extends AbstractBlocksTask {
+ private String group;
+ private String bundle;
+ private List<PatternSet> bundlePatternSets = new ArrayList<PatternSet>();
+ private List<PatternSet> groupPatternSets = new ArrayList<PatternSet>();
+
+ protected void validate() {
+ if ((bundle != null && (!bundlePatternSets.isEmpty() || group != null || !groupPatternSets.isEmpty()))
+ || (group != null && (!bundlePatternSets.isEmpty() || bundle != null || !groupPatternSets.isEmpty()))
+ || (!bundlePatternSets.isEmpty() && (group != null || bundle != null || !groupPatternSets.isEmpty()))
+ || (!groupPatternSets.isEmpty() && (group != null || bundle != null || !bundlePatternSets.isEmpty()))
+ || (bundle == null && bundlePatternSets.isEmpty() && group == null && groupPatternSets.isEmpty())) {
+ throw new BuildException("You can either use the bundle attribute or the group attribute or use nested groupfilterset or bundlefilterset.");
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void execute() {
+ validate();
+ try {
+ if (bundle != null) {
+ log("Installing bundle " + bundle + " under workspace " + this.getWsid() + ".");
+ getBlocks().installBundle(this.getWsid(), bundle);
+ } else if (!bundlePatternSets.isEmpty()) {
+ for (String bundle : getBlocks().search(this.getWsid(), Blocks.SEARCH_ALL_BUNDLES_EXPRESSION)) {
+ if (shouldInstall(bundlePatternSets, bundle)) {
+ log("Installing " + bundle + " under workspace " + this.getWsid() + ".");
+ getBlocks().installBundle(this.getWsid(), bundle);
+ } else {
+ log("Skipping bundle " + bundle, Project.MSG_DEBUG);
+ }
+ }
+ } else if (group != null) {
+ log("Installing group " + group + " under workspace " + this.getWsid() + ".");
+ getBlocks().installGroup(this.getWsid(), group);
+ } else if (!groupPatternSets.isEmpty()) {
+ for (Group group : getBlocks().listGroup(this.getWsid())) {
+ if (shouldInstall(groupPatternSets, group.getName())) {
+ log("Installing group " + group.getName() + " under workspace " + this.getWsid() + ".");
+ getBlocks().installGroup(this.getWsid(), group.getName());
+ } else {
+ log("Skipping group " + bundle, Project.MSG_DEBUG);
+ }
+ }
+ }
+ } catch (BlocksException e) {
+ throw new BuildException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Defines the bundle name to install.
+ * @param bundle
+ * @ant.required
+ */
+ public void setBundle(String bundle) {
+ this.bundle = bundle;
+ }
+
+ /**
+ * Defines the bundle name to install.
+ * @param bundle
+ * @ant.required
+ */
+ public void setGroup(String group) {
+ this.group = group;
+ }
+
+ /**
+ * Add a nested patternset. Then bundle attribute cannot be used.
+ * @param patternSet
+ */
+ public PatternSet createBundleFilterSet() {
+ PatternSet patternSet = new PatternSet();
+ bundlePatternSets.add(patternSet);
+ return patternSet;
+ }
+
+ /**
+ * Add a nested patternset. Then bundle attribute cannot be used.
+ * @param patternSet
+ */
+ public PatternSet createGroupFilterSet() {
+ PatternSet patternSet = new PatternSet();
+ groupPatternSets.add(patternSet);
+ return patternSet;
+ }
+
+ /**
+ * Should the bundle be installed based on the patternsets config.
+ * @param patternSets a list of patternset elements
+ * @param name the name to validate
+ * @return
+ */
+ protected boolean shouldInstall(List<PatternSet> patternSets, String name) {
+ int includes = 0;
+ for (PatternSet patternSet : patternSets) {
+ if (patternSet.getExcludePatterns(getProject()) != null) {
+ for (String pattern : patternSet.getExcludePatterns(getProject())) {
+ if (Pattern.matches(pattern, name)) {
+ return false;
+ }
+ }
+ }
+ if (patternSet.getIncludePatterns(getProject()) != null) {
+ for (String pattern : patternSet.getIncludePatterns(getProject())) {
+ includes ++;
+ if (Pattern.matches(pattern, name)) {
+ return true;
+ }
+ }
+ }
+ }
+ return includes == 0;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/taskdefs/RemoveRepoTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.helium.blocks.BlocksException;
+import com.nokia.helium.blocks.ant.AbstractBlocksTask;
+
+/**
+ * Remove a repository from a workspace.
+ *
+ * The repository named "my-repository-name" will be removed from workspace 1:
+ * <pre>
+ * <hlm:blocksRemoveRepository wsid="1" name="my-repository-name" />
+ * </pre>
+
+ * The repository 1 will be removed from workspace 1:
+ * <pre>
+ * <hlm:blocksRemoveRepository wsid="1" repositoryId="1" />
+ * </pre>
+ *
+ * @ant.task name="blocksRemoveRepository" category="Blocks"
+ */
+public class RemoveRepoTask extends AbstractBlocksTask {
+ private Integer repositoryId;
+ private String name;
+
+ /**
+ * Remove the repository using its id.
+ * workspace.
+ * @param repositoryId the repository id
+ * @ant.required
+ */
+ public void setRepositoryId(Integer repositoryId) {
+ this.repositoryId = repositoryId;
+ }
+
+ /**
+ * Remove the repository using its name.
+ * workspace.
+ * @param name the repository name
+ * @ant.not-required
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void execute() {
+ if (repositoryId == null && name == null) {
+ throw new BuildException("Either 'repositoryId' or 'name' attribute must be defined.");
+ }
+ if (repositoryId != null && name != null) {
+ throw new BuildException("'repositoryId' and 'name' attribute cannot be defined at the same time.");
+ }
+ try {
+ if (name != null) {
+ getBlocks().removeRepository(getWsid(), name);
+ log("The repository " + name + " has been removed successfully from workspace " + getWsid() + ".");
+ } else {
+ getBlocks().removeRepository(getWsid(), repositoryId.intValue());
+ log("The repository " + repositoryId + " has been removed successfully from workspace " + getWsid() + ".");
+ }
+ } catch (BlocksException e) {
+ throw new BuildException(e.getMessage(), e);
+ }
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/taskdefs/RemoveWorkspaceTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.helium.blocks.BlocksException;
+import com.nokia.helium.blocks.ant.AbstractBlocksTask;
+
+/**
+ * Remove a Blocks workspace.
+ *
+ * The workspace 1 will be removed:
+ * <pre>
+ * <hlm:blocksRemoveWorkspace wsid="1" />
+ * </pre>
+ *
+ * @ant.task name="blocksRemoveWorkspace" category="Blocks"
+ */
+public class RemoveWorkspaceTask extends AbstractBlocksTask {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void execute() {
+ try {
+ getBlocks().removeWorkspace(getWsid());
+ log("Workspace " + getWsid() + " removed successfully.");
+ } catch (BlocksException e) {
+ throw new BuildException(e);
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/taskdefs/UpdateTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.taskdefs;
+
+import org.apache.tools.ant.BuildException;
+
+import com.nokia.helium.blocks.BlocksException;
+import com.nokia.helium.blocks.ant.AbstractBlocksTask;
+
+/**
+ * Updating a workspace content.
+ *
+ * This call will update the workspace "1":
+ * <pre>
+ * <hlm:blocksUpdate wsid="1" />
+ * </pre>
+ *
+ * @ant.task name="blocksUpdate" category="Blocks"
+ */
+public class UpdateTask extends AbstractBlocksTask {
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void execute() {
+ try {
+ log("Updating workspace " + getWsid() + ".");
+ getBlocks().update(getWsid());
+ log("Workspace " + getWsid() + " updated successfully.");
+ } catch (BlocksException exc) {
+ throw new BuildException(exc);
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/src/com/nokia/helium/blocks/ant/types/RepositorySet.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,102 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.ant.types;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * Ant type holding a set of repository definitions.
+ *
+ * Example of use:
+ * <pre>
+ * <hlm:blocksRepositorySet id="my.repo.list.ref.id" >
+ * <repository name="repo1" url="file:e:/repo1"/>
+ * <repository name="repo2" url="file:e:/repo2"/>
+ * </hlm:blocksRepositorySet>
+ * </pre>
+ *
+ * @ant.type name="blocksRepositorySet" category="Blocks"
+ */
+public class RepositorySet extends DataType {
+
+ private List<Repository> repositories = new ArrayList<Repository>();
+
+ /**
+ * Element representing a repository definition.
+ *
+ */
+ public class Repository extends ProjectComponent {
+ private String name;
+ private String url;
+
+ /**
+ * The name of the repository.
+ * @param name
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * The location of the repository.
+ * @param name
+ */
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+ }
+
+ /**
+ * Create a nested repository element.
+ * @return
+ */
+ public Repository createRepository() {
+ Repository repo = new Repository();
+ repositories.add(repo);
+ return repo;
+ }
+
+ /**
+ * Get the list of repository definitions.
+ * @return
+ */
+ public List<Repository> getRepositories() {
+ if (this.isReference()) {
+ if (this.getRefid().getReferencedObject() instanceof RepositorySet) {
+ return ((RepositorySet)this.getRefid().getReferencedObject()).getRepositories();
+ } else {
+ throw new BuildException("The type referenced by " +
+ this.getRefid().getRefId() + " is not of RepositorySet type.");
+ }
+ } else {
+ return this.repositories;
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/antunits/test_blocks.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_blocks.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-blocks-unittest" xmlns:hlm="http://www.nokia.com/helium" xmlns:au="antlib:org.apache.ant.antunit">
+ <description>Helium Antlib blocks unittests.</description>
+
+ <target name="setUp">
+ <tstamp>
+ <format property="tstamp" pattern="yyyyMMddHHmmssSSS" locale="en,UK" />
+ </tstamp>
+ <mkdir dir="${test.temp.dir}" />
+ <delete file="${test.temp.dir}" />
+ <mkdir dir="${test.temp.dir}" />
+ </target>
+
+ <target name="tearDown">
+ <delete dir="${test.temp.dir}" />
+ </target>
+
+ <target name="is-blocks-available">
+ <exec executable="blocks.bat" resultproperty="blocks.result" failifexecutionfails="false" osfamily="windows" />
+ <exec executable="blocks" resultproperty="blocks.result" failifexecutionfails="false" osfamily="unix" />
+ <condition property="execute.test" value="true">
+ <equals arg1="${blocks.result}" arg2="0" />
+ </condition>
+ <echo>execute.test: ${execute.test}</echo>
+ </target>
+
+ <target name="test-addworkspace" depends="is-blocks-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/workspace-addworkspace" />
+ <hlm:blocksAddWorkspace name="unittest-addworkspace-${tstamp}" dir="${test.temp.dir}/workspace-addworkspace" wsidproperty="wsid" />
+ <hlm:blocksRemoveWorkspace wsid="${wsid}" />
+ </target>
+
+ <target name="test-workspace-cond-dir" depends="is-blocks-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/workspace-workspacecond" />
+ <hlm:blocksAddWorkspace name="workspace-workspacecond-${tstamp}" dir="${test.temp.dir}/workspace-workspacecond" wsidproperty="wsid" />
+ <au:assertTrue>
+ <hlm:blocksWorkspaceExists dir="${test.temp.dir}/workspace-workspacecond" />
+ </au:assertTrue>
+ <hlm:blocksRemoveWorkspace wsid="${wsid}" />
+ </target>
+
+ <target name="test-workspace-cond-name" depends="is-blocks-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/workspace-workspacecond" />
+ <hlm:blocksAddWorkspace name="workspace-workspacecond-${tstamp}" dir="${test.temp.dir}/workspace-workspacecond" wsidproperty="wsid" />
+ <au:assertTrue>
+ <hlm:blocksWorkspaceExists name="workspace-workspacecond-${tstamp}" />
+ </au:assertTrue>
+ <hlm:blocksRemoveWorkspace wsid="${wsid}" />
+ </target>
+
+ <target name="test-workspace-cond-not-workspace-dir" depends="is-blocks-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/workspace-workspacecond" />
+ <au:assertTrue>
+ <not>
+ <hlm:blocksWorkspaceExists dir="${test.temp.dir}/workspace-workspacecond" />
+ </not>
+ </au:assertTrue>
+ </target>
+
+ <target name="test-workspace-cond-not-workspace-name" depends="is-blocks-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/workspace-workspacecond" />
+ <au:assertTrue>
+ <not>
+ <hlm:blocksWorkspaceExists name="workspacecond" />
+ </not>
+ </au:assertTrue>
+ </target>
+
+ <target name="test-workspace-get-workspace-id-no-args" depends="is-blocks-available" if="execute.test">
+ <au:expectfailure message="You must define either name or dir attribute">
+ <hlm:blocksGetWorkspaceId />
+ </au:expectfailure>
+ </target>
+
+ <target name="test-workspace-get-workspace-id-both-args" depends="is-blocks-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/workspace-addworkspace" />
+ <au:expectfailure message="You must define either name or dir attribute">
+ <hlm:blocksGetWorkspaceId name="some-invalid-name" dir="${test.temp.dir}/workspace-addworkspace"/>
+ </au:expectfailure>
+ </target>
+
+ <target name="test-workspace-get-workspace-name" depends="is-blocks-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/workspace-workspacecond" />
+ <hlm:blocksAddWorkspace name="workspace-workspacecond-${tstamp}" dir="${test.temp.dir}/workspace-workspacecond" wsidproperty="wsid" />
+ <hlm:blocksGetWorkspaceId name="workspace-workspacecond-${tstamp}" wsidoutput="get.wsid"/>
+ <hlm:blocksRemoveWorkspace wsid="${wsid}" />
+ <au:assertTrue>
+ <equals arg1="${get.wsid}" arg2="${wsid}" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-workspace-get-workspace-dir" depends="is-blocks-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/workspace-workspacecond" />
+ <hlm:blocksAddWorkspace name="workspace-workspacecond-${tstamp}" dir="${test.temp.dir}/workspace-workspacecond" wsidproperty="wsid" />
+ <hlm:blocksGetWorkspaceId dir="${test.temp.dir}/workspace-workspacecond" wsidoutput="get.wsid"/>
+ <hlm:blocksRemoveWorkspace wsid="${wsid}" />
+ <au:assertTrue>
+ <equals arg1="${get.wsid}" arg2="${wsid}" />
+ </au:assertTrue>
+ </target>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/antunits/test_blocks_bundles.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_blocks.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-blocks-bundles-unittest" xmlns:hlm="http://www.nokia.com/helium" xmlns:au="antlib:org.apache.ant.antunit"
+ xmlns:ac="antlib:net.sf.antcontrib">
+ <description>Helium Antlib blocks unittests.</description>
+
+ <property name="workspace" location="${test.temp.dir}/workspace" />
+ <property name="repo" location="${test.temp.dir}/repo" />
+
+ <target name="setUp">
+ <tstamp>
+ <format property="tstamp" pattern="yyyyMMddHHmmssSSS" locale="en,UK" />
+ </tstamp>
+ <mkdir dir="${test.temp.dir}" />
+ <delete file="${test.temp.dir}" />
+ <mkdir dir="${test.temp.dir}" />
+ <mkdir dir="${workspace}" />
+ <mkdir dir="${repo}" />
+
+ <exec executable="blocks.bat" resultproperty="blocks.result" failifexecutionfails="false" osfamily="windows" />
+ <exec executable="blocks" resultproperty="blocks.result" failifexecutionfails="false" osfamily="unix" />
+ <condition property="execute.test" value="true">
+ <equals arg1="${blocks.result}" arg2="0" />
+ </condition>
+ <echo>execute.test: ${execute.test}</echo>
+ <ac:if>
+ <istrue value="${execute.test}" />
+ <then>
+ <hlm:blocksAddWorkspace name="unittest-addworkspace-${tstamp}" dir="${workspace}"
+ wsidproperty="wsid" />
+ <copy todir="${workspace}">
+ <fileset dir="../" includes="src/**" />
+ </copy>
+ <mkdir dir="${workspace}/epoc32" />
+ <copy todir="${workspace}/epoc32">
+ <fileset dir="../" includes="src/**" />
+ </copy>
+ <exec executable="bundle.bat" dir="${workspace}" osfamily="windows">
+ <arg line="create-xml -n blocks -v 1.0" />
+ <arg value="--source=${workspace}/src" />
+ <arg value="--target=${workspace}/epoc32" />
+ <arg value="${test.temp.dir}/blocks.xml" />
+ </exec>
+ <exec executable="bundle.bat" dir="${workspace}" osfamily="windows">
+ <arg line="create" />
+ <arg line="-o ${repo}" />
+ <arg value="${test.temp.dir}/blocks.xml" />
+ </exec>
+ <hlm:blocksCreateRepositoryIndex dest="${repo}" verbose="true" />
+ <hlm:blocksAddRepository wsid="${wsid}" name="repo" url="file:${repo}" />
+ <delete dir="${workspace}/src" />
+ <delete dir="${workspace}/epoc32" />
+ </then>
+ </ac:if>
+ </target>
+
+ <target name="tearDown">
+ <ac:if>
+ <isset property="execute.test" />
+ <then>
+ <hlm:blocksRemoveWorkspace wsid="${wsid}" />
+ </then>
+ </ac:if>
+ <delete dir="${workspace}" />
+ </target>
+
+ <target name="test-bundle-install-fail-wsid-not-defined" if="execute.test">
+ <au:expectfailure expectedMessage="wsid has not been specified.">
+ <hlm:blocksInstallBundle bundle="name" />
+ </au:expectfailure>
+ </target>
+
+ <target name="test-bundle-install-fail-bundle-not-defined" if="execute.test">
+ <au:expectfailure expectedMessage="You can either use the bundle attribute or the group attribute or use nested groupfilterset or bundlefilterset.">
+ <hlm:blocksInstallBundle wsid="${wsid}" />
+ </au:expectfailure>
+ </target>
+
+ <target name="test-bundle-install-fail-bundle-and-patternset-defined" if="execute.test">
+ <au:expectfailure expectedMessage="You can either use the bundle attribute or the group attribute or use nested groupfilterset or bundlefilterset.">
+ <hlm:blocksInstallBundle wsid="${wsid}" bundle="bundle">
+ <bundleFilterSet>
+ <include name=".*" />
+ </bundleFilterSet>
+ </hlm:blocksInstallBundle>
+ </au:expectfailure>
+ </target>
+
+ <target name="test-blocks-single-bundle-install" if="execute.test">
+ <au:assertFileDoesntExist file="${workspace}/epoc32" />
+ <hlm:blocksInstallBundle wsid="${wsid}" bundle="blocks.extras" />
+ <au:assertFileExists file="${workspace}/epoc32" />
+ </target>
+
+ <target name="test-blocks-single-invalid-bundle-install" if="execute.test">
+ <au:expectfailure message="External process error: apt-get failed">
+ <hlm:blocksInstallBundle wsid="${wsid}" bundle="blocks.invalid.bundle" />
+ </au:expectfailure>
+ </target>
+
+ <target name="test-blocks-single-bundle-install-all" if="execute.test">
+ <au:assertFileDoesntExist file="${workspace}/src" />
+ <au:assertFileDoesntExist file="${workspace}/epoc32" />
+ <hlm:blocksInstallBundle wsid="${wsid}">
+ <bundleFilterSet>
+ <include name=".*" />
+ </bundleFilterSet>
+ </hlm:blocksInstallBundle>
+ <au:assertFileExists file="${workspace}/src" />
+ <au:assertFileExists file="${workspace}/epoc32" />
+ </target>
+
+ <target name="test-blocks-single-bundle-install-exclude" if="execute.test">
+ <au:assertFileDoesntExist file="${workspace}/src" />
+ <au:assertFileDoesntExist file="${workspace}/epoc32" />
+ <hlm:blocksInstallBundle wsid="${wsid}">
+ <bundleFilterSet>
+ <exclude name=".*extra.*" />
+ </bundleFilterSet>
+ </hlm:blocksInstallBundle>
+ <au:assertFileExists file="${workspace}/src" />
+ <au:assertFileDoesntExist file="${workspace}/epoc32" />
+ </target>
+
+ <target name="test-blocks-single-group-install" if="execute.test">
+ <au:assertFileDoesntExist file="${workspace}/src" />
+ <au:assertFileDoesntExist file="${workspace}/epoc32" />
+ <hlm:blocksInstallBundle wsid="${wsid}" group="Sources" />
+ <au:assertFileExists file="${workspace}/src" />
+ <au:assertFileDoesntExist file="${workspace}/epoc32" />
+ </target>
+
+ <target name="test-blocks-filter-group-install" if="execute.test">
+ <au:assertFileDoesntExist file="${workspace}/src" />
+ <au:assertFileDoesntExist file="${workspace}/epoc32" />
+ <hlm:blocksInstallBundle wsid="${wsid}">
+ <groupFilterSet>
+ <include name="Source.*" />
+ </groupFilterSet>
+ </hlm:blocksInstallBundle>
+ <au:assertFileExists file="${workspace}/src" />
+ <au:assertFileDoesntExist file="${workspace}/epoc32" />
+ </target>
+
+ <target name="test-blocks-update-workspace" if="execute.test">
+ <hlm:blocksInstallBundle wsid="${wsid}" group="Sources" />
+ <hlm:blocksUpdate wsid="${wsid}" verbose="true" />
+ <au:assertLogContains text="Updating workspace " />
+ <au:assertLogContains text="updated successfully." />
+ <au:assertLogContains text="Reading package lists..." />
+ </target>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/antunits/test_blocks_repo.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_blocks_repo.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-blocks-repo-unittest" xmlns:hlm="http://www.nokia.com/helium" xmlns:au="antlib:org.apache.ant.antunit"
+ xmlns:ac="antlib:net.sf.antcontrib">
+ <description>Helium blocks repository unittests.</description>
+
+ <property name="workspace" location="${test.temp.dir}/workspace" />
+ <property name="repo" location="${test.temp.dir}/repo" />
+
+ <target name="setUp">
+ <tstamp>
+ <format property="tstamp" pattern="yyyyMMddHHmmssSSS" locale="en,UK" />
+ </tstamp>
+ <mkdir dir="${test.temp.dir}" />
+ <delete file="${test.temp.dir}" />
+ <mkdir dir="${test.temp.dir}" />
+ <mkdir dir="${workspace}" />
+ <mkdir dir="${repo}" />
+
+ <exec executable="blocks.bat" resultproperty="blocks.result" failifexecutionfails="false" osfamily="windows" />
+ <exec executable="blocks" resultproperty="blocks.result" failifexecutionfails="false" osfamily="unix" />
+ <condition property="execute.test" value="true">
+ <equals arg1="${blocks.result}" arg2="0" />
+ </condition>
+ <echo>execute.test: ${execute.test}</echo>
+ <ac:if>
+ <istrue value="${execute.test}" />
+ <then>
+ <hlm:blocksAddWorkspace name="unittest-addworkspace-${tstamp}" dir="${workspace}"
+ wsidproperty="wsid" />
+ <copy todir="${workspace}">
+ <fileset dir="../" includes="src/**" />
+ </copy>
+ <mkdir dir="${workspace}/epoc32" />
+ <copy todir="${workspace}/epoc32">
+ <fileset dir="../" includes="src/**" />
+ </copy>
+ <exec executable="bundle.bat" dir="${workspace}" osfamily="windows">
+ <arg line="create-xml -n blocks -v 1.0" />
+ <arg value="--source=${workspace}/src" />
+ <arg value="--target=${workspace}/epoc32" />
+ <arg value="${test.temp.dir}/blocks.xml" />
+ </exec>
+ <exec executable="bundle.bat" dir="${workspace}" osfamily="windows">
+ <arg line="create" />
+ <arg line="-o ${repo}" />
+ <arg value="${test.temp.dir}/blocks.xml" />
+ </exec>
+ <hlm:blocksCreateRepositoryIndex dest="${repo}" verbose="true" />
+ </then>
+ </ac:if>
+ </target>
+
+ <target name="tearDown">
+ <ac:if>
+ <isset property="execute.test" />
+ <then>
+ <hlm:blocksRemoveWorkspace wsid="${wsid}" />
+ </then>
+ </ac:if>
+ <delete dir="${workspace}" />
+ </target>
+
+ <target name="test-add-repo-fail-if-url-is-not-defined" if="execute.test">
+ <au:expectfailure expectedMessage="'url' attribute has not been defined.">
+ <hlm:blocksAddRepository wsid="${wsid}" />
+ </au:expectfailure>
+ </target>
+
+ <target name="test-add-repo-fail-if-url-is-not-defined-with-name" if="execute.test">
+ <au:expectfailure expectedMessage="'url' attribute has not been defined.">
+ <hlm:blocksAddRepository wsid="${wsid}" name="demo"/>
+ </au:expectfailure>
+ </target>
+
+ <target name="test-add-repo-fail-if-url-defined-with-nested-reposet" if="execute.test">
+ <au:expectfailure expectedMessage="'url' attribute and nested repositorySet element cannot be used at the same time.">
+ <hlm:blocksAddRepository wsid="${wsid}" url="${repo}">
+ <repositorySet />
+ </hlm:blocksAddRepository>
+ </au:expectfailure>
+ </target>
+
+ <target name="test-add-repo-fail-if-nested-reposet-has-invalid-reference-type" if="execute.test">
+ <patternset id="patternset.id" />
+ <au:expectfailure expectedMessage="The type referenced by patternset.id is not of RepositorySet type.">
+ <hlm:blocksAddRepository wsid="${wsid}">
+ <repositorySet refid="patternset.id" />
+ </hlm:blocksAddRepository>
+ </au:expectfailure>
+ </target>
+
+ <target name="test-add-repo-is-working-using-url" if="execute.test">
+ <au:assertFalse message="The workspace should not have any repo allocted yet.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" />
+ </au:assertFalse>
+ <hlm:blocksAddRepository wsid="${wsid}" url="file:${repo}" />
+ <au:assertTrue message="The workspace should have a declared repo.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-add-repo-is-working-using-url-and-name" if="execute.test">
+ <au:assertFalse message="The workspace should not have any repo allocted yet.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" />
+ </au:assertFalse>
+ <hlm:blocksAddRepository wsid="${wsid}" name="demo" url="file:${repo}" />
+ <au:assertTrue message="The workspace should have a declared repo.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" name="demo" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-add-repo-is-working-using-nested-reposet" if="execute.test">
+ <au:assertFalse message="The workspace should not have any repo allocted yet.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" />
+ </au:assertFalse>
+ <hlm:blocksAddRepository wsid="${wsid}">
+ <repositorySet>
+ <repository name="demo" url="file:${repo}" />
+ </repositorySet>
+ </hlm:blocksAddRepository>
+ <au:assertTrue message="The workspace should have a declared repo.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" name="demo" />
+ </au:assertTrue>
+ </target>
+
+ <hlm:blocksRepositorySet id="reposet.id">
+ <repository name="demo" url="file:${repo}" />
+ </hlm:blocksRepositorySet>
+
+ <target name="test-add-repo-is-working-using-nested-reposet-ref" if="execute.test">
+ <au:assertFalse message="The workspace should not have any repo allocted yet.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" />
+ </au:assertFalse>
+ <hlm:blocksAddRepository wsid="${wsid}">
+ <repositorySet refid="reposet.id" />
+ </hlm:blocksAddRepository>
+ <au:assertTrue message="The workspace should have a declared repo.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" name="demo" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-remove-repo-fail-if-repositoryId-is-not-defined" if="execute.test">
+ <au:expectfailure message="'repositoryId' attribute has not been defined.">
+ <hlm:blocksRemoveRepository wsid="${wsid}" />
+ </au:expectfailure>
+ </target>
+
+ <target name="test-remove-repo-fail-if-repositoryId-and-name-are-defined" if="execute.test">
+ <au:expectfailure message="'repositoryId' attribute has not been defined.">
+ <hlm:blocksRemoveRepository wsid="${wsid}" />
+ </au:expectfailure>
+ </target>
+
+ <target name="test-remove-repo-with-repositoryid" if="execute.test">
+ <au:assertFalse message="The workspace should not have any repo allocted yet.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" />
+ </au:assertFalse>
+ <hlm:blocksAddRepository wsid="${wsid}">
+ <repositorySet>
+ <repository name="demo" url="file:${repo}" />
+ </repositorySet>
+ </hlm:blocksAddRepository>
+ <au:assertTrue message="The workspace should have a declared repo.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" name="demo" />
+ </au:assertTrue>
+ <hlm:blocksRemoveRepository wsid="${wsid}" repositoryId="1" />
+ <au:assertFalse message="The workspace should not have any declared repo.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" />
+ </au:assertFalse>
+ </target>
+
+ <target name="test-remove-repo-with-name" if="execute.test">
+ <au:assertFalse message="The workspace should not have any repo allocted yet.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" />
+ </au:assertFalse>
+ <hlm:blocksAddRepository wsid="${wsid}">
+ <repositorySet>
+ <repository name="demo" url="file:${repo}" />
+ </repositorySet>
+ </hlm:blocksAddRepository>
+ <au:assertTrue message="The workspace should have a declared repo.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" name="demo" />
+ </au:assertTrue>
+ <hlm:blocksRemoveRepository wsid="${wsid}" name="demo" />
+ <au:assertFalse message="The workspace should not have a declared repo.">
+ <hlm:blocksRepositoryExists wsid="${wsid}" name="demo" />
+ </au:assertFalse>
+ </target>
+
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/antunits/test_bundle.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_blocks.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-antlib-bundle-unittest" xmlns:hlm="http://www.nokia.com/helium" xmlns:au="antlib:org.apache.ant.antunit">
+ <description>Helium Antlib bundle unittests.</description>
+
+ <target name="setUp">
+ <delete file="${test.temp.dir}" />
+ <mkdir dir="${test.temp.dir}" />
+ </target>
+
+ <target name="tearDown">
+ <delete dir="${test.temp.dir}" />
+ </target>
+
+ <target name="is-bundle-available">
+ <exec executable="bundle.bat" resultproperty="bundle.result" failifexecutionfails="false" osfamily="windows" />
+ <exec executable="bundle" resultproperty="bundle.result" failifexecutionfails="false" osfamily="unix" />
+ <condition property="execute.test" value="true">
+ <equals arg1="${bundle.result}" arg2="0" />
+ </condition>
+ <echo>execute.test: ${execute.test}</echo>
+ </target>
+
+ <target name="test-nonsign-invalid-debs" depends="is-bundle-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/repo" />
+ <copy todir="${test.temp.dir}/repo">
+ <fileset dir="${ant.file.helium-antlib-bundle-unittest}/../../data" includes="invalid*.deb"/>
+ </copy>
+ <au:expectfailure>
+ <hlm:blocksCreateRepositoryIndex dest="${test.temp.dir}/repo" verbose="true" />
+ </au:expectfailure>
+ <au:assertFileExists file="${test.temp.dir}/repo/Packages" />
+ </target>
+
+ <target name="test-nonsign-invalid-debs-failonerror-false" depends="is-bundle-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/repo" />
+ <copy todir="${test.temp.dir}/repo">
+ <fileset dir="${ant.file.helium-antlib-bundle-unittest}/../../data" includes="invalid*.deb"/>
+ </copy>
+ <hlm:blocksCreateRepositoryIndex dest="${test.temp.dir}/repo" verbose="true" failonerror="false" />
+ <au:assertFileExists file="${test.temp.dir}/repo/Packages" />
+ </target>
+
+ <target name="test-nonsign-empty" depends="is-bundle-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/repo" />
+ <hlm:blocksCreateRepositoryIndex dest="${test.temp.dir}/repo" verbose="true" />
+ <au:assertFileExists file="${test.temp.dir}/repo/Packages" />
+ </target>
+
+ <target name="test-noargs" depends="is-bundle-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/repo" />
+ <au:expectfailure message="'dest' attribute must be defined.">
+ <hlm:blocksCreateRepositoryIndex />
+ </au:expectfailure>
+ <au:assertFileDoesntExist file="${test.temp.dir}/repo/Packages" />
+ </target>
+
+ <target name="test-nonsign-valid-debs" depends="is-bundle-available" if="execute.test">
+ <mkdir dir="${test.temp.dir}/repo" />
+ <copy todir="${test.temp.dir}/repo">
+ <fileset dir="${ant.file.helium-antlib-bundle-unittest}/../../data" includes="demo*.deb"/>
+ </copy>
+ <hlm:blocksCreateRepositoryIndex dest="${test.temp.dir}/repo" verbose="true" />
+ <au:assertFileExists file="${test.temp.dir}/repo/Packages" />
+ </target>
+
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/bld.sh Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+#
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+if [ -f ~/.bashrc ] ; then
+ . ~/.bashrc
+fi
+
+ant $*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/build.bat Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,33 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+set OLDANT_ARGS=-lib %CD%\..\lib -lib %ANT_LIB_HOME%\lib -lib %ANT_LIB_HOME%\bin\helium-core.jar -lib %CD%\..\..\bin\helium-blocks.jar -lib %ANT_LIB_HOME%\antlibs
+call ant %*
+if "%ERRORLEVEL%" neq "0" (goto error)
+endlocal
+goto :eof
+
+:error
+endlocal
+if "%OS%"=="Windows_NT" color 00
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="helium-blocks" xmlns:au="antlib:org.apache.ant.antunit">
+ <description>Helium Antlib blocks tests.</description>
+ <taskdef resource="com/nokia/helium/blocks/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+ <import file="${builder.dir}/java/test-macros.ant.xml"/>
+
+</project>
Binary file buildframework/helium/sf/java/blocks/tests/data/demo.src_1.0-1.deb has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/data/invalid1.deb Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1 @@
+1
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/data/invalid2.deb Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1 @@
+1
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/hlm_debug.log Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,3569 @@
+11:02:26,198 DEBUG - Execution of blocks returned: 0
+11:02:26,229 DEBUG - Execution of subst returned: 0
+11:02:26,244 DEBUG - Execution of subst returned: 0
+11:02:26,666 DEBUG - Execution of blocks returned: 0
+11:02:27,119 DEBUG - Execution of blocks returned: 0
+11:02:27,932 DEBUG - Execution of blocks returned: 0
+11:02:28,744 DEBUG - Execution of blocks returned: 0
+11:02:29,151 DEBUG - Execution of blocks returned: 0
+11:02:29,166 DEBUG - Execution of subst returned: 0
+11:02:29,197 DEBUG - Execution of subst returned: 0
+11:02:29,213 DEBUG - Execution of subst returned: 0
+11:02:29,244 DEBUG - Execution of subst returned: 0
+11:02:29,260 DEBUG - Execution of subst returned: 0
+11:02:29,291 DEBUG - Execution of subst returned: 0
+11:02:29,307 DEBUG - Execution of subst returned: 0
+11:02:29,338 DEBUG - Execution of subst returned: 0
+11:02:29,354 DEBUG - Execution of subst returned: 0
+11:02:29,385 DEBUG - Execution of subst returned: 0
+11:02:29,807 DEBUG - Execution of blocks returned: 0
+11:02:30,619 DEBUG - Execution of blocks returned: 0
+11:02:30,635 DEBUG - Execution of subst returned: 0
+11:02:30,666 DEBUG - Execution of subst returned: 0
+11:02:30,682 DEBUG - Execution of subst returned: 0
+11:02:30,713 DEBUG - Execution of subst returned: 0
+11:02:30,729 DEBUG - Execution of subst returned: 0
+11:02:30,760 DEBUG - Execution of subst returned: 0
+11:02:30,776 DEBUG - Execution of subst returned: 0
+11:02:30,807 DEBUG - Execution of subst returned: 0
+11:02:31,619 DEBUG - Execution of blocks returned: 0
+11:02:32,041 DEBUG - Execution of blocks returned: 0
+11:02:33,275 DEBUG - Execution of blocks returned: 0
+11:02:33,682 DEBUG - Execution of blocks returned: 0
+11:02:34,104 DEBUG - Execution of blocks returned: 0
+11:02:34,916 DEBUG - Execution of blocks returned: 0
+11:02:35,322 DEBUG - Execution of blocks returned: 0
+11:02:35,744 DEBUG - Execution of blocks returned: 0
+11:02:37,057 DEBUG - Execution of blocks returned: 0
+11:02:40,275 DEBUG - Execution of bundle returned: 0
+11:02:41,681 DEBUG - Execution of blocks returned: 0
+11:02:42,103 DEBUG - Execution of blocks returned: 0
+11:02:42,931 DEBUG - Execution of blocks returned: 0
+11:02:45,322 DEBUG - Execution of bundle returned: 0
+11:02:46,353 DEBUG - Execution of blocks returned: 0
+11:02:47,416 DEBUG - Execution of blocks returned: 0
+11:02:50,369 DEBUG - Execution of blocks returned: 0
+11:02:52,931 DEBUG - Execution of blocks returned: 0
+11:02:53,353 DEBUG - Execution of blocks returned: 0
+11:02:54,181 DEBUG - Execution of blocks returned: 0
+11:02:56,556 DEBUG - Execution of bundle returned: 0
+11:02:57,587 DEBUG - Execution of blocks returned: 0
+11:02:58,368 DEBUG - External process error: apt-get failed with error code 100
+11:02:58,493 DEBUG - Execution of blocks returned: 1
+11:02:58,915 DEBUG - Execution of blocks returned: 0
+11:02:59,728 DEBUG - Execution of blocks returned: 0
+11:03:02,118 DEBUG - Execution of bundle returned: 0
+11:03:03,149 DEBUG - Execution of blocks returned: 0
+11:03:05,774 DEBUG - Execution of blocks returned: 0
+11:03:06,696 DEBUG - Execution of blocks returned: 0
+11:03:07,118 DEBUG - Execution of blocks returned: 0
+11:03:07,946 DEBUG - Execution of blocks returned: 0
+11:03:10,383 DEBUG - Execution of bundle returned: 0
+11:03:11,415 DEBUG - Execution of blocks returned: 0
+11:03:11,836 DEBUG - Execution of blocks returned: 0
+11:03:12,665 DEBUG - Execution of blocks returned: 0
+11:03:15,055 DEBUG - Execution of bundle returned: 0
+11:03:16,086 DEBUG - Execution of blocks returned: 0
+11:03:16,977 DEBUG - Execution of blocks returned: 0
+11:03:19,586 DEBUG - Execution of blocks returned: 0
+11:03:20,008 DEBUG - Execution of blocks returned: 0
+11:03:20,852 DEBUG - Execution of blocks returned: 0
+11:03:23,242 DEBUG - Execution of bundle returned: 0
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:24,148 DEBUG - self.doRollover()
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:24,148 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:24,148 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:24,148 DEBUG - if self.shouldRollover(record):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:24,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Error in atexit._run_exitfuncs:
+11:03:24,148 DEBUG - Traceback (most recent call last):
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:24,148 DEBUG - func(*targs, **kargs)
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:24,148 DEBUG - h.flush()
+11:03:24,148 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:24,148 DEBUG - self.stream.flush()
+11:03:24,148 DEBUG - ValueError: I/O operation on closed file
+11:03:24,148 DEBUG - Error in sys.exitfunc:
+11:03:24,164 DEBUG - Traceback (most recent call last):
+11:03:24,164 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:24,164 DEBUG - func(*targs, **kargs)
+11:03:24,164 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:24,164 DEBUG - h.flush()
+11:03:24,164 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:24,164 DEBUG - self.stream.flush()
+11:03:24,164 DEBUG - ValueError: I/O operation on closed file
+11:03:24,273 DEBUG - Execution of blocks returned: 0
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:25,039 DEBUG - self.doRollover()
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:25,039 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:25,039 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:25,039 DEBUG - if self.shouldRollover(record):
+11:03:25,039 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:25,039 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:25,039 DEBUG - ValueError: I/O operation on closed file
+11:03:25,039 DEBUG - Error in atexit._run_exitfuncs:
+11:03:25,039 DEBUG - Traceback (most recent call last):
+11:03:25,070 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:25,070 DEBUG - func(*targs, **kargs)
+11:03:25,070 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:25,070 DEBUG - h.flush()
+11:03:25,070 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:25,070 DEBUG - self.stream.flush()
+11:03:25,070 DEBUG - ValueError: I/O operation on closed file
+11:03:25,070 DEBUG - Error in sys.exitfunc:
+11:03:25,070 DEBUG - Traceback (most recent call last):
+11:03:25,070 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:25,070 DEBUG - func(*targs, **kargs)
+11:03:25,070 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:25,070 DEBUG - h.flush()
+11:03:25,070 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:25,070 DEBUG - self.stream.flush()
+11:03:25,070 DEBUG - ValueError: I/O operation on closed file
+11:03:25,180 DEBUG - Execution of blocks returned: 0
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:27,617 DEBUG - self.doRollover()
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:27,617 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:27,617 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,617 DEBUG - if self.shouldRollover(record):
+11:03:27,617 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,617 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,617 DEBUG - ValueError: I/O operation on closed file
+11:03:27,617 DEBUG - Traceback (most recent call last):
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,648 DEBUG - if self.shouldRollover(record):
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,648 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,648 DEBUG - ValueError: I/O operation on closed file
+11:03:27,648 DEBUG - Traceback (most recent call last):
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:27,648 DEBUG - if self.shouldRollover(record):
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:27,648 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:27,648 DEBUG - ValueError: I/O operation on closed file
+11:03:27,648 DEBUG - Error in atexit._run_exitfuncs:
+11:03:27,648 DEBUG - Traceback (most recent call last):
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:27,648 DEBUG - func(*targs, **kargs)
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:27,648 DEBUG - h.flush()
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:27,648 DEBUG - self.stream.flush()
+11:03:27,648 DEBUG - ValueError: I/O operation on closed file
+11:03:27,648 DEBUG - Error in sys.exitfunc:
+11:03:27,648 DEBUG - Traceback (most recent call last):
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:27,648 DEBUG - func(*targs, **kargs)
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:27,648 DEBUG - h.flush()
+11:03:27,648 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:27,648 DEBUG - self.stream.flush()
+11:03:27,648 DEBUG - ValueError: I/O operation on closed file
+11:03:27,758 DEBUG - Execution of blocks returned: 0
+11:03:28,070 DEBUG - Traceback (most recent call last):
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:28,070 DEBUG - self.doRollover()
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:28,070 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:28,070 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:28,070 DEBUG - Traceback (most recent call last):
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:28,070 DEBUG - if self.shouldRollover(record):
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:28,070 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:28,070 DEBUG - ValueError: I/O operation on closed file
+11:03:28,070 DEBUG - Traceback (most recent call last):
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:28,070 DEBUG - if self.shouldRollover(record):
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:28,070 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:28,070 DEBUG - ValueError: I/O operation on closed file
+11:03:28,070 DEBUG - Traceback (most recent call last):
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:28,070 DEBUG - if self.shouldRollover(record):
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:28,070 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:28,070 DEBUG - ValueError: I/O operation on closed file
+11:03:28,070 DEBUG - Error in atexit._run_exitfuncs:
+11:03:28,070 DEBUG - Traceback (most recent call last):
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:28,070 DEBUG - func(*targs, **kargs)
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:28,070 DEBUG - h.flush()
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:28,070 DEBUG - self.stream.flush()
+11:03:28,070 DEBUG - ValueError: I/O operation on closed file
+11:03:28,070 DEBUG - Error in sys.exitfunc:
+11:03:28,070 DEBUG - Traceback (most recent call last):
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:28,070 DEBUG - func(*targs, **kargs)
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:28,070 DEBUG - h.flush()
+11:03:28,070 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:28,070 DEBUG - self.stream.flush()
+11:03:28,070 DEBUG - ValueError: I/O operation on closed file
+11:03:28,180 DEBUG - Execution of blocks returned: 0
+11:03:28,898 DEBUG - Traceback (most recent call last):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:28,898 DEBUG - self.doRollover()
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:28,898 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:28,898 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:28,898 DEBUG - Traceback (most recent call last):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:28,898 DEBUG - if self.shouldRollover(record):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:28,898 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:28,898 DEBUG - ValueError: I/O operation on closed file
+11:03:28,898 DEBUG - Traceback (most recent call last):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:28,898 DEBUG - if self.shouldRollover(record):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:28,898 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:28,898 DEBUG - ValueError: I/O operation on closed file
+11:03:28,898 DEBUG - Traceback (most recent call last):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:28,898 DEBUG - if self.shouldRollover(record):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:28,898 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:28,898 DEBUG - ValueError: I/O operation on closed file
+11:03:28,898 DEBUG - Traceback (most recent call last):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:28,898 DEBUG - if self.shouldRollover(record):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:28,898 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:28,898 DEBUG - ValueError: I/O operation on closed file
+11:03:28,898 DEBUG - Error in atexit._run_exitfuncs:
+11:03:28,898 DEBUG - Traceback (most recent call last):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:28,898 DEBUG - func(*targs, **kargs)
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:28,898 DEBUG - h.flush()
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:28,898 DEBUG - self.stream.flush()
+11:03:28,898 DEBUG - ValueError: I/O operation on closed file
+11:03:28,898 DEBUG - Error in sys.exitfunc:
+11:03:28,898 DEBUG - Traceback (most recent call last):
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:28,898 DEBUG - func(*targs, **kargs)
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:28,898 DEBUG - h.flush()
+11:03:28,898 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:28,898 DEBUG - self.stream.flush()
+11:03:28,898 DEBUG - ValueError: I/O operation on closed file
+11:03:29,008 DEBUG - Execution of blocks returned: 0
+11:03:31,383 DEBUG - Execution of bundle returned: 0
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:32,289 DEBUG - self.doRollover()
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:32,289 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:32,289 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:32,289 DEBUG - if self.shouldRollover(record):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:32,289 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Error in atexit._run_exitfuncs:
+11:03:32,289 DEBUG - Traceback (most recent call last):
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:32,289 DEBUG - func(*targs, **kargs)
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:32,289 DEBUG - h.flush()
+11:03:32,289 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:32,289 DEBUG - self.stream.flush()
+11:03:32,289 DEBUG - ValueError: I/O operation on closed file
+11:03:32,289 DEBUG - Error in sys.exitfunc:
+11:03:32,304 DEBUG - Traceback (most recent call last):
+11:03:32,304 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:32,304 DEBUG - func(*targs, **kargs)
+11:03:32,304 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:32,304 DEBUG - h.flush()
+11:03:32,304 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:32,304 DEBUG - self.stream.flush()
+11:03:32,304 DEBUG - ValueError: I/O operation on closed file
+11:03:32,414 DEBUG - Execution of blocks returned: 0
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:34,867 DEBUG - self.doRollover()
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:34,867 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:34,867 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,867 DEBUG - if self.shouldRollover(record):
+11:03:34,867 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,867 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,867 DEBUG - ValueError: I/O operation on closed file
+11:03:34,867 DEBUG - Traceback (most recent call last):
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,898 DEBUG - if self.shouldRollover(record):
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,898 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,898 DEBUG - ValueError: I/O operation on closed file
+11:03:34,898 DEBUG - Traceback (most recent call last):
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:34,898 DEBUG - if self.shouldRollover(record):
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:34,898 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:34,898 DEBUG - ValueError: I/O operation on closed file
+11:03:34,898 DEBUG - Error in atexit._run_exitfuncs:
+11:03:34,898 DEBUG - Traceback (most recent call last):
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:34,898 DEBUG - func(*targs, **kargs)
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:34,898 DEBUG - h.flush()
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:34,898 DEBUG - self.stream.flush()
+11:03:34,898 DEBUG - ValueError: I/O operation on closed file
+11:03:34,898 DEBUG - Error in sys.exitfunc:
+11:03:34,898 DEBUG - Traceback (most recent call last):
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:34,898 DEBUG - func(*targs, **kargs)
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:34,898 DEBUG - h.flush()
+11:03:34,898 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:34,898 DEBUG - self.stream.flush()
+11:03:34,898 DEBUG - ValueError: I/O operation on closed file
+11:03:35,007 DEBUG - Execution of blocks returned: 0
+11:03:35,320 DEBUG - Traceback (most recent call last):
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:35,320 DEBUG - self.doRollover()
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:35,320 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:35,320 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:35,320 DEBUG - Traceback (most recent call last):
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:35,320 DEBUG - if self.shouldRollover(record):
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:35,320 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:35,320 DEBUG - ValueError: I/O operation on closed file
+11:03:35,320 DEBUG - Traceback (most recent call last):
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:35,320 DEBUG - if self.shouldRollover(record):
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:35,320 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:35,320 DEBUG - ValueError: I/O operation on closed file
+11:03:35,320 DEBUG - Traceback (most recent call last):
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:35,320 DEBUG - if self.shouldRollover(record):
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:35,320 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:35,320 DEBUG - ValueError: I/O operation on closed file
+11:03:35,320 DEBUG - Error in atexit._run_exitfuncs:
+11:03:35,320 DEBUG - Traceback (most recent call last):
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:35,320 DEBUG - func(*targs, **kargs)
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:35,320 DEBUG - h.flush()
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:35,320 DEBUG - self.stream.flush()
+11:03:35,320 DEBUG - ValueError: I/O operation on closed file
+11:03:35,320 DEBUG - Error in sys.exitfunc:
+11:03:35,320 DEBUG - Traceback (most recent call last):
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:35,320 DEBUG - func(*targs, **kargs)
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:35,320 DEBUG - h.flush()
+11:03:35,320 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:35,320 DEBUG - self.stream.flush()
+11:03:35,320 DEBUG - ValueError: I/O operation on closed file
+11:03:35,429 DEBUG - Execution of blocks returned: 0
+11:03:36,148 DEBUG - Traceback (most recent call last):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:36,148 DEBUG - self.doRollover()
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:36,148 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:36,148 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:36,148 DEBUG - Traceback (most recent call last):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:36,148 DEBUG - if self.shouldRollover(record):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:36,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:36,148 DEBUG - ValueError: I/O operation on closed file
+11:03:36,148 DEBUG - Traceback (most recent call last):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:36,148 DEBUG - if self.shouldRollover(record):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:36,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:36,148 DEBUG - ValueError: I/O operation on closed file
+11:03:36,148 DEBUG - Traceback (most recent call last):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:36,148 DEBUG - if self.shouldRollover(record):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:36,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:36,148 DEBUG - ValueError: I/O operation on closed file
+11:03:36,148 DEBUG - Traceback (most recent call last):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:36,148 DEBUG - if self.shouldRollover(record):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:36,148 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:36,148 DEBUG - ValueError: I/O operation on closed file
+11:03:36,148 DEBUG - Error in atexit._run_exitfuncs:
+11:03:36,148 DEBUG - Traceback (most recent call last):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:36,148 DEBUG - func(*targs, **kargs)
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:36,148 DEBUG - h.flush()
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:36,148 DEBUG - self.stream.flush()
+11:03:36,148 DEBUG - ValueError: I/O operation on closed file
+11:03:36,148 DEBUG - Error in sys.exitfunc:
+11:03:36,148 DEBUG - Traceback (most recent call last):
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:36,148 DEBUG - func(*targs, **kargs)
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:36,148 DEBUG - h.flush()
+11:03:36,148 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:36,148 DEBUG - self.stream.flush()
+11:03:36,148 DEBUG - ValueError: I/O operation on closed file
+11:03:36,257 DEBUG - Execution of blocks returned: 0
+11:03:38,648 DEBUG - Execution of bundle returned: 0
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:39,554 DEBUG - self.doRollover()
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:39,554 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:39,554 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:39,554 DEBUG - if self.shouldRollover(record):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:39,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Error in atexit._run_exitfuncs:
+11:03:39,554 DEBUG - Traceback (most recent call last):
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:39,554 DEBUG - func(*targs, **kargs)
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:39,554 DEBUG - h.flush()
+11:03:39,554 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:39,554 DEBUG - self.stream.flush()
+11:03:39,554 DEBUG - ValueError: I/O operation on closed file
+11:03:39,554 DEBUG - Error in sys.exitfunc:
+11:03:39,570 DEBUG - Traceback (most recent call last):
+11:03:39,570 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:39,570 DEBUG - func(*targs, **kargs)
+11:03:39,570 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:39,570 DEBUG - h.flush()
+11:03:39,570 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:39,570 DEBUG - self.stream.flush()
+11:03:39,570 DEBUG - ValueError: I/O operation on closed file
+11:03:39,679 DEBUG - Execution of blocks returned: 0
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:40,445 DEBUG - self.doRollover()
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:40,445 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:40,445 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:40,445 DEBUG - if self.shouldRollover(record):
+11:03:40,445 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:40,445 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:40,445 DEBUG - ValueError: I/O operation on closed file
+11:03:40,445 DEBUG - Traceback (most recent call last):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:42,210 DEBUG - if self.shouldRollover(record):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:42,210 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:42,210 DEBUG - ValueError: I/O operation on closed file
+11:03:42,210 DEBUG - Traceback (most recent call last):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:42,210 DEBUG - if self.shouldRollover(record):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:42,210 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:42,210 DEBUG - ValueError: I/O operation on closed file
+11:03:42,210 DEBUG - Traceback (most recent call last):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:42,210 DEBUG - if self.shouldRollover(record):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:42,210 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:42,210 DEBUG - ValueError: I/O operation on closed file
+11:03:42,210 DEBUG - Traceback (most recent call last):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:42,210 DEBUG - if self.shouldRollover(record):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:42,210 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:42,210 DEBUG - ValueError: I/O operation on closed file
+11:03:42,210 DEBUG - Traceback (most recent call last):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:42,210 DEBUG - if self.shouldRollover(record):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:42,210 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:42,210 DEBUG - ValueError: I/O operation on closed file
+11:03:42,210 DEBUG - Error in atexit._run_exitfuncs:
+11:03:42,210 DEBUG - Traceback (most recent call last):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:42,210 DEBUG - func(*targs, **kargs)
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:42,210 DEBUG - h.flush()
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:42,210 DEBUG - self.stream.flush()
+11:03:42,210 DEBUG - ValueError: I/O operation on closed file
+11:03:42,210 DEBUG - Error in sys.exitfunc:
+11:03:42,210 DEBUG - Traceback (most recent call last):
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:42,210 DEBUG - func(*targs, **kargs)
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:42,210 DEBUG - h.flush()
+11:03:42,210 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:42,210 DEBUG - self.stream.flush()
+11:03:42,210 DEBUG - ValueError: I/O operation on closed file
+11:03:42,320 DEBUG - Execution of blocks returned: 0
+11:03:42,648 DEBUG - Traceback (most recent call last):
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:42,648 DEBUG - self.doRollover()
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:42,648 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:42,648 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:42,648 DEBUG - Traceback (most recent call last):
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:42,648 DEBUG - if self.shouldRollover(record):
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:42,648 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:42,648 DEBUG - ValueError: I/O operation on closed file
+11:03:42,648 DEBUG - Traceback (most recent call last):
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:42,648 DEBUG - if self.shouldRollover(record):
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:42,648 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:42,648 DEBUG - ValueError: I/O operation on closed file
+11:03:42,648 DEBUG - Traceback (most recent call last):
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:42,648 DEBUG - if self.shouldRollover(record):
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:42,648 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:42,648 DEBUG - ValueError: I/O operation on closed file
+11:03:42,648 DEBUG - Error in atexit._run_exitfuncs:
+11:03:42,648 DEBUG - Traceback (most recent call last):
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:42,648 DEBUG - func(*targs, **kargs)
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:42,648 DEBUG - h.flush()
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:42,648 DEBUG - self.stream.flush()
+11:03:42,648 DEBUG - ValueError: I/O operation on closed file
+11:03:42,648 DEBUG - Error in sys.exitfunc:
+11:03:42,648 DEBUG - Traceback (most recent call last):
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:42,648 DEBUG - func(*targs, **kargs)
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:42,648 DEBUG - h.flush()
+11:03:42,648 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:42,648 DEBUG - self.stream.flush()
+11:03:42,648 DEBUG - ValueError: I/O operation on closed file
+11:03:42,757 DEBUG - Execution of blocks returned: 0
+11:03:43,476 DEBUG - Traceback (most recent call last):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:43,476 DEBUG - self.doRollover()
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:43,476 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:43,476 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:43,476 DEBUG - Traceback (most recent call last):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:43,476 DEBUG - if self.shouldRollover(record):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:43,476 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:43,476 DEBUG - ValueError: I/O operation on closed file
+11:03:43,476 DEBUG - Traceback (most recent call last):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:43,476 DEBUG - if self.shouldRollover(record):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:43,476 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:43,476 DEBUG - ValueError: I/O operation on closed file
+11:03:43,476 DEBUG - Traceback (most recent call last):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:43,476 DEBUG - if self.shouldRollover(record):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:43,476 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:43,476 DEBUG - ValueError: I/O operation on closed file
+11:03:43,476 DEBUG - Traceback (most recent call last):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:43,476 DEBUG - if self.shouldRollover(record):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:43,476 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:43,476 DEBUG - ValueError: I/O operation on closed file
+11:03:43,476 DEBUG - Error in atexit._run_exitfuncs:
+11:03:43,476 DEBUG - Traceback (most recent call last):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:43,476 DEBUG - func(*targs, **kargs)
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:43,476 DEBUG - h.flush()
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:43,476 DEBUG - self.stream.flush()
+11:03:43,476 DEBUG - ValueError: I/O operation on closed file
+11:03:43,476 DEBUG - Error in sys.exitfunc:
+11:03:43,476 DEBUG - Traceback (most recent call last):
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:43,476 DEBUG - func(*targs, **kargs)
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:43,476 DEBUG - h.flush()
+11:03:43,476 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:43,476 DEBUG - self.stream.flush()
+11:03:43,476 DEBUG - ValueError: I/O operation on closed file
+11:03:43,585 DEBUG - Execution of blocks returned: 0
+11:03:45,960 DEBUG - Execution of bundle returned: 0
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:46,866 DEBUG - self.doRollover()
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:46,866 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:46,866 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:46,866 DEBUG - if self.shouldRollover(record):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:46,866 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Error in atexit._run_exitfuncs:
+11:03:46,866 DEBUG - Traceback (most recent call last):
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:46,866 DEBUG - func(*targs, **kargs)
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:46,866 DEBUG - h.flush()
+11:03:46,866 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:46,866 DEBUG - self.stream.flush()
+11:03:46,866 DEBUG - ValueError: I/O operation on closed file
+11:03:46,866 DEBUG - Error in sys.exitfunc:
+11:03:46,882 DEBUG - Traceback (most recent call last):
+11:03:46,882 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:46,882 DEBUG - func(*targs, **kargs)
+11:03:46,882 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:46,882 DEBUG - h.flush()
+11:03:46,882 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:46,882 DEBUG - self.stream.flush()
+11:03:46,882 DEBUG - ValueError: I/O operation on closed file
+11:03:46,991 DEBUG - Execution of blocks returned: 0
+11:03:47,319 DEBUG - Traceback (most recent call last):
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:47,319 DEBUG - self.doRollover()
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:47,319 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:47,319 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:47,319 DEBUG - Traceback (most recent call last):
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:47,319 DEBUG - if self.shouldRollover(record):
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:47,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:47,319 DEBUG - ValueError: I/O operation on closed file
+11:03:47,319 DEBUG - Traceback (most recent call last):
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:47,319 DEBUG - if self.shouldRollover(record):
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:47,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:47,319 DEBUG - ValueError: I/O operation on closed file
+11:03:47,319 DEBUG - Traceback (most recent call last):
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:47,319 DEBUG - if self.shouldRollover(record):
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:47,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:47,319 DEBUG - ValueError: I/O operation on closed file
+11:03:47,319 DEBUG - Error in atexit._run_exitfuncs:
+11:03:47,319 DEBUG - Traceback (most recent call last):
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:47,319 DEBUG - func(*targs, **kargs)
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:47,319 DEBUG - h.flush()
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:47,319 DEBUG - self.stream.flush()
+11:03:47,319 DEBUG - ValueError: I/O operation on closed file
+11:03:47,319 DEBUG - Error in sys.exitfunc:
+11:03:47,319 DEBUG - Traceback (most recent call last):
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:47,319 DEBUG - func(*targs, **kargs)
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:47,319 DEBUG - h.flush()
+11:03:47,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:47,319 DEBUG - self.stream.flush()
+11:03:47,319 DEBUG - ValueError: I/O operation on closed file
+11:03:47,429 DEBUG - Execution of blocks returned: 0
+11:03:48,319 DEBUG - Traceback (most recent call last):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:48,319 DEBUG - self.doRollover()
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:48,319 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:48,319 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:48,319 DEBUG - Traceback (most recent call last):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:48,319 DEBUG - if self.shouldRollover(record):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:48,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:48,319 DEBUG - ValueError: I/O operation on closed file
+11:03:48,319 DEBUG - Traceback (most recent call last):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:48,319 DEBUG - if self.shouldRollover(record):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:48,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:48,319 DEBUG - ValueError: I/O operation on closed file
+11:03:48,319 DEBUG - Traceback (most recent call last):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:48,319 DEBUG - if self.shouldRollover(record):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:48,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:48,319 DEBUG - ValueError: I/O operation on closed file
+11:03:48,319 DEBUG - Traceback (most recent call last):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:48,319 DEBUG - if self.shouldRollover(record):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:48,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:48,319 DEBUG - ValueError: I/O operation on closed file
+11:03:48,319 DEBUG - Error in atexit._run_exitfuncs:
+11:03:48,319 DEBUG - Traceback (most recent call last):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:48,319 DEBUG - func(*targs, **kargs)
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:48,319 DEBUG - h.flush()
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:48,319 DEBUG - self.stream.flush()
+11:03:48,319 DEBUG - ValueError: I/O operation on closed file
+11:03:48,319 DEBUG - Error in sys.exitfunc:
+11:03:48,319 DEBUG - Traceback (most recent call last):
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:48,319 DEBUG - func(*targs, **kargs)
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:48,319 DEBUG - h.flush()
+11:03:48,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:48,319 DEBUG - self.stream.flush()
+11:03:48,319 DEBUG - ValueError: I/O operation on closed file
+11:03:48,429 DEBUG - Execution of blocks returned: 0
+11:03:50,819 DEBUG - Execution of bundle returned: 0
+11:03:51,116 DEBUG - Traceback (most recent call last):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:51,116 DEBUG - self.doRollover()
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:51,116 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:51,116 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:51,116 DEBUG - Traceback (most recent call last):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:51,116 DEBUG - if self.shouldRollover(record):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:51,116 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:51,116 DEBUG - ValueError: I/O operation on closed file
+11:03:51,116 DEBUG - Traceback (most recent call last):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:51,116 DEBUG - if self.shouldRollover(record):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:51,116 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:51,116 DEBUG - ValueError: I/O operation on closed file
+11:03:51,116 DEBUG - Traceback (most recent call last):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:51,116 DEBUG - if self.shouldRollover(record):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:51,116 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:51,116 DEBUG - ValueError: I/O operation on closed file
+11:03:51,116 DEBUG - Traceback (most recent call last):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:51,116 DEBUG - if self.shouldRollover(record):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:51,116 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:51,116 DEBUG - ValueError: I/O operation on closed file
+11:03:51,116 DEBUG - Error in atexit._run_exitfuncs:
+11:03:51,116 DEBUG - Traceback (most recent call last):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:51,116 DEBUG - func(*targs, **kargs)
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:51,116 DEBUG - h.flush()
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:51,116 DEBUG - self.stream.flush()
+11:03:51,116 DEBUG - ValueError: I/O operation on closed file
+11:03:51,116 DEBUG - Error in sys.exitfunc:
+11:03:51,116 DEBUG - Traceback (most recent call last):
+11:03:51,116 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:51,132 DEBUG - func(*targs, **kargs)
+11:03:51,132 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:51,132 DEBUG - h.flush()
+11:03:51,132 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:51,132 DEBUG - self.stream.flush()
+11:03:51,132 DEBUG - ValueError: I/O operation on closed file
+11:03:51,226 DEBUG - Execution of blocks returned: 0
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:52,132 DEBUG - self.doRollover()
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:52,132 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:52,132 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,132 DEBUG - if self.shouldRollover(record):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,132 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Error in atexit._run_exitfuncs:
+11:03:52,132 DEBUG - Traceback (most recent call last):
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:52,132 DEBUG - func(*targs, **kargs)
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:52,132 DEBUG - h.flush()
+11:03:52,132 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:52,132 DEBUG - self.stream.flush()
+11:03:52,132 DEBUG - ValueError: I/O operation on closed file
+11:03:52,132 DEBUG - Error in sys.exitfunc:
+11:03:52,147 DEBUG - Traceback (most recent call last):
+11:03:52,147 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:52,147 DEBUG - func(*targs, **kargs)
+11:03:52,147 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:52,147 DEBUG - h.flush()
+11:03:52,147 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:52,147 DEBUG - self.stream.flush()
+11:03:52,147 DEBUG - ValueError: I/O operation on closed file
+11:03:52,257 DEBUG - Execution of blocks returned: 0
+11:03:52,554 DEBUG - Traceback (most recent call last):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:52,554 DEBUG - self.doRollover()
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:52,554 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:52,554 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:52,554 DEBUG - Traceback (most recent call last):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,554 DEBUG - if self.shouldRollover(record):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,554 DEBUG - ValueError: I/O operation on closed file
+11:03:52,554 DEBUG - Traceback (most recent call last):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,554 DEBUG - if self.shouldRollover(record):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,554 DEBUG - ValueError: I/O operation on closed file
+11:03:52,554 DEBUG - Traceback (most recent call last):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,554 DEBUG - if self.shouldRollover(record):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,554 DEBUG - ValueError: I/O operation on closed file
+11:03:52,554 DEBUG - Traceback (most recent call last):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,554 DEBUG - if self.shouldRollover(record):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,554 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,554 DEBUG - ValueError: I/O operation on closed file
+11:03:52,554 DEBUG - Error in atexit._run_exitfuncs:
+11:03:52,554 DEBUG - Traceback (most recent call last):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:52,554 DEBUG - func(*targs, **kargs)
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:52,554 DEBUG - h.flush()
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:52,554 DEBUG - self.stream.flush()
+11:03:52,554 DEBUG - ValueError: I/O operation on closed file
+11:03:52,554 DEBUG - Error in sys.exitfunc:
+11:03:52,554 DEBUG - Traceback (most recent call last):
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:52,554 DEBUG - func(*targs, **kargs)
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:52,554 DEBUG - h.flush()
+11:03:52,554 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:52,554 DEBUG - self.stream.flush()
+11:03:52,554 DEBUG - ValueError: I/O operation on closed file
+11:03:52,663 DEBUG - Execution of blocks returned: 0
+11:03:52,975 DEBUG - Traceback (most recent call last):
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:52,975 DEBUG - self.doRollover()
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:52,975 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:52,975 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:52,975 DEBUG - Traceback (most recent call last):
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,975 DEBUG - if self.shouldRollover(record):
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,975 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,975 DEBUG - ValueError: I/O operation on closed file
+11:03:52,975 DEBUG - Traceback (most recent call last):
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,975 DEBUG - if self.shouldRollover(record):
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,975 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,975 DEBUG - ValueError: I/O operation on closed file
+11:03:52,975 DEBUG - Traceback (most recent call last):
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:52,975 DEBUG - if self.shouldRollover(record):
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:52,975 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:52,975 DEBUG - ValueError: I/O operation on closed file
+11:03:52,975 DEBUG - Error in atexit._run_exitfuncs:
+11:03:52,975 DEBUG - Traceback (most recent call last):
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:52,975 DEBUG - func(*targs, **kargs)
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:52,975 DEBUG - h.flush()
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:52,975 DEBUG - self.stream.flush()
+11:03:52,975 DEBUG - ValueError: I/O operation on closed file
+11:03:52,975 DEBUG - Error in sys.exitfunc:
+11:03:52,975 DEBUG - Traceback (most recent call last):
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:52,975 DEBUG - func(*targs, **kargs)
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:52,975 DEBUG - h.flush()
+11:03:52,975 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:52,975 DEBUG - self.stream.flush()
+11:03:52,975 DEBUG - ValueError: I/O operation on closed file
+11:03:53,085 DEBUG - Execution of blocks returned: 0
+11:03:53,819 DEBUG - Traceback (most recent call last):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:53,819 DEBUG - self.doRollover()
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:53,819 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:53,819 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:53,819 DEBUG - Traceback (most recent call last):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:53,819 DEBUG - if self.shouldRollover(record):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:53,819 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:53,819 DEBUG - ValueError: I/O operation on closed file
+11:03:53,819 DEBUG - Traceback (most recent call last):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:53,819 DEBUG - if self.shouldRollover(record):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:53,819 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:53,819 DEBUG - ValueError: I/O operation on closed file
+11:03:53,819 DEBUG - Traceback (most recent call last):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:53,819 DEBUG - if self.shouldRollover(record):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:53,819 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:53,819 DEBUG - ValueError: I/O operation on closed file
+11:03:53,819 DEBUG - Traceback (most recent call last):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:53,819 DEBUG - if self.shouldRollover(record):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:53,819 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:53,819 DEBUG - ValueError: I/O operation on closed file
+11:03:53,819 DEBUG - Error in atexit._run_exitfuncs:
+11:03:53,819 DEBUG - Traceback (most recent call last):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:53,819 DEBUG - func(*targs, **kargs)
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:53,819 DEBUG - h.flush()
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:53,819 DEBUG - self.stream.flush()
+11:03:53,819 DEBUG - ValueError: I/O operation on closed file
+11:03:53,819 DEBUG - Error in sys.exitfunc:
+11:03:53,819 DEBUG - Traceback (most recent call last):
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:53,819 DEBUG - func(*targs, **kargs)
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:53,819 DEBUG - h.flush()
+11:03:53,819 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:53,819 DEBUG - self.stream.flush()
+11:03:53,819 DEBUG - ValueError: I/O operation on closed file
+11:03:53,929 DEBUG - Execution of blocks returned: 0
+11:03:56,303 DEBUG - Execution of bundle returned: 0
+11:03:56,600 DEBUG - Traceback (most recent call last):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:56,600 DEBUG - self.doRollover()
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:56,600 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:56,600 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:56,600 DEBUG - Traceback (most recent call last):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:56,600 DEBUG - if self.shouldRollover(record):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:56,600 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:56,600 DEBUG - ValueError: I/O operation on closed file
+11:03:56,600 DEBUG - Traceback (most recent call last):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:56,600 DEBUG - if self.shouldRollover(record):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:56,600 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:56,600 DEBUG - ValueError: I/O operation on closed file
+11:03:56,600 DEBUG - Traceback (most recent call last):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:56,600 DEBUG - if self.shouldRollover(record):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:56,600 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:56,600 DEBUG - ValueError: I/O operation on closed file
+11:03:56,600 DEBUG - Traceback (most recent call last):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:56,600 DEBUG - if self.shouldRollover(record):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:56,600 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:56,600 DEBUG - ValueError: I/O operation on closed file
+11:03:56,600 DEBUG - Error in atexit._run_exitfuncs:
+11:03:56,600 DEBUG - Traceback (most recent call last):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:56,600 DEBUG - func(*targs, **kargs)
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:56,600 DEBUG - h.flush()
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:56,600 DEBUG - self.stream.flush()
+11:03:56,600 DEBUG - ValueError: I/O operation on closed file
+11:03:56,600 DEBUG - Error in sys.exitfunc:
+11:03:56,600 DEBUG - Traceback (most recent call last):
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:56,600 DEBUG - func(*targs, **kargs)
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:56,600 DEBUG - h.flush()
+11:03:56,600 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:56,600 DEBUG - self.stream.flush()
+11:03:56,600 DEBUG - ValueError: I/O operation on closed file
+11:03:56,710 DEBUG - Execution of blocks returned: 0
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:57,616 DEBUG - self.doRollover()
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:57,616 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:57,616 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:57,616 DEBUG - if self.shouldRollover(record):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:57,616 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Error in atexit._run_exitfuncs:
+11:03:57,616 DEBUG - Traceback (most recent call last):
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:57,616 DEBUG - func(*targs, **kargs)
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:57,616 DEBUG - h.flush()
+11:03:57,616 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:57,616 DEBUG - self.stream.flush()
+11:03:57,616 DEBUG - ValueError: I/O operation on closed file
+11:03:57,616 DEBUG - Error in sys.exitfunc:
+11:03:57,632 DEBUG - Traceback (most recent call last):
+11:03:57,632 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:57,632 DEBUG - func(*targs, **kargs)
+11:03:57,632 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:57,632 DEBUG - h.flush()
+11:03:57,632 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:57,632 DEBUG - self.stream.flush()
+11:03:57,632 DEBUG - ValueError: I/O operation on closed file
+11:03:57,741 DEBUG - Execution of blocks returned: 0
+11:03:58,038 DEBUG - Traceback (most recent call last):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:58,038 DEBUG - self.doRollover()
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:58,038 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:58,038 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:58,038 DEBUG - Traceback (most recent call last):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,038 DEBUG - if self.shouldRollover(record):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,038 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,038 DEBUG - ValueError: I/O operation on closed file
+11:03:58,038 DEBUG - Traceback (most recent call last):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,038 DEBUG - if self.shouldRollover(record):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,038 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,038 DEBUG - ValueError: I/O operation on closed file
+11:03:58,038 DEBUG - Traceback (most recent call last):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,038 DEBUG - if self.shouldRollover(record):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,038 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,038 DEBUG - ValueError: I/O operation on closed file
+11:03:58,038 DEBUG - Traceback (most recent call last):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,038 DEBUG - if self.shouldRollover(record):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,038 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,038 DEBUG - ValueError: I/O operation on closed file
+11:03:58,038 DEBUG - Error in atexit._run_exitfuncs:
+11:03:58,038 DEBUG - Traceback (most recent call last):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:58,038 DEBUG - func(*targs, **kargs)
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:58,038 DEBUG - h.flush()
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:58,038 DEBUG - self.stream.flush()
+11:03:58,038 DEBUG - ValueError: I/O operation on closed file
+11:03:58,038 DEBUG - Error in sys.exitfunc:
+11:03:58,038 DEBUG - Traceback (most recent call last):
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:58,038 DEBUG - func(*targs, **kargs)
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:58,038 DEBUG - h.flush()
+11:03:58,038 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:58,038 DEBUG - self.stream.flush()
+11:03:58,038 DEBUG - ValueError: I/O operation on closed file
+11:03:58,147 DEBUG - Execution of blocks returned: 0
+11:03:58,444 DEBUG - Traceback (most recent call last):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:58,444 DEBUG - self.doRollover()
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:58,444 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:58,444 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:58,444 DEBUG - Traceback (most recent call last):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,444 DEBUG - if self.shouldRollover(record):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,444 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,444 DEBUG - ValueError: I/O operation on closed file
+11:03:58,444 DEBUG - Traceback (most recent call last):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,444 DEBUG - if self.shouldRollover(record):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,444 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,444 DEBUG - ValueError: I/O operation on closed file
+11:03:58,444 DEBUG - Traceback (most recent call last):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,444 DEBUG - if self.shouldRollover(record):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,444 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,444 DEBUG - ValueError: I/O operation on closed file
+11:03:58,444 DEBUG - Traceback (most recent call last):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,444 DEBUG - if self.shouldRollover(record):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,444 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,444 DEBUG - ValueError: I/O operation on closed file
+11:03:58,444 DEBUG - Error in atexit._run_exitfuncs:
+11:03:58,444 DEBUG - Traceback (most recent call last):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:58,444 DEBUG - func(*targs, **kargs)
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:58,444 DEBUG - h.flush()
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:58,444 DEBUG - self.stream.flush()
+11:03:58,444 DEBUG - ValueError: I/O operation on closed file
+11:03:58,444 DEBUG - Error in sys.exitfunc:
+11:03:58,444 DEBUG - Traceback (most recent call last):
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:58,444 DEBUG - func(*targs, **kargs)
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:58,444 DEBUG - h.flush()
+11:03:58,444 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:58,444 DEBUG - self.stream.flush()
+11:03:58,444 DEBUG - ValueError: I/O operation on closed file
+11:03:58,553 DEBUG - Execution of blocks returned: 0
+11:03:58,850 DEBUG - Traceback (most recent call last):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:58,850 DEBUG - self.doRollover()
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:58,850 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:58,850 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:58,850 DEBUG - Traceback (most recent call last):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,850 DEBUG - if self.shouldRollover(record):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,850 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,850 DEBUG - ValueError: I/O operation on closed file
+11:03:58,850 DEBUG - Traceback (most recent call last):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,850 DEBUG - if self.shouldRollover(record):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,850 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,850 DEBUG - ValueError: I/O operation on closed file
+11:03:58,850 DEBUG - Traceback (most recent call last):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,850 DEBUG - if self.shouldRollover(record):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,850 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,850 DEBUG - ValueError: I/O operation on closed file
+11:03:58,850 DEBUG - Traceback (most recent call last):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:58,850 DEBUG - if self.shouldRollover(record):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:58,850 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:58,850 DEBUG - ValueError: I/O operation on closed file
+11:03:58,850 DEBUG - Error in atexit._run_exitfuncs:
+11:03:58,850 DEBUG - Traceback (most recent call last):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:58,850 DEBUG - func(*targs, **kargs)
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:58,850 DEBUG - h.flush()
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:58,850 DEBUG - self.stream.flush()
+11:03:58,850 DEBUG - ValueError: I/O operation on closed file
+11:03:58,850 DEBUG - Error in sys.exitfunc:
+11:03:58,850 DEBUG - Traceback (most recent call last):
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:58,850 DEBUG - func(*targs, **kargs)
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:58,850 DEBUG - h.flush()
+11:03:58,850 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:58,850 DEBUG - self.stream.flush()
+11:03:58,850 DEBUG - ValueError: I/O operation on closed file
+11:03:58,960 DEBUG - Execution of blocks returned: 0
+11:03:59,272 DEBUG - Traceback (most recent call last):
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:03:59,272 DEBUG - self.doRollover()
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:03:59,272 DEBUG - os.rename(self.baseFilename, dfn)
+11:03:59,272 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:03:59,272 DEBUG - Traceback (most recent call last):
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:59,272 DEBUG - if self.shouldRollover(record):
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:59,272 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:59,272 DEBUG - ValueError: I/O operation on closed file
+11:03:59,272 DEBUG - Traceback (most recent call last):
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:59,272 DEBUG - if self.shouldRollover(record):
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:59,272 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:59,272 DEBUG - ValueError: I/O operation on closed file
+11:03:59,272 DEBUG - Traceback (most recent call last):
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:03:59,272 DEBUG - if self.shouldRollover(record):
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:03:59,272 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:03:59,272 DEBUG - ValueError: I/O operation on closed file
+11:03:59,272 DEBUG - Error in atexit._run_exitfuncs:
+11:03:59,272 DEBUG - Traceback (most recent call last):
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:59,272 DEBUG - func(*targs, **kargs)
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:59,272 DEBUG - h.flush()
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:59,272 DEBUG - self.stream.flush()
+11:03:59,272 DEBUG - ValueError: I/O operation on closed file
+11:03:59,272 DEBUG - Error in sys.exitfunc:
+11:03:59,272 DEBUG - Traceback (most recent call last):
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:03:59,272 DEBUG - func(*targs, **kargs)
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:03:59,272 DEBUG - h.flush()
+11:03:59,272 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:03:59,272 DEBUG - self.stream.flush()
+11:03:59,272 DEBUG - ValueError: I/O operation on closed file
+11:03:59,381 DEBUG - Execution of blocks returned: 0
+11:04:00,100 DEBUG - Traceback (most recent call last):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:00,100 DEBUG - self.doRollover()
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:00,100 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:00,100 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:00,100 DEBUG - Traceback (most recent call last):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:00,100 DEBUG - if self.shouldRollover(record):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:00,100 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:00,100 DEBUG - ValueError: I/O operation on closed file
+11:04:00,100 DEBUG - Traceback (most recent call last):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:00,100 DEBUG - if self.shouldRollover(record):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:00,100 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:00,100 DEBUG - ValueError: I/O operation on closed file
+11:04:00,100 DEBUG - Traceback (most recent call last):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:00,100 DEBUG - if self.shouldRollover(record):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:00,100 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:00,100 DEBUG - ValueError: I/O operation on closed file
+11:04:00,100 DEBUG - Traceback (most recent call last):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:00,100 DEBUG - if self.shouldRollover(record):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:00,100 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:00,100 DEBUG - ValueError: I/O operation on closed file
+11:04:00,100 DEBUG - Error in atexit._run_exitfuncs:
+11:04:00,100 DEBUG - Traceback (most recent call last):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:00,100 DEBUG - func(*targs, **kargs)
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:00,100 DEBUG - h.flush()
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:00,100 DEBUG - self.stream.flush()
+11:04:00,100 DEBUG - ValueError: I/O operation on closed file
+11:04:00,100 DEBUG - Error in sys.exitfunc:
+11:04:00,100 DEBUG - Traceback (most recent call last):
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:00,100 DEBUG - func(*targs, **kargs)
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:00,100 DEBUG - h.flush()
+11:04:00,100 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:00,100 DEBUG - self.stream.flush()
+11:04:00,100 DEBUG - ValueError: I/O operation on closed file
+11:04:00,210 DEBUG - Execution of blocks returned: 0
+11:04:02,584 DEBUG - Execution of bundle returned: 0
+11:04:02,881 DEBUG - Traceback (most recent call last):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:02,881 DEBUG - self.doRollover()
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:02,881 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:02,881 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:02,881 DEBUG - Traceback (most recent call last):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:02,881 DEBUG - if self.shouldRollover(record):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:02,881 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:02,881 DEBUG - ValueError: I/O operation on closed file
+11:04:02,881 DEBUG - Traceback (most recent call last):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:02,881 DEBUG - if self.shouldRollover(record):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:02,881 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:02,881 DEBUG - ValueError: I/O operation on closed file
+11:04:02,881 DEBUG - Traceback (most recent call last):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:02,881 DEBUG - if self.shouldRollover(record):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:02,881 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:02,881 DEBUG - ValueError: I/O operation on closed file
+11:04:02,881 DEBUG - Traceback (most recent call last):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:02,881 DEBUG - if self.shouldRollover(record):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:02,881 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:02,881 DEBUG - ValueError: I/O operation on closed file
+11:04:02,881 DEBUG - Error in atexit._run_exitfuncs:
+11:04:02,881 DEBUG - Traceback (most recent call last):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:02,881 DEBUG - func(*targs, **kargs)
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:02,881 DEBUG - h.flush()
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:02,881 DEBUG - self.stream.flush()
+11:04:02,881 DEBUG - ValueError: I/O operation on closed file
+11:04:02,881 DEBUG - Error in sys.exitfunc:
+11:04:02,881 DEBUG - Traceback (most recent call last):
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:02,881 DEBUG - func(*targs, **kargs)
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:02,881 DEBUG - h.flush()
+11:04:02,881 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:02,881 DEBUG - self.stream.flush()
+11:04:02,881 DEBUG - ValueError: I/O operation on closed file
+11:04:02,991 DEBUG - Execution of blocks returned: 0
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:03,897 DEBUG - self.doRollover()
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:03,897 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:03,897 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:03,897 DEBUG - if self.shouldRollover(record):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:03,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Error in atexit._run_exitfuncs:
+11:04:03,897 DEBUG - Traceback (most recent call last):
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:03,897 DEBUG - func(*targs, **kargs)
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:03,897 DEBUG - h.flush()
+11:04:03,897 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:03,897 DEBUG - self.stream.flush()
+11:04:03,897 DEBUG - ValueError: I/O operation on closed file
+11:04:03,897 DEBUG - Error in sys.exitfunc:
+11:04:03,913 DEBUG - Traceback (most recent call last):
+11:04:03,913 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:03,913 DEBUG - func(*targs, **kargs)
+11:04:03,913 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:03,913 DEBUG - h.flush()
+11:04:03,913 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:03,913 DEBUG - self.stream.flush()
+11:04:03,913 DEBUG - ValueError: I/O operation on closed file
+11:04:04,022 DEBUG - Execution of blocks returned: 0
+11:04:04,319 DEBUG - Traceback (most recent call last):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:04,319 DEBUG - self.doRollover()
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:04,319 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:04,319 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:04,319 DEBUG - Traceback (most recent call last):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:04,319 DEBUG - if self.shouldRollover(record):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:04,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:04,319 DEBUG - ValueError: I/O operation on closed file
+11:04:04,319 DEBUG - Traceback (most recent call last):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:04,319 DEBUG - if self.shouldRollover(record):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:04,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:04,319 DEBUG - ValueError: I/O operation on closed file
+11:04:04,319 DEBUG - Traceback (most recent call last):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:04,319 DEBUG - if self.shouldRollover(record):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:04,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:04,319 DEBUG - ValueError: I/O operation on closed file
+11:04:04,319 DEBUG - Traceback (most recent call last):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:04,319 DEBUG - if self.shouldRollover(record):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:04,319 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:04,319 DEBUG - ValueError: I/O operation on closed file
+11:04:04,319 DEBUG - Error in atexit._run_exitfuncs:
+11:04:04,319 DEBUG - Traceback (most recent call last):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:04,319 DEBUG - func(*targs, **kargs)
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:04,319 DEBUG - h.flush()
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:04,319 DEBUG - self.stream.flush()
+11:04:04,319 DEBUG - ValueError: I/O operation on closed file
+11:04:04,319 DEBUG - Error in sys.exitfunc:
+11:04:04,319 DEBUG - Traceback (most recent call last):
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:04,319 DEBUG - func(*targs, **kargs)
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:04,319 DEBUG - h.flush()
+11:04:04,319 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:04,319 DEBUG - self.stream.flush()
+11:04:04,319 DEBUG - ValueError: I/O operation on closed file
+11:04:04,428 DEBUG - Execution of blocks returned: 0
+11:04:04,741 DEBUG - Traceback (most recent call last):
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:04,741 DEBUG - self.doRollover()
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:04,741 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:04,741 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:04,741 DEBUG - Traceback (most recent call last):
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:04,741 DEBUG - if self.shouldRollover(record):
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:04,741 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:04,741 DEBUG - ValueError: I/O operation on closed file
+11:04:04,741 DEBUG - Traceback (most recent call last):
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:04,741 DEBUG - if self.shouldRollover(record):
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:04,741 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:04,741 DEBUG - ValueError: I/O operation on closed file
+11:04:04,741 DEBUG - Traceback (most recent call last):
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:04,741 DEBUG - if self.shouldRollover(record):
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:04,741 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:04,741 DEBUG - ValueError: I/O operation on closed file
+11:04:04,741 DEBUG - Error in atexit._run_exitfuncs:
+11:04:04,741 DEBUG - Traceback (most recent call last):
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:04,741 DEBUG - func(*targs, **kargs)
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:04,741 DEBUG - h.flush()
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:04,741 DEBUG - self.stream.flush()
+11:04:04,741 DEBUG - ValueError: I/O operation on closed file
+11:04:04,741 DEBUG - Error in sys.exitfunc:
+11:04:04,741 DEBUG - Traceback (most recent call last):
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:04,741 DEBUG - func(*targs, **kargs)
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:04,741 DEBUG - h.flush()
+11:04:04,741 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:04,741 DEBUG - self.stream.flush()
+11:04:04,741 DEBUG - ValueError: I/O operation on closed file
+11:04:04,850 DEBUG - Execution of blocks returned: 0
+11:04:05,600 DEBUG - Traceback (most recent call last):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:05,600 DEBUG - self.doRollover()
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:05,600 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:05,600 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:05,600 DEBUG - Traceback (most recent call last):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:05,600 DEBUG - if self.shouldRollover(record):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:05,600 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:05,600 DEBUG - ValueError: I/O operation on closed file
+11:04:05,600 DEBUG - Traceback (most recent call last):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:05,600 DEBUG - if self.shouldRollover(record):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:05,600 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:05,600 DEBUG - ValueError: I/O operation on closed file
+11:04:05,600 DEBUG - Traceback (most recent call last):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:05,600 DEBUG - if self.shouldRollover(record):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:05,600 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:05,600 DEBUG - ValueError: I/O operation on closed file
+11:04:05,600 DEBUG - Traceback (most recent call last):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:05,600 DEBUG - if self.shouldRollover(record):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:05,600 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:05,600 DEBUG - ValueError: I/O operation on closed file
+11:04:05,600 DEBUG - Error in atexit._run_exitfuncs:
+11:04:05,600 DEBUG - Traceback (most recent call last):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:05,600 DEBUG - func(*targs, **kargs)
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:05,600 DEBUG - h.flush()
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:05,600 DEBUG - self.stream.flush()
+11:04:05,600 DEBUG - ValueError: I/O operation on closed file
+11:04:05,600 DEBUG - Error in sys.exitfunc:
+11:04:05,600 DEBUG - Traceback (most recent call last):
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:05,600 DEBUG - func(*targs, **kargs)
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:05,600 DEBUG - h.flush()
+11:04:05,600 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:05,600 DEBUG - self.stream.flush()
+11:04:05,600 DEBUG - ValueError: I/O operation on closed file
+11:04:05,709 DEBUG - Execution of blocks returned: 0
+11:04:08,084 DEBUG - Execution of bundle returned: 0
+11:04:08,397 DEBUG - Traceback (most recent call last):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:08,397 DEBUG - self.doRollover()
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:08,397 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:08,397 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:08,397 DEBUG - Traceback (most recent call last):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:08,397 DEBUG - if self.shouldRollover(record):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:08,397 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:08,397 DEBUG - ValueError: I/O operation on closed file
+11:04:08,397 DEBUG - Traceback (most recent call last):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:08,397 DEBUG - if self.shouldRollover(record):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:08,397 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:08,397 DEBUG - ValueError: I/O operation on closed file
+11:04:08,397 DEBUG - Traceback (most recent call last):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:08,397 DEBUG - if self.shouldRollover(record):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:08,397 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:08,397 DEBUG - ValueError: I/O operation on closed file
+11:04:08,397 DEBUG - Traceback (most recent call last):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:08,397 DEBUG - if self.shouldRollover(record):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:08,397 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:08,397 DEBUG - ValueError: I/O operation on closed file
+11:04:08,397 DEBUG - Error in atexit._run_exitfuncs:
+11:04:08,397 DEBUG - Traceback (most recent call last):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:08,397 DEBUG - func(*targs, **kargs)
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:08,397 DEBUG - h.flush()
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:08,397 DEBUG - self.stream.flush()
+11:04:08,397 DEBUG - ValueError: I/O operation on closed file
+11:04:08,397 DEBUG - Error in sys.exitfunc:
+11:04:08,397 DEBUG - Traceback (most recent call last):
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:08,397 DEBUG - func(*targs, **kargs)
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:08,397 DEBUG - h.flush()
+11:04:08,397 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:08,397 DEBUG - self.stream.flush()
+11:04:08,397 DEBUG - ValueError: I/O operation on closed file
+11:04:08,506 DEBUG - Execution of blocks returned: 0
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:09,412 DEBUG - self.doRollover()
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:09,412 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:09,412 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,412 DEBUG - if self.shouldRollover(record):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,412 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Error in atexit._run_exitfuncs:
+11:04:09,412 DEBUG - Traceback (most recent call last):
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:09,412 DEBUG - func(*targs, **kargs)
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:09,412 DEBUG - h.flush()
+11:04:09,412 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:09,412 DEBUG - self.stream.flush()
+11:04:09,412 DEBUG - ValueError: I/O operation on closed file
+11:04:09,412 DEBUG - Error in sys.exitfunc:
+11:04:09,428 DEBUG - Traceback (most recent call last):
+11:04:09,428 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:09,428 DEBUG - func(*targs, **kargs)
+11:04:09,428 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:09,428 DEBUG - h.flush()
+11:04:09,428 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:09,428 DEBUG - self.stream.flush()
+11:04:09,428 DEBUG - ValueError: I/O operation on closed file
+11:04:09,537 DEBUG - Execution of blocks returned: 0
+11:04:09,834 DEBUG - Traceback (most recent call last):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:09,834 DEBUG - self.doRollover()
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:09,834 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:09,834 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:09,834 DEBUG - Traceback (most recent call last):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,834 DEBUG - if self.shouldRollover(record):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,834 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,834 DEBUG - ValueError: I/O operation on closed file
+11:04:09,834 DEBUG - Traceback (most recent call last):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,834 DEBUG - if self.shouldRollover(record):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,834 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,834 DEBUG - ValueError: I/O operation on closed file
+11:04:09,834 DEBUG - Traceback (most recent call last):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,834 DEBUG - if self.shouldRollover(record):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,834 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,834 DEBUG - ValueError: I/O operation on closed file
+11:04:09,834 DEBUG - Traceback (most recent call last):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:09,834 DEBUG - if self.shouldRollover(record):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:09,834 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:09,834 DEBUG - ValueError: I/O operation on closed file
+11:04:09,834 DEBUG - Error in atexit._run_exitfuncs:
+11:04:09,834 DEBUG - Traceback (most recent call last):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:09,834 DEBUG - func(*targs, **kargs)
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:09,834 DEBUG - h.flush()
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:09,834 DEBUG - self.stream.flush()
+11:04:09,834 DEBUG - ValueError: I/O operation on closed file
+11:04:09,834 DEBUG - Error in sys.exitfunc:
+11:04:09,834 DEBUG - Traceback (most recent call last):
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:09,834 DEBUG - func(*targs, **kargs)
+11:04:09,834 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:09,850 DEBUG - h.flush()
+11:04:09,850 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:09,850 DEBUG - self.stream.flush()
+11:04:09,850 DEBUG - ValueError: I/O operation on closed file
+11:04:09,944 DEBUG - Execution of blocks returned: 0
+11:04:10,256 DEBUG - Traceback (most recent call last):
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:10,256 DEBUG - self.doRollover()
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:10,256 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:10,256 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:10,256 DEBUG - Traceback (most recent call last):
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:10,256 DEBUG - if self.shouldRollover(record):
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:10,256 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:10,256 DEBUG - ValueError: I/O operation on closed file
+11:04:10,256 DEBUG - Traceback (most recent call last):
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:10,256 DEBUG - if self.shouldRollover(record):
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:10,256 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:10,256 DEBUG - ValueError: I/O operation on closed file
+11:04:10,256 DEBUG - Traceback (most recent call last):
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:10,256 DEBUG - if self.shouldRollover(record):
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:10,256 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:10,256 DEBUG - ValueError: I/O operation on closed file
+11:04:10,256 DEBUG - Error in atexit._run_exitfuncs:
+11:04:10,256 DEBUG - Traceback (most recent call last):
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:10,256 DEBUG - func(*targs, **kargs)
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:10,256 DEBUG - h.flush()
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:10,256 DEBUG - self.stream.flush()
+11:04:10,256 DEBUG - ValueError: I/O operation on closed file
+11:04:10,256 DEBUG - Error in sys.exitfunc:
+11:04:10,256 DEBUG - Traceback (most recent call last):
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:10,256 DEBUG - func(*targs, **kargs)
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:10,256 DEBUG - h.flush()
+11:04:10,256 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:10,256 DEBUG - self.stream.flush()
+11:04:10,256 DEBUG - ValueError: I/O operation on closed file
+11:04:10,365 DEBUG - Execution of blocks returned: 0
+11:04:11,100 DEBUG - Traceback (most recent call last):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:11,100 DEBUG - self.doRollover()
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:11,100 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:11,100 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:11,100 DEBUG - Traceback (most recent call last):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:11,100 DEBUG - if self.shouldRollover(record):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:11,100 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:11,100 DEBUG - ValueError: I/O operation on closed file
+11:04:11,100 DEBUG - Traceback (most recent call last):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:11,100 DEBUG - if self.shouldRollover(record):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:11,100 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:11,100 DEBUG - ValueError: I/O operation on closed file
+11:04:11,100 DEBUG - Traceback (most recent call last):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:11,100 DEBUG - if self.shouldRollover(record):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:11,100 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:11,100 DEBUG - ValueError: I/O operation on closed file
+11:04:11,100 DEBUG - Traceback (most recent call last):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:11,100 DEBUG - if self.shouldRollover(record):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:11,100 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:11,100 DEBUG - ValueError: I/O operation on closed file
+11:04:11,100 DEBUG - Error in atexit._run_exitfuncs:
+11:04:11,100 DEBUG - Traceback (most recent call last):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:11,100 DEBUG - func(*targs, **kargs)
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:11,100 DEBUG - h.flush()
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:11,100 DEBUG - self.stream.flush()
+11:04:11,100 DEBUG - ValueError: I/O operation on closed file
+11:04:11,100 DEBUG - Error in sys.exitfunc:
+11:04:11,100 DEBUG - Traceback (most recent call last):
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:11,100 DEBUG - func(*targs, **kargs)
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:11,100 DEBUG - h.flush()
+11:04:11,100 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:11,100 DEBUG - self.stream.flush()
+11:04:11,100 DEBUG - ValueError: I/O operation on closed file
+11:04:11,209 DEBUG - Execution of blocks returned: 0
+11:04:13,584 DEBUG - Execution of bundle returned: 0
+11:04:13,897 DEBUG - Traceback (most recent call last):
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:13,897 DEBUG - self.doRollover()
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:13,897 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:13,897 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:13,897 DEBUG - Traceback (most recent call last):
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:13,897 DEBUG - if self.shouldRollover(record):
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:13,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:13,897 DEBUG - ValueError: I/O operation on closed file
+11:04:13,897 DEBUG - Traceback (most recent call last):
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:13,897 DEBUG - if self.shouldRollover(record):
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:13,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:13,897 DEBUG - ValueError: I/O operation on closed file
+11:04:13,897 DEBUG - Traceback (most recent call last):
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:13,897 DEBUG - if self.shouldRollover(record):
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:13,897 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:13,897 DEBUG - ValueError: I/O operation on closed file
+11:04:13,897 DEBUG - Error in atexit._run_exitfuncs:
+11:04:13,897 DEBUG - Traceback (most recent call last):
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:13,897 DEBUG - func(*targs, **kargs)
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:13,897 DEBUG - h.flush()
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:13,897 DEBUG - self.stream.flush()
+11:04:13,897 DEBUG - ValueError: I/O operation on closed file
+11:04:13,897 DEBUG - Error in sys.exitfunc:
+11:04:13,897 DEBUG - Traceback (most recent call last):
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:13,897 DEBUG - func(*targs, **kargs)
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:13,897 DEBUG - h.flush()
+11:04:13,897 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:13,897 DEBUG - self.stream.flush()
+11:04:13,897 DEBUG - ValueError: I/O operation on closed file
+11:04:14,006 DEBUG - Execution of blocks returned: 0
+11:04:14,740 DEBUG - Traceback (most recent call last):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:14,740 DEBUG - self.doRollover()
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:14,740 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:14,740 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:14,740 DEBUG - Traceback (most recent call last):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:14,740 DEBUG - if self.shouldRollover(record):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:14,740 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:14,740 DEBUG - ValueError: I/O operation on closed file
+11:04:14,740 DEBUG - Traceback (most recent call last):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:14,740 DEBUG - if self.shouldRollover(record):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:14,740 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:14,740 DEBUG - ValueError: I/O operation on closed file
+11:04:14,740 DEBUG - Traceback (most recent call last):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:14,740 DEBUG - if self.shouldRollover(record):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:14,740 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:14,740 DEBUG - ValueError: I/O operation on closed file
+11:04:14,740 DEBUG - Traceback (most recent call last):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:14,740 DEBUG - if self.shouldRollover(record):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:14,740 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:14,740 DEBUG - ValueError: I/O operation on closed file
+11:04:14,740 DEBUG - Error in atexit._run_exitfuncs:
+11:04:14,740 DEBUG - Traceback (most recent call last):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:14,740 DEBUG - func(*targs, **kargs)
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:14,740 DEBUG - h.flush()
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:14,740 DEBUG - self.stream.flush()
+11:04:14,740 DEBUG - ValueError: I/O operation on closed file
+11:04:14,740 DEBUG - Error in sys.exitfunc:
+11:04:14,740 DEBUG - Traceback (most recent call last):
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:14,740 DEBUG - func(*targs, **kargs)
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:14,740 DEBUG - h.flush()
+11:04:14,740 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:14,740 DEBUG - self.stream.flush()
+11:04:14,740 DEBUG - ValueError: I/O operation on closed file
+11:04:14,850 DEBUG - Execution of blocks returned: 0
+11:04:17,225 DEBUG - Execution of bundle returned: 0
+11:04:17,537 DEBUG - Traceback (most recent call last):
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:17,537 DEBUG - self.doRollover()
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:17,537 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:17,537 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:17,537 DEBUG - Traceback (most recent call last):
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:17,537 DEBUG - if self.shouldRollover(record):
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:17,537 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:17,537 DEBUG - ValueError: I/O operation on closed file
+11:04:17,537 DEBUG - Traceback (most recent call last):
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:17,537 DEBUG - if self.shouldRollover(record):
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:17,537 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:17,537 DEBUG - ValueError: I/O operation on closed file
+11:04:17,537 DEBUG - Traceback (most recent call last):
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:17,537 DEBUG - if self.shouldRollover(record):
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:17,537 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:17,537 DEBUG - ValueError: I/O operation on closed file
+11:04:17,537 DEBUG - Error in atexit._run_exitfuncs:
+11:04:17,537 DEBUG - Traceback (most recent call last):
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:17,537 DEBUG - func(*targs, **kargs)
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:17,537 DEBUG - h.flush()
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:17,537 DEBUG - self.stream.flush()
+11:04:17,537 DEBUG - ValueError: I/O operation on closed file
+11:04:17,537 DEBUG - Error in sys.exitfunc:
+11:04:17,537 DEBUG - Traceback (most recent call last):
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:17,537 DEBUG - func(*targs, **kargs)
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:17,537 DEBUG - h.flush()
+11:04:17,537 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:17,537 DEBUG - self.stream.flush()
+11:04:17,537 DEBUG - ValueError: I/O operation on closed file
+11:04:17,646 DEBUG - Execution of blocks returned: 0
+11:04:18,381 DEBUG - Traceback (most recent call last):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:18,381 DEBUG - self.doRollover()
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:18,381 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:18,381 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:18,381 DEBUG - Traceback (most recent call last):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:18,381 DEBUG - if self.shouldRollover(record):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:18,381 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:18,381 DEBUG - ValueError: I/O operation on closed file
+11:04:18,381 DEBUG - Traceback (most recent call last):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:18,381 DEBUG - if self.shouldRollover(record):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:18,381 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:18,381 DEBUG - ValueError: I/O operation on closed file
+11:04:18,381 DEBUG - Traceback (most recent call last):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:18,381 DEBUG - if self.shouldRollover(record):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:18,381 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:18,381 DEBUG - ValueError: I/O operation on closed file
+11:04:18,381 DEBUG - Traceback (most recent call last):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:18,381 DEBUG - if self.shouldRollover(record):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:18,381 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:18,381 DEBUG - ValueError: I/O operation on closed file
+11:04:18,381 DEBUG - Error in atexit._run_exitfuncs:
+11:04:18,381 DEBUG - Traceback (most recent call last):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:18,381 DEBUG - func(*targs, **kargs)
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:18,381 DEBUG - h.flush()
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:18,381 DEBUG - self.stream.flush()
+11:04:18,381 DEBUG - ValueError: I/O operation on closed file
+11:04:18,381 DEBUG - Error in sys.exitfunc:
+11:04:18,381 DEBUG - Traceback (most recent call last):
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:18,381 DEBUG - func(*targs, **kargs)
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:18,381 DEBUG - h.flush()
+11:04:18,381 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:18,381 DEBUG - self.stream.flush()
+11:04:18,381 DEBUG - ValueError: I/O operation on closed file
+11:04:18,490 DEBUG - Execution of blocks returned: 0
+11:04:20,849 DEBUG - Execution of bundle returned: 0
+11:04:21,146 DEBUG - Traceback (most recent call last):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:21,146 DEBUG - self.doRollover()
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:21,146 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:21,146 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:21,146 DEBUG - Traceback (most recent call last):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:21,146 DEBUG - if self.shouldRollover(record):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:21,146 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:21,146 DEBUG - ValueError: I/O operation on closed file
+11:04:21,146 DEBUG - Traceback (most recent call last):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:21,146 DEBUG - if self.shouldRollover(record):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:21,146 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:21,146 DEBUG - ValueError: I/O operation on closed file
+11:04:21,146 DEBUG - Traceback (most recent call last):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:21,146 DEBUG - if self.shouldRollover(record):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:21,146 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:21,146 DEBUG - ValueError: I/O operation on closed file
+11:04:21,146 DEBUG - Traceback (most recent call last):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:21,146 DEBUG - if self.shouldRollover(record):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:21,146 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:21,146 DEBUG - ValueError: I/O operation on closed file
+11:04:21,146 DEBUG - Error in atexit._run_exitfuncs:
+11:04:21,146 DEBUG - Traceback (most recent call last):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:21,146 DEBUG - func(*targs, **kargs)
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:21,146 DEBUG - h.flush()
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:21,146 DEBUG - self.stream.flush()
+11:04:21,146 DEBUG - ValueError: I/O operation on closed file
+11:04:21,146 DEBUG - Error in sys.exitfunc:
+11:04:21,146 DEBUG - Traceback (most recent call last):
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:21,146 DEBUG - func(*targs, **kargs)
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:21,146 DEBUG - h.flush()
+11:04:21,146 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:21,146 DEBUG - self.stream.flush()
+11:04:21,146 DEBUG - ValueError: I/O operation on closed file
+11:04:21,256 DEBUG - Execution of blocks returned: 0
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:22,162 DEBUG - self.doRollover()
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:22,162 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:22,162 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,162 DEBUG - if self.shouldRollover(record):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,162 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Error in atexit._run_exitfuncs:
+11:04:22,162 DEBUG - Traceback (most recent call last):
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:22,162 DEBUG - func(*targs, **kargs)
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:22,162 DEBUG - h.flush()
+11:04:22,162 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:22,162 DEBUG - self.stream.flush()
+11:04:22,162 DEBUG - ValueError: I/O operation on closed file
+11:04:22,162 DEBUG - Error in sys.exitfunc:
+11:04:22,177 DEBUG - Traceback (most recent call last):
+11:04:22,177 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:22,177 DEBUG - func(*targs, **kargs)
+11:04:22,177 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:22,177 DEBUG - h.flush()
+11:04:22,177 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:22,177 DEBUG - self.stream.flush()
+11:04:22,177 DEBUG - ValueError: I/O operation on closed file
+11:04:22,287 DEBUG - Execution of blocks returned: 0
+11:04:22,584 DEBUG - Traceback (most recent call last):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:22,584 DEBUG - self.doRollover()
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:22,584 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:22,584 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:22,584 DEBUG - Traceback (most recent call last):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,584 DEBUG - if self.shouldRollover(record):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,584 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,584 DEBUG - ValueError: I/O operation on closed file
+11:04:22,584 DEBUG - Traceback (most recent call last):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,584 DEBUG - if self.shouldRollover(record):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,584 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,584 DEBUG - ValueError: I/O operation on closed file
+11:04:22,584 DEBUG - Traceback (most recent call last):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,584 DEBUG - if self.shouldRollover(record):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,584 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,584 DEBUG - ValueError: I/O operation on closed file
+11:04:22,584 DEBUG - Traceback (most recent call last):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,584 DEBUG - if self.shouldRollover(record):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,584 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,584 DEBUG - ValueError: I/O operation on closed file
+11:04:22,584 DEBUG - Error in atexit._run_exitfuncs:
+11:04:22,584 DEBUG - Traceback (most recent call last):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:22,584 DEBUG - func(*targs, **kargs)
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:22,584 DEBUG - h.flush()
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:22,584 DEBUG - self.stream.flush()
+11:04:22,584 DEBUG - ValueError: I/O operation on closed file
+11:04:22,584 DEBUG - Error in sys.exitfunc:
+11:04:22,584 DEBUG - Traceback (most recent call last):
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:22,584 DEBUG - func(*targs, **kargs)
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:22,584 DEBUG - h.flush()
+11:04:22,584 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:22,584 DEBUG - self.stream.flush()
+11:04:22,584 DEBUG - ValueError: I/O operation on closed file
+11:04:22,693 DEBUG - Execution of blocks returned: 0
+11:04:22,990 DEBUG - Traceback (most recent call last):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:22,990 DEBUG - self.doRollover()
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:22,990 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:22,990 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:22,990 DEBUG - Traceback (most recent call last):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,990 DEBUG - if self.shouldRollover(record):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,990 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,990 DEBUG - ValueError: I/O operation on closed file
+11:04:22,990 DEBUG - Traceback (most recent call last):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,990 DEBUG - if self.shouldRollover(record):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,990 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,990 DEBUG - ValueError: I/O operation on closed file
+11:04:22,990 DEBUG - Traceback (most recent call last):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,990 DEBUG - if self.shouldRollover(record):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,990 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,990 DEBUG - ValueError: I/O operation on closed file
+11:04:22,990 DEBUG - Traceback (most recent call last):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:22,990 DEBUG - if self.shouldRollover(record):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:22,990 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:22,990 DEBUG - ValueError: I/O operation on closed file
+11:04:22,990 DEBUG - Error in atexit._run_exitfuncs:
+11:04:22,990 DEBUG - Traceback (most recent call last):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:22,990 DEBUG - func(*targs, **kargs)
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:22,990 DEBUG - h.flush()
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:22,990 DEBUG - self.stream.flush()
+11:04:22,990 DEBUG - ValueError: I/O operation on closed file
+11:04:22,990 DEBUG - Error in sys.exitfunc:
+11:04:22,990 DEBUG - Traceback (most recent call last):
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:22,990 DEBUG - func(*targs, **kargs)
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:22,990 DEBUG - h.flush()
+11:04:22,990 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:22,990 DEBUG - self.stream.flush()
+11:04:22,990 DEBUG - ValueError: I/O operation on closed file
+11:04:23,099 DEBUG - Execution of blocks returned: 0
+11:04:23,396 DEBUG - Traceback (most recent call last):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:23,396 DEBUG - self.doRollover()
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:23,396 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:23,396 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:23,396 DEBUG - Traceback (most recent call last):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:23,396 DEBUG - if self.shouldRollover(record):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:23,396 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:23,396 DEBUG - ValueError: I/O operation on closed file
+11:04:23,396 DEBUG - Traceback (most recent call last):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:23,396 DEBUG - if self.shouldRollover(record):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:23,396 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:23,396 DEBUG - ValueError: I/O operation on closed file
+11:04:23,396 DEBUG - Traceback (most recent call last):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:23,396 DEBUG - if self.shouldRollover(record):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:23,396 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:23,396 DEBUG - ValueError: I/O operation on closed file
+11:04:23,396 DEBUG - Traceback (most recent call last):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:23,396 DEBUG - if self.shouldRollover(record):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:23,396 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:23,396 DEBUG - ValueError: I/O operation on closed file
+11:04:23,396 DEBUG - Error in atexit._run_exitfuncs:
+11:04:23,396 DEBUG - Traceback (most recent call last):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:23,396 DEBUG - func(*targs, **kargs)
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:23,396 DEBUG - h.flush()
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:23,396 DEBUG - self.stream.flush()
+11:04:23,396 DEBUG - ValueError: I/O operation on closed file
+11:04:23,396 DEBUG - Error in sys.exitfunc:
+11:04:23,396 DEBUG - Traceback (most recent call last):
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:23,396 DEBUG - func(*targs, **kargs)
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:23,396 DEBUG - h.flush()
+11:04:23,396 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:23,396 DEBUG - self.stream.flush()
+11:04:23,396 DEBUG - ValueError: I/O operation on closed file
+11:04:23,506 DEBUG - Execution of blocks returned: 0
+11:04:23,818 DEBUG - Traceback (most recent call last):
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:23,818 DEBUG - self.doRollover()
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:23,818 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:23,818 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:23,818 DEBUG - Traceback (most recent call last):
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:23,818 DEBUG - if self.shouldRollover(record):
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:23,818 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:23,818 DEBUG - ValueError: I/O operation on closed file
+11:04:23,818 DEBUG - Traceback (most recent call last):
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:23,818 DEBUG - if self.shouldRollover(record):
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:23,818 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:23,818 DEBUG - ValueError: I/O operation on closed file
+11:04:23,818 DEBUG - Traceback (most recent call last):
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:23,818 DEBUG - if self.shouldRollover(record):
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:23,818 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:23,818 DEBUG - ValueError: I/O operation on closed file
+11:04:23,818 DEBUG - Error in atexit._run_exitfuncs:
+11:04:23,818 DEBUG - Traceback (most recent call last):
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:23,818 DEBUG - func(*targs, **kargs)
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:23,818 DEBUG - h.flush()
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:23,818 DEBUG - self.stream.flush()
+11:04:23,818 DEBUG - ValueError: I/O operation on closed file
+11:04:23,818 DEBUG - Error in sys.exitfunc:
+11:04:23,818 DEBUG - Traceback (most recent call last):
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:23,818 DEBUG - func(*targs, **kargs)
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:23,818 DEBUG - h.flush()
+11:04:23,818 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:23,818 DEBUG - self.stream.flush()
+11:04:23,818 DEBUG - ValueError: I/O operation on closed file
+11:04:23,927 DEBUG - Execution of blocks returned: 0
+11:04:24,662 DEBUG - Traceback (most recent call last):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:24,662 DEBUG - self.doRollover()
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:24,662 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:24,662 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:24,662 DEBUG - Traceback (most recent call last):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:24,662 DEBUG - if self.shouldRollover(record):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:24,662 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:24,662 DEBUG - ValueError: I/O operation on closed file
+11:04:24,662 DEBUG - Traceback (most recent call last):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:24,662 DEBUG - if self.shouldRollover(record):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:24,662 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:24,662 DEBUG - ValueError: I/O operation on closed file
+11:04:24,662 DEBUG - Traceback (most recent call last):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:24,662 DEBUG - if self.shouldRollover(record):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:24,662 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:24,662 DEBUG - ValueError: I/O operation on closed file
+11:04:24,662 DEBUG - Traceback (most recent call last):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:24,662 DEBUG - if self.shouldRollover(record):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:24,662 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:24,662 DEBUG - ValueError: I/O operation on closed file
+11:04:24,662 DEBUG - Error in atexit._run_exitfuncs:
+11:04:24,662 DEBUG - Traceback (most recent call last):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:24,662 DEBUG - func(*targs, **kargs)
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:24,662 DEBUG - h.flush()
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:24,662 DEBUG - self.stream.flush()
+11:04:24,662 DEBUG - ValueError: I/O operation on closed file
+11:04:24,662 DEBUG - Error in sys.exitfunc:
+11:04:24,662 DEBUG - Traceback (most recent call last):
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:24,662 DEBUG - func(*targs, **kargs)
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:24,662 DEBUG - h.flush()
+11:04:24,662 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:24,662 DEBUG - self.stream.flush()
+11:04:24,662 DEBUG - ValueError: I/O operation on closed file
+11:04:24,771 DEBUG - Execution of blocks returned: 0
+11:04:27,146 DEBUG - Execution of bundle returned: 0
+11:04:27,459 DEBUG - Traceback (most recent call last):
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:27,459 DEBUG - self.doRollover()
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:27,459 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:27,459 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:27,459 DEBUG - Traceback (most recent call last):
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:27,459 DEBUG - if self.shouldRollover(record):
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:27,459 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:27,459 DEBUG - ValueError: I/O operation on closed file
+11:04:27,459 DEBUG - Traceback (most recent call last):
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:27,459 DEBUG - if self.shouldRollover(record):
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:27,459 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:27,459 DEBUG - ValueError: I/O operation on closed file
+11:04:27,459 DEBUG - Traceback (most recent call last):
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:27,459 DEBUG - if self.shouldRollover(record):
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:27,459 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:27,459 DEBUG - ValueError: I/O operation on closed file
+11:04:27,459 DEBUG - Error in atexit._run_exitfuncs:
+11:04:27,459 DEBUG - Traceback (most recent call last):
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:27,459 DEBUG - func(*targs, **kargs)
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:27,459 DEBUG - h.flush()
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:27,459 DEBUG - self.stream.flush()
+11:04:27,459 DEBUG - ValueError: I/O operation on closed file
+11:04:27,459 DEBUG - Error in sys.exitfunc:
+11:04:27,459 DEBUG - Traceback (most recent call last):
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:27,459 DEBUG - func(*targs, **kargs)
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:27,459 DEBUG - h.flush()
+11:04:27,459 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:27,459 DEBUG - self.stream.flush()
+11:04:27,459 DEBUG - ValueError: I/O operation on closed file
+11:04:27,568 DEBUG - Execution of blocks returned: 0
+11:04:28,349 DEBUG - Traceback (most recent call last):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:28,349 DEBUG - self.doRollover()
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:28,349 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:28,349 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:28,349 DEBUG - Traceback (most recent call last):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:28,349 DEBUG - if self.shouldRollover(record):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:28,349 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:28,349 DEBUG - ValueError: I/O operation on closed file
+11:04:28,349 DEBUG - Traceback (most recent call last):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:28,349 DEBUG - if self.shouldRollover(record):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:28,349 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:28,349 DEBUG - ValueError: I/O operation on closed file
+11:04:28,349 DEBUG - Traceback (most recent call last):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:28,349 DEBUG - if self.shouldRollover(record):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:28,349 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:28,349 DEBUG - ValueError: I/O operation on closed file
+11:04:28,349 DEBUG - Traceback (most recent call last):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:28,349 DEBUG - if self.shouldRollover(record):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:28,349 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:28,349 DEBUG - ValueError: I/O operation on closed file
+11:04:28,349 DEBUG - Error in atexit._run_exitfuncs:
+11:04:28,349 DEBUG - Traceback (most recent call last):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:28,349 DEBUG - func(*targs, **kargs)
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:28,349 DEBUG - h.flush()
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:28,349 DEBUG - self.stream.flush()
+11:04:28,349 DEBUG - ValueError: I/O operation on closed file
+11:04:28,349 DEBUG - Error in sys.exitfunc:
+11:04:28,349 DEBUG - Traceback (most recent call last):
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:28,349 DEBUG - func(*targs, **kargs)
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:28,349 DEBUG - h.flush()
+11:04:28,349 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:28,349 DEBUG - self.stream.flush()
+11:04:28,349 DEBUG - ValueError: I/O operation on closed file
+11:04:28,459 DEBUG - Execution of blocks returned: 0
+11:04:30,833 DEBUG - Execution of bundle returned: 0
+11:04:31,146 DEBUG - Traceback (most recent call last):
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:31,146 DEBUG - self.doRollover()
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:31,146 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:31,146 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:31,146 DEBUG - Traceback (most recent call last):
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:31,146 DEBUG - if self.shouldRollover(record):
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:31,146 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:31,146 DEBUG - ValueError: I/O operation on closed file
+11:04:31,146 DEBUG - Traceback (most recent call last):
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:31,146 DEBUG - if self.shouldRollover(record):
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:31,146 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:31,146 DEBUG - ValueError: I/O operation on closed file
+11:04:31,146 DEBUG - Traceback (most recent call last):
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:31,146 DEBUG - if self.shouldRollover(record):
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:31,146 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:31,146 DEBUG - ValueError: I/O operation on closed file
+11:04:31,146 DEBUG - Error in atexit._run_exitfuncs:
+11:04:31,146 DEBUG - Traceback (most recent call last):
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:31,146 DEBUG - func(*targs, **kargs)
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:31,146 DEBUG - h.flush()
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:31,146 DEBUG - self.stream.flush()
+11:04:31,146 DEBUG - ValueError: I/O operation on closed file
+11:04:31,146 DEBUG - Error in sys.exitfunc:
+11:04:31,146 DEBUG - Traceback (most recent call last):
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:31,146 DEBUG - func(*targs, **kargs)
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:31,146 DEBUG - h.flush()
+11:04:31,146 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:31,146 DEBUG - self.stream.flush()
+11:04:31,146 DEBUG - ValueError: I/O operation on closed file
+11:04:31,255 DEBUG - Execution of blocks returned: 0
+11:04:31,974 DEBUG - Traceback (most recent call last):
+11:04:31,974 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:31,974 DEBUG - self.doRollover()
+11:04:31,974 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:31,974 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:31,974 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:31,974 DEBUG - Traceback (most recent call last):
+11:04:31,974 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:31,974 DEBUG - if self.shouldRollover(record):
+11:04:31,974 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:31,974 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:31,974 DEBUG - ValueError: I/O operation on closed file
+11:04:31,974 DEBUG - Traceback (most recent call last):
+11:04:31,974 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:31,974 DEBUG - if self.shouldRollover(record):
+11:04:31,974 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:31,974 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:31,990 DEBUG - ValueError: I/O operation on closed file
+11:04:31,990 DEBUG - Traceback (most recent call last):
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:31,990 DEBUG - if self.shouldRollover(record):
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:31,990 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:31,990 DEBUG - ValueError: I/O operation on closed file
+11:04:31,990 DEBUG - Traceback (most recent call last):
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:31,990 DEBUG - if self.shouldRollover(record):
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:31,990 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:31,990 DEBUG - ValueError: I/O operation on closed file
+11:04:31,990 DEBUG - Error in atexit._run_exitfuncs:
+11:04:31,990 DEBUG - Traceback (most recent call last):
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:31,990 DEBUG - func(*targs, **kargs)
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:31,990 DEBUG - h.flush()
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:31,990 DEBUG - self.stream.flush()
+11:04:31,990 DEBUG - ValueError: I/O operation on closed file
+11:04:31,990 DEBUG - Error in sys.exitfunc:
+11:04:31,990 DEBUG - Traceback (most recent call last):
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:31,990 DEBUG - func(*targs, **kargs)
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:31,990 DEBUG - h.flush()
+11:04:31,990 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:31,990 DEBUG - self.stream.flush()
+11:04:31,990 DEBUG - ValueError: I/O operation on closed file
+11:04:32,083 DEBUG - Execution of blocks returned: 0
+11:04:34,474 DEBUG - Execution of bundle returned: 0
+11:04:34,771 DEBUG - Traceback (most recent call last):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:34,771 DEBUG - self.doRollover()
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:34,771 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:34,771 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:34,771 DEBUG - Traceback (most recent call last):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:34,771 DEBUG - if self.shouldRollover(record):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:34,771 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:34,771 DEBUG - ValueError: I/O operation on closed file
+11:04:34,771 DEBUG - Traceback (most recent call last):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:34,771 DEBUG - if self.shouldRollover(record):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:34,771 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:34,771 DEBUG - ValueError: I/O operation on closed file
+11:04:34,771 DEBUG - Traceback (most recent call last):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:34,771 DEBUG - if self.shouldRollover(record):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:34,771 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:34,771 DEBUG - ValueError: I/O operation on closed file
+11:04:34,771 DEBUG - Traceback (most recent call last):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:34,771 DEBUG - if self.shouldRollover(record):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:34,771 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:34,771 DEBUG - ValueError: I/O operation on closed file
+11:04:34,771 DEBUG - Error in atexit._run_exitfuncs:
+11:04:34,771 DEBUG - Traceback (most recent call last):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:34,771 DEBUG - func(*targs, **kargs)
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:34,771 DEBUG - h.flush()
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:34,771 DEBUG - self.stream.flush()
+11:04:34,771 DEBUG - ValueError: I/O operation on closed file
+11:04:34,771 DEBUG - Error in sys.exitfunc:
+11:04:34,771 DEBUG - Traceback (most recent call last):
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:34,771 DEBUG - func(*targs, **kargs)
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:34,771 DEBUG - h.flush()
+11:04:34,771 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:34,771 DEBUG - self.stream.flush()
+11:04:34,771 DEBUG - ValueError: I/O operation on closed file
+11:04:34,880 DEBUG - Execution of blocks returned: 0
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:35,786 DEBUG - self.doRollover()
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:35,786 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:35,786 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:35,786 DEBUG - if self.shouldRollover(record):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:35,786 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Error in atexit._run_exitfuncs:
+11:04:35,786 DEBUG - Traceback (most recent call last):
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:35,786 DEBUG - func(*targs, **kargs)
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:35,786 DEBUG - h.flush()
+11:04:35,786 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:35,786 DEBUG - self.stream.flush()
+11:04:35,786 DEBUG - ValueError: I/O operation on closed file
+11:04:35,786 DEBUG - Error in sys.exitfunc:
+11:04:35,802 DEBUG - Traceback (most recent call last):
+11:04:35,802 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:35,802 DEBUG - func(*targs, **kargs)
+11:04:35,802 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:35,802 DEBUG - h.flush()
+11:04:35,802 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:35,802 DEBUG - self.stream.flush()
+11:04:35,802 DEBUG - ValueError: I/O operation on closed file
+11:04:35,911 DEBUG - Execution of blocks returned: 0
+11:04:36,208 DEBUG - Traceback (most recent call last):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:36,208 DEBUG - self.doRollover()
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:36,208 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:36,208 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:36,208 DEBUG - Traceback (most recent call last):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:36,208 DEBUG - if self.shouldRollover(record):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:36,208 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:36,208 DEBUG - ValueError: I/O operation on closed file
+11:04:36,208 DEBUG - Traceback (most recent call last):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:36,208 DEBUG - if self.shouldRollover(record):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:36,208 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:36,208 DEBUG - ValueError: I/O operation on closed file
+11:04:36,208 DEBUG - Traceback (most recent call last):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:36,208 DEBUG - if self.shouldRollover(record):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:36,208 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:36,208 DEBUG - ValueError: I/O operation on closed file
+11:04:36,208 DEBUG - Traceback (most recent call last):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:36,208 DEBUG - if self.shouldRollover(record):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:36,208 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:36,208 DEBUG - ValueError: I/O operation on closed file
+11:04:36,208 DEBUG - Error in atexit._run_exitfuncs:
+11:04:36,208 DEBUG - Traceback (most recent call last):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:36,208 DEBUG - func(*targs, **kargs)
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:36,208 DEBUG - h.flush()
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:36,208 DEBUG - self.stream.flush()
+11:04:36,208 DEBUG - ValueError: I/O operation on closed file
+11:04:36,208 DEBUG - Error in sys.exitfunc:
+11:04:36,208 DEBUG - Traceback (most recent call last):
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:36,208 DEBUG - func(*targs, **kargs)
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:36,208 DEBUG - h.flush()
+11:04:36,208 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:36,208 DEBUG - self.stream.flush()
+11:04:36,208 DEBUG - ValueError: I/O operation on closed file
+11:04:36,318 DEBUG - Execution of blocks returned: 0
+11:04:36,630 DEBUG - Traceback (most recent call last):
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:36,630 DEBUG - self.doRollover()
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:36,630 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:36,630 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:36,630 DEBUG - Traceback (most recent call last):
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:36,630 DEBUG - if self.shouldRollover(record):
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:36,630 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:36,630 DEBUG - ValueError: I/O operation on closed file
+11:04:36,630 DEBUG - Traceback (most recent call last):
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:36,630 DEBUG - if self.shouldRollover(record):
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:36,630 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:36,630 DEBUG - ValueError: I/O operation on closed file
+11:04:36,630 DEBUG - Traceback (most recent call last):
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:36,630 DEBUG - if self.shouldRollover(record):
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:36,630 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:36,630 DEBUG - ValueError: I/O operation on closed file
+11:04:36,630 DEBUG - Error in atexit._run_exitfuncs:
+11:04:36,630 DEBUG - Traceback (most recent call last):
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:36,630 DEBUG - func(*targs, **kargs)
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:36,630 DEBUG - h.flush()
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:36,630 DEBUG - self.stream.flush()
+11:04:36,630 DEBUG - ValueError: I/O operation on closed file
+11:04:36,630 DEBUG - Error in sys.exitfunc:
+11:04:36,630 DEBUG - Traceback (most recent call last):
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:36,630 DEBUG - func(*targs, **kargs)
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:36,630 DEBUG - h.flush()
+11:04:36,630 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:36,630 DEBUG - self.stream.flush()
+11:04:36,630 DEBUG - ValueError: I/O operation on closed file
+11:04:36,739 DEBUG - Execution of blocks returned: 0
+11:04:37,474 DEBUG - Traceback (most recent call last):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:37,474 DEBUG - self.doRollover()
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:37,474 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:37,474 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:37,474 DEBUG - Traceback (most recent call last):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:37,474 DEBUG - if self.shouldRollover(record):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:37,474 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:37,474 DEBUG - ValueError: I/O operation on closed file
+11:04:37,474 DEBUG - Traceback (most recent call last):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:37,474 DEBUG - if self.shouldRollover(record):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:37,474 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:37,474 DEBUG - ValueError: I/O operation on closed file
+11:04:37,474 DEBUG - Traceback (most recent call last):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:37,474 DEBUG - if self.shouldRollover(record):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:37,474 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:37,474 DEBUG - ValueError: I/O operation on closed file
+11:04:37,474 DEBUG - Traceback (most recent call last):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:37,474 DEBUG - if self.shouldRollover(record):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:37,474 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:37,474 DEBUG - ValueError: I/O operation on closed file
+11:04:37,474 DEBUG - Error in atexit._run_exitfuncs:
+11:04:37,474 DEBUG - Traceback (most recent call last):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:37,474 DEBUG - func(*targs, **kargs)
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:37,474 DEBUG - h.flush()
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:37,474 DEBUG - self.stream.flush()
+11:04:37,474 DEBUG - ValueError: I/O operation on closed file
+11:04:37,474 DEBUG - Error in sys.exitfunc:
+11:04:37,474 DEBUG - Traceback (most recent call last):
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:37,474 DEBUG - func(*targs, **kargs)
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:37,474 DEBUG - h.flush()
+11:04:37,474 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:37,474 DEBUG - self.stream.flush()
+11:04:37,474 DEBUG - ValueError: I/O operation on closed file
+11:04:37,583 DEBUG - Execution of blocks returned: 0
+11:04:39,958 DEBUG - Execution of bundle returned: 0
+11:04:40,271 DEBUG - Traceback (most recent call last):
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:40,271 DEBUG - self.doRollover()
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:40,271 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:40,271 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:40,271 DEBUG - Traceback (most recent call last):
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:40,271 DEBUG - if self.shouldRollover(record):
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:40,271 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:40,271 DEBUG - ValueError: I/O operation on closed file
+11:04:40,271 DEBUG - Traceback (most recent call last):
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:40,271 DEBUG - if self.shouldRollover(record):
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:40,271 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:40,271 DEBUG - ValueError: I/O operation on closed file
+11:04:40,271 DEBUG - Traceback (most recent call last):
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:40,271 DEBUG - if self.shouldRollover(record):
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:40,271 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:40,271 DEBUG - ValueError: I/O operation on closed file
+11:04:40,271 DEBUG - Error in atexit._run_exitfuncs:
+11:04:40,271 DEBUG - Traceback (most recent call last):
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:40,271 DEBUG - func(*targs, **kargs)
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:40,271 DEBUG - h.flush()
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:40,271 DEBUG - self.stream.flush()
+11:04:40,271 DEBUG - ValueError: I/O operation on closed file
+11:04:40,271 DEBUG - Error in sys.exitfunc:
+11:04:40,271 DEBUG - Traceback (most recent call last):
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:40,271 DEBUG - func(*targs, **kargs)
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:40,271 DEBUG - h.flush()
+11:04:40,271 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:40,271 DEBUG - self.stream.flush()
+11:04:40,271 DEBUG - ValueError: I/O operation on closed file
+11:04:40,380 DEBUG - Execution of blocks returned: 0
+11:04:41,099 DEBUG - Traceback (most recent call last):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:41,099 DEBUG - self.doRollover()
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:41,099 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:41,099 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:41,099 DEBUG - Traceback (most recent call last):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:41,099 DEBUG - if self.shouldRollover(record):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:41,099 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:41,099 DEBUG - ValueError: I/O operation on closed file
+11:04:41,099 DEBUG - Traceback (most recent call last):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:41,099 DEBUG - if self.shouldRollover(record):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:41,099 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:41,099 DEBUG - ValueError: I/O operation on closed file
+11:04:41,099 DEBUG - Traceback (most recent call last):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:41,099 DEBUG - if self.shouldRollover(record):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:41,099 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:41,099 DEBUG - ValueError: I/O operation on closed file
+11:04:41,099 DEBUG - Traceback (most recent call last):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:41,099 DEBUG - if self.shouldRollover(record):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:41,099 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:41,099 DEBUG - ValueError: I/O operation on closed file
+11:04:41,099 DEBUG - Error in atexit._run_exitfuncs:
+11:04:41,099 DEBUG - Traceback (most recent call last):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:41,099 DEBUG - func(*targs, **kargs)
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:41,099 DEBUG - h.flush()
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:41,099 DEBUG - self.stream.flush()
+11:04:41,099 DEBUG - ValueError: I/O operation on closed file
+11:04:41,099 DEBUG - Error in sys.exitfunc:
+11:04:41,099 DEBUG - Traceback (most recent call last):
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:41,099 DEBUG - func(*targs, **kargs)
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:41,099 DEBUG - h.flush()
+11:04:41,099 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:41,099 DEBUG - self.stream.flush()
+11:04:41,099 DEBUG - ValueError: I/O operation on closed file
+11:04:41,208 DEBUG - Execution of blocks returned: 0
+11:04:43,583 DEBUG - Execution of bundle returned: 0
+11:04:43,895 DEBUG - Traceback (most recent call last):
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 72, in emit
+11:04:43,895 DEBUG - self.doRollover()
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 129, in doRollover
+11:04:43,895 DEBUG - os.rename(self.baseFilename, dfn)
+11:04:43,895 DEBUG - WindowsError: [Error 32] The process cannot access the file because it is being used by another process
+11:04:43,895 DEBUG - Traceback (most recent call last):
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:43,895 DEBUG - if self.shouldRollover(record):
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:43,895 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:43,895 DEBUG - ValueError: I/O operation on closed file
+11:04:43,895 DEBUG - Traceback (most recent call last):
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:43,895 DEBUG - if self.shouldRollover(record):
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:43,895 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:43,895 DEBUG - ValueError: I/O operation on closed file
+11:04:43,895 DEBUG - Traceback (most recent call last):
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 71, in emit
+11:04:43,895 DEBUG - if self.shouldRollover(record):
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\handlers.py", line 145, in shouldRollover
+11:04:43,895 DEBUG - self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
+11:04:43,895 DEBUG - ValueError: I/O operation on closed file
+11:04:43,895 DEBUG - Error in atexit._run_exitfuncs:
+11:04:43,895 DEBUG - Traceback (most recent call last):
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:43,895 DEBUG - func(*targs, **kargs)
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:43,895 DEBUG - h.flush()
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:43,895 DEBUG - self.stream.flush()
+11:04:43,895 DEBUG - ValueError: I/O operation on closed file
+11:04:43,895 DEBUG - Error in sys.exitfunc:
+11:04:43,895 DEBUG - Traceback (most recent call last):
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\atexit.py", line 24, in _run_exitfuncs
+11:04:43,895 DEBUG - func(*targs, **kargs)
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 1486, in shutdown
+11:04:43,895 DEBUG - h.flush()
+11:04:43,895 DEBUG - File "C:\APPS\actpython\lib\logging\__init__.py", line 746, in flush
+11:04:43,895 DEBUG - self.stream.flush()
+11:04:43,895 DEBUG - ValueError: I/O operation on closed file
+11:04:44,005 DEBUG - Execution of blocks returned: 0
+11:04:45,380 DEBUG - Execution of bundle returned: 0
+11:04:46,723 DEBUG - External process error: apt-ftparchive failed with error code 100
+11:04:46,848 DEBUG - Execution of bundle returned: 1
+11:04:47,755 DEBUG - External process error: apt-ftparchive failed with error code 100
+11:04:47,880 DEBUG - Execution of bundle returned: 1
+11:04:48,630 DEBUG - WARNING: Path 'E:\Build_E\wbernard\workspace\helium-working-java2\helium\build\components\helium-blocks\test\temp\repo' does not contain any bundles(*.deb).
+11:04:48,630 DEBUG - Creating empty repository.
+11:04:48,911 DEBUG - Execution of bundle returned: 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/src/com/nokia/helium/blocks/tests/TestBlocks.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,106 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+package com.nokia.helium.blocks.tests;
+
+import java.io.File;
+
+import com.nokia.helium.blocks.Blocks;
+import com.nokia.helium.blocks.BlocksException;
+
+import org.junit.*;
+import static org.junit.Assert.*;
+
+public class TestBlocks {
+
+ boolean blocksPresent;
+
+ @Before
+ public void setUp() {
+ // check if blocks is installed. Then test could take place.
+ try {
+ Process p = null;
+ if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
+ p = Runtime.getRuntime().exec("blocks.bat");
+ } else {
+ p = Runtime.getRuntime().exec("blocks");
+ }
+ p.getErrorStream().close();
+ p.getOutputStream().close();
+ p.getInputStream().close();
+ blocksPresent = (p.waitFor()==0);
+ } catch (Exception e) {
+ System.err.println("Blocks is not installed so unittest will be skipped: " + e);
+ }
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ /**
+ * Test the simple execution of a blocks command
+ * @throws Exception
+ */
+ @Test
+ public void test_simpleBlocksExecution() throws Exception {
+ if (blocksPresent) {
+ Blocks blocks = new Blocks();
+ blocks.execute(new String[0]);
+ }
+ }
+
+ /**
+ * Test the simple execution of a blocks command
+ * @throws Exception
+ */
+ @Test
+ public void test_simpleBlocksExecutionFails() throws Exception {
+ if (blocksPresent) {
+ Blocks blocks = new Blocks();
+ String[] args = new String[1];
+ args[0] = "non-existing-command";
+ try {
+ blocks.execute(args);
+ fail("This blocks command must fail!");
+ } catch (BlocksException e) {
+ // nothing to do
+ }
+ }
+ }
+
+ @Test
+ public void test_addWorkspace() throws Exception {
+ if (blocksPresent) {
+ Blocks blocks = new Blocks();
+ try {
+ blocks.addWorkspace(new File("not-existing-dir"), "Not existing dir.");
+ fail("This blocks command must fail!");
+ } catch (BlocksException e) {
+ // nothing to do
+ }
+ }
+ }
+
+ @Test
+ public void test_listWorkspaces() throws Exception {
+ if (blocksPresent) {
+ Blocks blocks = new Blocks();
+ blocks.listWorkspaces();
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/src/com/nokia/helium/blocks/tests/TestBundle.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,97 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.tests;
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.nokia.helium.blocks.Bundle;
+import com.nokia.helium.blocks.BundleException;
+
+/**
+ * Test bundle command interface.
+ */
+public class TestBundle {
+ boolean bundlePresent;
+
+ @Before
+ public void setUp() {
+ // check if blocks is installed. Then test could take place.
+ try {
+ Process p = null;
+ if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
+ p = Runtime.getRuntime().exec("bundle.bat");
+ } else {
+ p = Runtime.getRuntime().exec("bundle");
+ }
+ p.getErrorStream().close();
+ p.getOutputStream().close();
+ p.getInputStream().close();
+ bundlePresent = (p.waitFor()==0);
+ } catch (Exception e) {
+ System.err.println("Bundler is not installed so unittest will be skipped: " + e);
+ }
+ }
+
+ @After
+ public void tearDown() {
+ }
+
+ @Test
+ public void test_simpleBundleExecution() throws BundleException {
+ if (bundlePresent) {
+ Bundle bundle = new Bundle();
+ bundle.execute(new String[0]);
+ }
+ }
+
+ @Test
+ public void test_createIndexNullArg() {
+ if (bundlePresent) {
+ Bundle bundle = new Bundle();
+ try {
+ bundle.createRepositoryIndex(null);
+ fail("createRepositoryIndex must fail in case of invalid arg.");
+ } catch (BundleException exc) {
+ // ignore exception
+ }
+ }
+ }
+
+ @Test
+ public void test_createIndexInvalidDir() throws IOException {
+ if (bundlePresent) {
+ Bundle bundle = new Bundle();
+ try {
+ File file = File.createTempFile("invalid", ".dir");
+ file.deleteOnExit();
+ bundle.createRepositoryIndex(file);
+ fail("createRepositoryIndex must fail in case of invalid arg.");
+ } catch (BundleException exc) {
+ // ignore exception
+ }
+ }
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/src/com/nokia/helium/blocks/tests/TestGroupStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.tests;
+
+import org.junit.Test;
+
+import com.nokia.helium.blocks.GroupListStreamConsumer;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests related to the GroupStreamConsumer class.
+ */
+public class TestGroupStreamConsumer {
+
+ @Test
+ public void parsingOfData() {
+ GroupListStreamConsumer consumer = new GroupListStreamConsumer();
+ consumer.consumeLine("");
+ consumer.consumeLine(" My group");
+ consumer.consumeLine(" My second group");
+ consumer.consumeLine("");
+ assertEquals(consumer.getGroups().size(), 2);
+ assertEquals(consumer.getGroups().get(0).getName(), "My group");
+ assertEquals(consumer.getGroups().get(1).getName(), "My second group");
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/src/com/nokia/helium/blocks/tests/TestRepositoryListStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.tests;
+
+import org.junit.Test;
+
+import com.nokia.helium.blocks.RepositoryListStreamConsumer;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests related to the GroupStreamConsumer class.
+ */
+public class TestRepositoryListStreamConsumer {
+
+ @Test
+ public void parsingOfData() {
+ RepositoryListStreamConsumer consumer = new RepositoryListStreamConsumer();
+ consumer.consumeLine("1");
+ consumer.consumeLine(" Name: sbs_22");
+ consumer.consumeLine(" URI: file:///e:/repo1");
+ consumer.consumeLine("");
+ consumer.consumeLine("2");
+ consumer.consumeLine(" Name: sbs_23");
+ consumer.consumeLine(" URI: file:///e:/repo2");
+ consumer.consumeLine("");
+ assertEquals(consumer.getRepositories().size(), 2);
+ assertEquals(consumer.getRepositories().get(0).getName(), "sbs_22");
+ assertEquals(consumer.getRepositories().get(0).getId(), 1);
+ assertEquals(consumer.getRepositories().get(0).getUrl(), "file:///e:/repo1");
+ assertEquals(consumer.getRepositories().get(1).getName(), "sbs_23");
+ assertEquals(consumer.getRepositories().get(1).getId(), 2);
+ assertEquals(consumer.getRepositories().get(1).getUrl(), "file:///e:/repo2");
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/src/com/nokia/helium/blocks/tests/TestSearchStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.tests;
+
+import org.junit.Test;
+
+import com.nokia.helium.blocks.SearchStreamConsumer;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests related to the SearchStreamConsumer class.
+ */
+public class TestSearchStreamConsumer {
+
+ @Test
+ public void parsingOfInvalidData() {
+ SearchStreamConsumer consumer = new SearchStreamConsumer();
+ consumer.consumeLine("");
+ consumer.consumeLine("foo-bar");
+ consumer.consumeLine("bar");
+ assertEquals(consumer.getSearchResults().size(), 0);
+ }
+
+ @Test
+ public void parsingOfValidData() {
+ SearchStreamConsumer consumer = new SearchStreamConsumer();
+ consumer.consumeLine("");
+ consumer.consumeLine("foo.src - n/a");
+ consumer.consumeLine("foo-dev.src - n/a");
+ assertEquals(consumer.getSearchResults().size(), 2);
+ assertEquals(consumer.getSearchResults().get(0), "foo.src");
+ assertEquals(consumer.getSearchResults().get(1), "foo-dev.src");
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/blocks/tests/src/com/nokia/helium/blocks/tests/TestWorkspaceListSteamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,66 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.blocks.tests;
+
+import org.junit.*;
+
+import com.nokia.helium.blocks.Workspace;
+import com.nokia.helium.blocks.WorkspaceListStreamConsumer;
+
+import static org.junit.Assert.*;
+
+public class TestWorkspaceListSteamConsumer {
+
+ @Test
+ public void simpleParsing() {
+ WorkspaceListStreamConsumer consumer = new WorkspaceListStreamConsumer();
+ consumer.consumeLine("");
+ consumer.consumeLine("foo");
+ consumer.consumeLine("bar");
+ assertEquals(consumer.getWorkspaces().length, 0);
+ }
+
+ @Test
+ public void simpleWorkspaceParsing() {
+ WorkspaceListStreamConsumer consumer = new WorkspaceListStreamConsumer();
+ consumer.consumeLine("1");
+ consumer.consumeLine(" name: foobar");
+ consumer.consumeLine(" path: C:\\workspace\\foo");
+ consumer.consumeLine("");
+ assertEquals(consumer.getWorkspaces().length, 1);
+ }
+
+ @Test
+ public void realWorkspaceParsing() {
+ WorkspaceListStreamConsumer consumer = new WorkspaceListStreamConsumer();
+ consumer.consumeLine("1");
+ consumer.consumeLine(" name: foo");
+ consumer.consumeLine(" path: C:\\workspaces\\foo");
+ consumer.consumeLine("");
+ consumer.consumeLine("2*");
+ consumer.consumeLine(" name: foobar");
+ consumer.consumeLine(" path: C:\\workspaces\\tests");
+ consumer.consumeLine("");
+ Workspace[] ws = consumer.getWorkspaces();
+ assertEquals(ws.length, 2);
+ assertEquals(ws[0].getName(), "foo");
+ assertEquals(ws[0].getLocation().toString(), "C:\\workspaces\\foo");
+ assertEquals(ws[1].getName(), "foobar");
+ assertEquals(ws[1].getLocation().toString(), "C:\\workspaces\\tests");
+ }
+
+}
--- a/buildframework/helium/sf/java/core/ivy.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/ivy.xml Mon Oct 18 10:23:52 2010 +0100
@@ -36,5 +36,7 @@
<dependency org="org.apache.commons" name="commons-lang" rev="2.4" />
<dependency org="net.sourceforge.fmpp" name="fmpp" rev="0.9.13" />
<dependency org="dom4j" name="dom4j" rev="latest.integration" />
+ <dependency org="com.nokia.helium" name="helium-antdata" rev="latest.integration" />
+ <dependency org="com.nokia.helium" name="helium-antlint" rev="latest.integration" />
</dependencies>
</ivy-module>
--- a/buildframework/helium/sf/java/core/src/com/nokia/helium/core/MessageCreationException.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/MessageCreationException.java Mon Oct 18 10:23:52 2010 +0100
@@ -19,18 +19,26 @@
package com.nokia.helium.core;
/**
- * Exception class for Messagecreation implementation
+ * Exception class for Message creation implementation
*
*/
public class MessageCreationException extends Exception {
+ private static final long serialVersionUID = 330899302955104898L;
/**
- * Constructor
- *
- * @exception - exception to be processed.
+ * Create a MessageCreationException with an error message
+ * @param message the error message.
*/
+ public MessageCreationException(String message) {
+ super("Message Creation Error: " + message);
+ }
- public MessageCreationException(String exception) {
- super("Message Creation Error: " + exception);
+ /**
+ * Creating a MessageCreationException with a message and a cause.
+ * @param message the message
+ * @param cause the root cause
+ */
+ public MessageCreationException(String message, Throwable cause) {
+ super("Message Creation Error: " + message, cause);
}
}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/HeliumLogger.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.helium.core.ant;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+
+/**
+ * Logger class that can connect to Ant and log information regarding to skipped
+ * targets.
+ *
+ */
+public class HeliumLogger extends DefaultLogger {
+
+ private static final String INTERNALPROPERTY = "internal.";
+ private Project project;
+
+ /**
+ * Triggered when a target starts.
+ */
+ public void targetStarted(BuildEvent event) {
+ project = event.getProject();
+
+ /** The "if" condition to test on execution. */
+ String ifCondition = event.getTarget().getIf();
+ /** The "unless" condition to test on execution. */
+ String unlessCondition = event.getTarget().getUnless();
+
+ super.targetStarted(event);
+
+ /**
+ * if the target is not going to execute (due to 'if' or 'unless'
+ * conditions) print a message telling the user why it is not going to
+ * execute
+ **/
+ if (ifCondition != null && !isPropertyAvailable(ifCondition)) {
+ if (ifCondition.startsWith(INTERNALPROPERTY)) {
+ String enableProperty = ifCondition.substring(INTERNALPROPERTY
+ .length());
+ project.log("Skipped because property '" + enableProperty
+ + "' not set to 'true'.", Project.MSG_INFO);
+ } else {
+ project.log("Skipped because property '"
+ + project.replaceProperties(ifCondition)
+ + "' is not set.", Project.MSG_INFO);
+ }
+
+ } else if (unlessCondition != null
+ && isPropertyAvailable(unlessCondition)) {
+ if (unlessCondition.startsWith(INTERNALPROPERTY)) {
+ String enableProperty = unlessCondition
+ .substring(INTERNALPROPERTY.length());
+ project.log("Skipped because property '" + enableProperty
+ + "' is set.", Project.MSG_INFO);
+ } else {
+ project.log(
+ "Skipped because property '"
+ + project.replaceProperties(unlessCondition)
+ + "' set.", Project.MSG_INFO);
+ }
+ }
+ }
+
+ /**
+ * Method to verify whether the given property is available in the project
+ * or not.
+ *
+ * @param propertyName
+ * the name of the property to verify.
+ * @return true, if the property available and is set; otherwise false.
+ */
+ private boolean isPropertyAvailable(String propertyName) {
+ return project.getProperty(project.replaceProperties(propertyName)) != null;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/ResourceCollectionUtils.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.core.ant;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.ResourceCollection;
+
+/**
+ * This utility class provides a set of functions to manipulate Ant
+ * ResourceCollection.
+ *
+ */
+public final class ResourceCollectionUtils {
+
+ /**
+ * Private constructor to make sure the class is never
+ * Instantiated.
+ */
+ private ResourceCollectionUtils() { }
+
+ /**
+ * Extract the first file form the resource collection matching the pattern.
+ * Returns null if not found.
+ * @param resourceCollection
+ * @param pattern a regular expression as a string
+ * @return the first resource matching, or null if not found
+ */
+ public static File getFile(ResourceCollection resourceCollection, String pattern) {
+ return getFile(resourceCollection, Pattern.compile(pattern));
+ }
+
+ /**
+ * Extract the first file form the resource collection matching the pattern.
+ * Returns null if not found.
+ * @param resourceCollection
+ * @param pattern a regular expression as a compile pattern
+ * @return the first resource matching, or null if not found
+ */
+ @SuppressWarnings("unchecked")
+ public static File getFile(ResourceCollection resourceCollection, Pattern pattern) {
+ Iterator<Resource> ri = (Iterator<Resource>)resourceCollection.iterator();
+ while (ri.hasNext()) {
+ Resource resource = ri.next();
+ if (pattern.matcher(resource.toString()).matches()) {
+ return new File(resource.toString());
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get the ResourceCollection as a list of files.
+ * Returns null if not found.
+ * @param resourceCollection
+ * @return a list of files.
+ */
+ @SuppressWarnings("unchecked")
+ public static List<File> getFiles(ResourceCollection resourceCollection) {
+ List<File> files = new ArrayList<File>();
+ Iterator<Resource> ri = (Iterator<Resource>)resourceCollection.iterator();
+ while (ri.hasNext()) {
+ files.add(new File(ri.next().toString()));
+ }
+ return files;
+ }
+
+}
--- a/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -28,6 +28,7 @@
<taskdef name="python" classname="com.nokia.helium.core.ant.taskdefs.PythonTask"/>
<taskdef name="retry" classname="com.nokia.helium.core.ant.taskdefs.RetryTask"/>
<taskdef name="getfreedrive" classname="com.nokia.helium.core.ant.taskdefs.GetFreeDriveTask"/>
+ <taskdef name="resourceaccess" classname="com.nokia.helium.core.ant.taskdefs.ResourceAccessTask"/>
<!-- Type definition -->
<typedef name="hasSeverity" classname="com.nokia.helium.core.ant.conditions.XMLLogCondition"/>
--- a/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/helium.antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/helium.antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -25,9 +25,13 @@
Ant task definition declarations.
</description>
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
- <typedef name="finaltargetdef" classname="com.nokia.helium.core.ant.types.HlmFinalTargetDef"/>
-
+ <typedef name="finaltargetdef" classname="com.nokia.helium.core.ant.types.HlmFinalTargetDef" uri="http://www.nokia.com/helium"/>
+ <typedef name="postbuildqualitycheck" classname="com.nokia.helium.core.ant.types.PostBuildQualityCheckAction" uri="http://www.nokia.com/helium"/>
+ <typedef name="helpdef" classname="com.nokia.helium.core.ant.types.HelpDef" uri="http://www.nokia.com/helium"/>
+
<hlm:deflist id="helium-core.list">
- <finaltargetdef/>
+ <hlm:postbuildqualitycheck/>
+ <hlm:helpdef/>
+ <hlm:finaltargetdef/>
</hlm:deflist>
</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/taskdefs/GetValueFromVariableSetTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/taskdefs/GetValueFromVariableSetTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -44,6 +44,7 @@
* </hlm:getVariableValue>
* </pre>
*
+ * @ant.task category="Core"
* @ant.task name="getVariableValue"
*/
public class GetValueFromVariableSetTask extends Task {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/taskdefs/ResourceAccessTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,195 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.helium.core.ant.taskdefs;
+
+import java.io.RandomAccessFile;
+import java.nio.channels.FileChannel;
+import java.nio.channels.FileLock;
+import java.io.File;
+import java.util.HashMap;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.Sequential;
+
+/**
+ * This class implements the functionality to provide sequential access of
+ * resources. Resources access could be controled by providing a unique lock name
+ * and when try to access the resource call this task with locking to true so that
+ * no other threads / process can access the same resource at the same time.
+ *
+ * Examples:
+ * <pre>
+ * <target name="locksubst">
+ * <hlm:resourceaccess lockname="subst" noOfRetry="-1">
+ * <subst/>
+ * </hlm:resourceaccess>
+ * </target>
+ * </pre>
+ * @ant.task name="resourceaccess" category="Core"
+ */
+public class ResourceAccessTask extends Sequential {
+
+ private static HashMap<String, FileLock> lockMap =
+ new HashMap<String, FileLock>();
+ private static Object mutexObject = new Object();
+ private int noOfRetry = -1;
+ private String lockName;
+ private File baseDirectory;
+ private long interval = 1000;
+ private FileLock fileLock;
+
+ /*
+ * Default Constructor
+ */
+ public ResourceAccessTask() {
+ String tempDirectory = System.getProperty("java.io.tmpdir");
+ baseDirectory = new File(tempDirectory);
+ }
+
+ /*
+ * Helper function to set the interval
+ * @param intervalValue - waiting period till to try next time.
+ */
+ public void setInterval(Long intervalValue) {
+ interval = intervalValue;
+ }
+
+ /*
+ * Helper function to retry as many times
+ * @param retry - no. of times to retry before throwing
+ * LockAccessException
+ */
+ public void setNoOfRetry(int retry) {
+ noOfRetry = retry;
+ }
+
+ /*
+ * A unique lock name for a specific task to be run
+ * sequential.
+ * @param name of the lock to do sequential task.
+ */
+ public void setLockName(String name) {
+ lockName = name;
+ }
+
+ /*
+ * Base directory for lock file creation.
+ * @param dir, directory in which the lock file to be created
+ * defaults to temporary directory.
+ */
+ public void setBaseDirectory(File dir) {
+ baseDirectory = dir;
+ }
+
+ /*
+ * Function acquires the lock on the specified lock name.
+ */
+ public void acquireLock() {
+ File file = new File(baseDirectory, lockName);
+ if (! file.exists()) {
+ FileOutputStream stream = null;
+ try {
+ stream = new FileOutputStream(file);
+ stream.write("do not edit \n lock processing".getBytes());
+ stream.close();
+ } catch (FileNotFoundException e) {
+ throw new BuildException("interrupted during waiting period");
+ } catch (IOException e) {
+ throw new BuildException("I/O exception during creating lock for file: " + file);
+ }
+ }
+ try {
+ FileChannel channel = new RandomAccessFile(new File(baseDirectory,
+ lockName), "rw").getChannel();
+ boolean lockAcquired = false;
+ int i = 0;
+ while (!lockAcquired) {
+ try {
+ synchronized (mutexObject) {
+ if (lockMap.get(lockName) == null) {
+ if ( noOfRetry != -1 && i >= noOfRetry) {
+ throw new BuildException("lock not acquired");
+ }
+ i += 1;
+ fileLock = channel.lock();
+ lockAcquired = true;
+ lockMap.put(lockName, fileLock);
+ } else {
+ if ( noOfRetry != -1 && i >= noOfRetry) {
+ throw new BuildException("lock not acquired");
+ }
+ try {
+ Thread.sleep(interval);
+ } catch (InterruptedException e) {
+ throw new BuildException("interrupted during waiting period");
+ }
+ i += 1;
+ }
+ }
+ } catch (IOException e) {
+ throw new BuildException(e.getMessage());
+ } catch (java.nio.channels.OverlappingFileLockException jex) {
+ try {
+ Thread.sleep(interval);
+ } catch (InterruptedException e) {
+ throw new BuildException("interrupted during waiting period");
+ }
+ }
+ }
+ } catch (FileNotFoundException e) {
+ throw new BuildException("interrupted during waiting period");
+ }
+ }
+
+ /*
+ * Function to release the lock.
+ */
+ public void releaseLock() {
+ try {
+ synchronized (mutexObject) {
+ FileLock fileLock = lockMap.get(lockName);
+ if (fileLock == null) {
+ throw new BuildException("releasing without trying to lock resource: " + lockName);
+ }
+ lockMap.remove(lockName);
+ fileLock.release();
+ }
+ } catch (IOException e) {
+ throw new BuildException("IOException during releasing lock");
+ }
+ }
+
+ public void execute() {
+ if (!baseDirectory.exists()) {
+ throw new BuildException("base directory of resource access task not exists");
+ }
+ if (lockName == null) {
+ throw new BuildException("lock name should not "
+ + "be null during releasing the lock");
+ }
+ acquireLock();
+ try {
+ super.execute();
+ } finally {
+ releaseLock();
+ }
+ }
+}
\ No newline at end of file
--- a/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/FMPPMessage.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/FMPPMessage.java Mon Oct 18 10:23:52 2010 +0100
@@ -20,8 +20,8 @@
import java.io.File;
import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
-import org.apache.log4j.Logger;
import fmpp.tools.AntTask;
import fmpp.tools.AntTask.AntAttributeSubstitution;
@@ -37,22 +37,19 @@
*
* Example 1:
* <pre>
- * <hlm:fmppMessage target="diamonds" sourceFile="tool.xml.ftl">
+ * <hlm:fmppMessage sourceFile="tool.xml.ftl">
* <data expandProperties="yes">
* ant: antProperties()
* </data>
* </hlm:fmppMessage>
* </pre>
+ *
* @ant.type name="fmppMessage" category="Core"
*/
public class FMPPMessage extends DataType implements Message {
- private File outputFile;
-
private AntTask task = new AntTask();
- private Logger log = Logger.getLogger(FMPPMessage.class);
-
public void setSourceFile(File sourceFile) {
if (!sourceFile.exists()) {
throw new BuildException("input file : " + sourceFile + " doesn't exists");
@@ -79,18 +76,18 @@
InputStream stream = null;
try {
task.setProject(getProject());
- outputFile = File.createTempFile("fmppmessage", ".xml");
+ File outputFile = File.createTempFile("fmppmessage", ".xml");
outputFile.deleteOnExit();
task.setTaskName("fmpp");
task.setOutputFile(outputFile);
task.execute();
- log.debug("outputfile in getinputstream: " + outputFile);
+ log("Temp output file for template rendering: " + outputFile, Project.MSG_DEBUG);
stream = new FileInputStream(outputFile);
} catch (BuildException bex) {
- throw new MessageCreationException(bex.getMessage());
+ throw new MessageCreationException(bex.getMessage(), bex);
}
catch (IOException iex) {
- throw new MessageCreationException(iex.getMessage());
+ throw new MessageCreationException(iex.getMessage(), iex);
}
return stream;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/HelpDef.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.helium.core.ant.types;
+
+import java.util.Iterator;
+
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.BuildLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.ant.PostBuildAction;
+
+/**
+ *
+ */
+public class HelpDef extends DataType implements PostBuildAction {
+
+ /**
+ *
+ * @param project Object of the project
+ * @param targetNames Array of target names to execute
+ *
+ */
+ public void executeOnPostBuild(Project project, String[] targetNames) {
+ String firstTarget;
+ // take target
+ if (targetNames != null && targetNames.length > 0) {
+ firstTarget = targetNames[0];
+ }
+ // no target, so set the default one
+ else {
+ firstTarget = "help";
+ }
+
+ // If 'help' target is called, just run that and set other
+ // target names as a property
+ if (firstTarget.equals("help")) {
+ displayHelp(project, targetNames, firstTarget);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private void displayHelp(Project project, String[] targetNames, String firstTarget) {
+ if (targetNames.length > 1) {
+ project.setProperty("help.item", targetNames[1]);
+ }
+
+ // Set Emacs mode to true for all listeners, so that help text does
+ // not have [echo] at the start of each line
+ Iterator iter = project.getBuildListeners().iterator();
+ while (iter.hasNext()) {
+ BuildListener listener = (BuildListener) iter.next();
+ if (listener instanceof BuildLogger) {
+ BuildLogger logger = (BuildLogger) listener;
+ logger.setEmacsMode(true);
+ }
+ }
+
+ // Run the 'help' target
+ project.executeTarget(firstTarget);
+ }
+}
--- a/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/HlmListenerDef.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/HlmListenerDef.java Mon Oct 18 10:23:52 2010 +0100
@@ -17,7 +17,9 @@
package com.nokia.helium.core.ant.types;
-import org.apache.log4j.Logger;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildListener;
import org.apache.tools.ant.Project;
@@ -33,22 +35,64 @@
public class HlmListenerDef extends DataType implements PreBuildAction {
private String classname;
- private Logger log = Logger.getLogger(HlmListenerDef.class);
+ private boolean preappend;
+ /**
+ * The classname of the BuildListener to instantiate and register
+ * to the project..
+ * @param preappend
+ */
public void setClassname(String classname) {
this.classname = classname;
}
-
+
+ /**
+ * Defines if the listener should be added at the end of
+ * the list or always appended at the beguining of the list
+ * just after the logger.
+ * @param preappend
+ */
+ public void setPreappend(boolean preappend) {
+ this.preappend = preappend;
+ }
+
/**
* Register given listener to the project.
*/
+ @SuppressWarnings("unchecked")
public void executeOnPreBuild(Project project, String[] targetNames) {
+ if (classname == null) {
+ throw new BuildException("classname attribute has not been defined.");
+ }
try {
Class<?> listenerClass = Class.forName(classname);
BuildListener listener = (BuildListener) listenerClass
.newInstance();
- project.addBuildListener(listener);
- log.debug(classname + " is registered");
+
+ if (preappend) {
+ Vector<BuildListener> listeners = (Vector<BuildListener>)project.getBuildListeners();
+ for (BuildListener removeListener : listeners) {
+ project.removeBuildListener(removeListener);
+ }
+ // Always add the listener as after the first element which should be
+ // the logger.
+ if (listeners.size() > 0) {
+ listeners.add(1, listener);
+ } else {
+ // this is really unlikely to happen
+ listeners.add(listener);
+ }
+ for (BuildListener addListener : listeners) {
+ project.addBuildListener(addListener);
+ }
+
+ } else {
+ project.addBuildListener(listener);
+ }
+ // Trigger that build has started under the listener,
+ // so initialization could happen.
+ listener.buildStarted(new BuildEvent(project));
+ log(classname + " is registered", Project.MSG_DEBUG);
} catch (ClassNotFoundException ex) {
throw new BuildException("Class not found exception:"
+ ex.getMessage(), ex);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/PostBuildQualityCheckAction.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,361 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.helium.core.ant.types;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.ant.data.AntFile;
+import com.nokia.helium.ant.data.Database;
+import com.nokia.helium.ant.data.ProjectMeta;
+import com.nokia.helium.ant.data.PropertyCommentMeta;
+import com.nokia.helium.ant.data.PropertyMeta;
+import com.nokia.helium.ant.data.RootAntObjectMeta;
+import com.nokia.helium.ant.data.TargetMeta;
+import com.nokia.helium.antlint.ant.AntlintException;
+import com.nokia.helium.antlint.ant.Reporter;
+import com.nokia.helium.antlint.ant.Severity;
+import com.nokia.helium.antlint.ant.types.Check;
+import com.nokia.helium.antlint.ant.types.CheckPropertyTypeAndValueMismatch;
+import com.nokia.helium.core.ant.PostBuildAction;
+
+/**
+ * <code>PostBuildQualityCheckAction</code> is run as a post build action to report user
+ * configurations related to Helium targets and properties usage.
+ *
+ * <p>
+ * This class currently reports following :
+ * <ul>
+ * <li>Use of deprecated Helium targets.</li>
+ * <li>Use of private Helium targets.</li>
+ * <li>Use of deprecated Helium properties.</li>
+ * <li>Override of private Helium properties.</li>
+ * <li>Invalid property types/values set for Helium properties</li>
+ * </ul>
+ * </p>
+ */
+public class PostBuildQualityCheckAction extends DataType implements PostBuildAction, Reporter {
+ private static final String DEPRECATED = "deprecated:";
+ private Set<String> output = new LinkedHashSet<String>();
+ private String heliumPath;
+ private Database publicScopeDb;
+ private Database privateScopeDb;
+
+ /**
+ * Method logs a configuration report about usage of helium targets and
+ * properties.
+ *
+ * @param project Is the Ant project.
+ * @param targetNames Is an array of target names.
+ */
+ public void executeOnPostBuild(Project project, String[] targetNames) {
+
+ if (project.getProperty("helium.dir") != null) {
+ try {
+ setHeliumPath(new File(project.getProperty("helium.dir")).getCanonicalPath());
+ publicScopeDb = new Database(project);
+ privateScopeDb = new Database(project, "private");
+
+ // Get list of targets which are called either by antcall or
+ // runtarget
+ List<String> antCallTargets = getAntCallTargets(project);
+ checkDeprecatedHeliumTargets(antCallTargets, project);
+ checkPrivateHeliumTargets(antCallTargets, project);
+
+ // Get list of customer defined properties
+ List<String> customerProps = getCustomerProperties(project);
+ checkInvalidProperties(customerProps, project);
+ checkOverriddenProperties(customerProps, project);
+ checkDeprecatedProperties(customerProps, project);
+
+ if (!output.isEmpty()) {
+ log("*** Configuration report ***", Project.MSG_INFO);
+ for (String outputStr : output) {
+ log(outputStr, Project.MSG_INFO);
+ }
+ }
+ } catch (IOException e) {
+ log(e.getMessage(), Project.MSG_WARN);
+ }
+ } else {
+ log("Configuration report cannot be generated because 'helium.dir' property is not defined.",
+ Project.MSG_VERBOSE);
+ }
+ }
+
+ /**
+ * Return the Helium path.
+ *
+ * @return The helium path.
+ */
+ public String getHeliumPath() {
+ return heliumPath;
+ }
+
+ /**
+ * Set helium path.
+ *
+ * @param heliumPath is the path to set
+ */
+ public void setHeliumPath(String heliumPath) {
+ this.heliumPath = heliumPath;
+ }
+
+ /**
+ * Method checks for incorrect values, set for boolean/integer type properties.
+ *
+ * @param customerProps Is a list of customer defined properties
+ * @param project Is the Ant project.
+ */
+ private void checkInvalidProperties(List<String> customerProps, Project project) {
+ Check check = new CheckPropertyTypeAndValueMismatch();
+ check.setReporter(this);
+ check.setSeverity((Severity) Severity.getInstance(Severity.class, "warning"));
+ for (AntFile antFile : privateScopeDb.getAntFiles()) {
+ try {
+ check.setAntFile(antFile);
+ check.run();
+ } catch (AntlintException aex) {
+ log(aex.getMessage(), Project.MSG_WARN);
+ }
+ }
+ }
+
+ /**
+ * Method checks for overridden of private scope helium properties.
+ *
+ * @param customerProps A list of customer defined properties.
+ * @param project Is the Ant project.
+ */
+ private void checkOverriddenProperties(List<String> customerProps, Project project) {
+ for (PropertyMeta propertyMeta : privateScopeDb.getProperties()) {
+ if (propertyMeta.getLocation().contains(getHeliumPath())
+ && propertyMeta.getScope().equals("private")
+ && customerProps.contains(propertyMeta.getName())) {
+ output.add("Warning: " + propertyMeta.getName() + " property has been overridden");
+ }
+ }
+ for (PropertyCommentMeta propertyCommentMeta : privateScopeDb.getCommentProperties()) {
+ if (propertyCommentMeta.getLocation().contains(getHeliumPath())
+ && propertyCommentMeta.getScope().equals("private")
+ && customerProps.contains(propertyCommentMeta.getName())) {
+ output.add("Warning: " + propertyCommentMeta.getName()
+ + " property has been overridden");
+ }
+ }
+ }
+
+ /**
+ * Method checks for use of deprecated helium properties.
+ *
+ * @param customerProps Is a list of customer defined properties.
+ * @param project Is the Ant project.
+ */
+ private void checkDeprecatedProperties(List<String> customerProps, Project project) {
+ // check for deprecated properties
+ for (PropertyMeta propertyMeta : privateScopeDb.getProperties()) {
+ if (propertyMeta.getLocation().contains(getHeliumPath())
+ && (!propertyMeta.getDeprecated().equals(""))
+ && customerProps.contains(propertyMeta.getName())) {
+ output.add("Warning: "
+ + propertyMeta.getName()
+ + " property has been deprecated "
+ + propertyMeta.getDeprecated()
+ + "."
+ + propertyMeta.getSummary().substring(
+ propertyMeta.getSummary().lastIndexOf(DEPRECATED)
+ + DEPRECATED.length()));
+ }
+ }
+
+ for (PropertyCommentMeta propertyCommentMeta : privateScopeDb.getCommentProperties()) {
+ if (propertyCommentMeta.getLocation().contains(getHeliumPath())
+ && (!propertyCommentMeta.getDeprecated().equals(""))
+ && customerProps.contains(propertyCommentMeta.getName())) {
+ output.add("Warning: "
+ + propertyCommentMeta.getName()
+ + " property has been deprecated "
+ + propertyCommentMeta.getDeprecated()
+ + "."
+ + propertyCommentMeta.getSummary().substring(
+ propertyCommentMeta.getSummary().lastIndexOf(DEPRECATED)
+ + DEPRECATED.length()));
+ }
+ }
+ }
+
+ /**
+ * Method checks for use of deprecated helium targets.
+ *
+ * @param antCallTargets A list of targets referred by antcall/runtarget.
+ * @param project Is the Ant project
+ */
+ private void checkDeprecatedHeliumTargets(List<String> antCallTargets, Project project) {
+ for (String targetName : antCallTargets) {
+ TargetMeta targetMeta = getHeliumTarget(targetName, publicScopeDb);
+ if (targetMeta != null && !targetMeta.getDeprecated().trim().isEmpty()) {
+ output.add("Warning: " + targetMeta.getName() + " target has been deprecated. "
+ + targetMeta.getDeprecated() + ".");
+ }
+ }
+ // check in dependencies
+ for (TargetMeta targetMeta : publicScopeDb.getTargets()) {
+ if (!targetMeta.getLocation().contains(getHeliumPath())) {
+ List<String> dependencies = targetMeta.getDepends();
+ for (String targetName : dependencies) {
+ TargetMeta tm = getHeliumTarget(targetName, publicScopeDb);
+ if (tm != null && !tm.getDeprecated().trim().isEmpty()) {
+ output.add("Warning: " + tm.getName() + " target has been deprecated. "
+ + tm.getDeprecated() + ".");
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Method checks for the use of private helium targets.
+ *
+ * @param antCallTargets A list of targets referred by antcall/runtarget.
+ * @param project Is the Ant project.
+ */
+ private void checkPrivateHeliumTargets(List<String> antCallTargets, Project project) {
+ for (TargetMeta targetMeta : privateScopeDb.getTargets()) {
+ if (targetMeta.getLocation().contains(getHeliumPath())
+ && targetMeta.getScope().equals("private")
+ && antCallTargets.contains(targetMeta.getName())) {
+ output.add("Warning: " + targetMeta.getName()
+ + " is private and should only be called by helium");
+ }
+ }
+ // check in dependencies
+ for (TargetMeta targetMeta : publicScopeDb.getTargets()) {
+ if (!targetMeta.getLocation().contains(getHeliumPath())) {
+ List<String> dependencies = targetMeta.getDepends();
+ for (String targetName : dependencies) {
+ TargetMeta tm = getHeliumTarget(targetName, privateScopeDb);
+ if (tm != null && tm.getScope().equals("private")) {
+ output.add("Warning: " + tm.getName()
+ + " is private and should only be called by helium");
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Method returns a list of targets referred by antcall/runtarget.
+ *
+ * @param project Is the Ant project.
+ * @return A list of targets referred by antcall/runtarget
+ */
+ private List<String> getAntCallTargets(Project project) {
+ List<String> antCallTargets = new ArrayList<String>();
+ List<AntFile> customerAntFiles = getCustomerAntFiles(project);
+ for (AntFile antFile : customerAntFiles) {
+ RootAntObjectMeta root = antFile.getRootObjectMeta();
+ if (root instanceof ProjectMeta) {
+ ProjectMeta projectMeta = (ProjectMeta) root;
+ List<TargetMeta> targets = projectMeta.getTargets();
+ for (TargetMeta targetMeta : targets) {
+ antCallTargets.addAll(targetMeta.getExecTargets());
+ }
+ }
+ }
+ return antCallTargets;
+ }
+
+ /**
+ * Method returns a list of customer ant files.
+ *
+ * @param project Is the Ant project.
+ * @return A list of customer ant files.
+ */
+ private List<AntFile> getCustomerAntFiles(Project project) {
+ List<AntFile> customerAntFiles = new ArrayList<AntFile>();
+ try {
+ for (AntFile antFile : publicScopeDb.getAntFiles()) {
+ if (!antFile.getFile().getCanonicalPath().contains(getHeliumPath())) {
+ customerAntFiles.add(antFile);
+ }
+ }
+ } catch (IOException e) {
+ log("Unable to get a list of customer ant files. " + e.getMessage(), Project.MSG_WARN);
+ }
+ return customerAntFiles;
+ }
+
+ /**
+ * Method returns a list of property names defined by customer.
+ *
+ * @param project Is the Ant project.
+ * @return A list of customer defined property names.
+ */
+ private List<String> getCustomerProperties(Project project) {
+ List<String> customerProps = new ArrayList<String>();
+ List<PropertyMeta> properties = publicScopeDb.getProperties();
+ for (PropertyMeta propertyMeta : properties) {
+ if (!propertyMeta.getLocation().contains(getHeliumPath())) {
+ customerProps.add(propertyMeta.getName());
+ }
+ }
+ return customerProps;
+ }
+
+ /**
+ * Method returns target meta information of the target found in helium.
+ *
+ * @param targetName Is the name of the target requested.
+ * @param db Is the database to look in for the target information.
+ * @return The requested target meta.
+ */
+ private TargetMeta getHeliumTarget(String targetName, Database db) {
+ List<TargetMeta> targetList = db.getTargets();
+ for (TargetMeta targetMeta : targetList) {
+ if (targetMeta.getLocation().contains(getHeliumPath())
+ && targetMeta.getName().equals(targetName)) {
+ return targetMeta;
+ }
+ }
+ return null;
+ }
+
+ public void open() {
+ // do nothing
+ }
+
+ public void close() {
+ // do nothing
+ }
+
+ public void report(Severity severity, String message, File filename, int lineNo) {
+ output.add("Warning: " + message);
+ }
+
+ public void setTask(Task task) {
+ // do nothing
+ }
+}
\ No newline at end of file
--- a/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/ReferenceType.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/ReferenceType.java Mon Oct 18 10:23:52 2010 +0100
@@ -18,22 +18,31 @@
package com.nokia.helium.core.ant.types;
+import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.types.Reference;
/**
- * Helper class to force user providing a reference. It doesn't implement any
- * particular Ant interface.
+ * Helper class to force the user providing a reference.
+ * It doesn't implement any particular Ant interface.
+ *
+ * @param <T> The type the user should provide.
*/
-public class ReferenceType extends DataType {
+public class ReferenceType<T> extends DataType {
/**
* Returns the referenced object.
*
* @return the reference object.
*/
- public Object getReferencedObject() {
+ @SuppressWarnings("unchecked")
+ public T getReferencedObject() {
Reference reference = getRefid();
Object obj = reference.getReferencedObject(getProject());
- return obj;
+ Class<T> clazz = (Class<T>)getClass().getTypeParameters()[0].getBounds()[0];
+ if (clazz.isInstance(obj)) {
+ return clazz.cast(obj);
+ } else {
+ throw new BuildException("Type referenced by " + reference.getRefId() + " is not a " + clazz.getSimpleName());
+ }
}
}
\ No newline at end of file
--- a/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/Stage.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/ant/types/Stage.java Mon Oct 18 10:23:52 2010 +0100
@@ -18,9 +18,11 @@
package com.nokia.helium.core.ant.types;
+import java.util.Hashtable;
+import java.util.Map;
+
import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.BuildException;
-import org.apache.log4j.Logger;
/**
* A <code>Stage</code> is a Data type which stores Stage information.
@@ -41,24 +43,25 @@
*/
public class Stage extends DataType {
- //Default id is used as the stage name so overriding is possible.
- private Logger log = Logger.getLogger(Stage.class);
- private String stageName;
-
private String startTarget;
private String endTarget;
-
- public void setStageName(String name) {
- log.debug("stage-name:" + name);
- if (stageName != null) {
- throw new BuildException("no supported attribute stageName externally");
- }
- stageName = name;
- }
public String getStageName() {
- return stageName;
+ if (!this.isReference()) {
+ if (getProject() != null && getProject().getReferences() != null &&
+ getProject().getReferences().containsValue(this)) {
+ @SuppressWarnings("unchecked")
+ Hashtable<String, Object> references = (Hashtable<String, Object>)getProject().getReferences();
+ for (Map.Entry<String, Object> entry : references.entrySet()) {
+ if (entry.getValue() == this) {
+ return entry.getKey();
+ }
+ }
+ }
+ throw new BuildException("stage type can only be used as a reference at " + this.getLocation());
+ }
+ return this.getRefid().getRefId();
}
/**
* Returns the stage start target.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/filesystem/windows/Subst.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.core.filesystem.windows;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+
+import com.nokia.helium.core.plexus.CommandBase;
+
+/**
+ * This class wrap up subst windows utility calls.
+ *
+ */
+public class Subst extends CommandBase<IOException> {
+
+ /**
+ * Get the mapping between drive and the subst folder.
+ * @return
+ * @throws IOException
+ */
+ public Map<File, File> getSubstDrives() throws IOException {
+ String[] args = new String[0];
+ Subst subst = new Subst();
+ SubstStreamConsumer consumer = new SubstStreamConsumer();
+ subst.execute(args, consumer);
+ return consumer.getSubstDrives();
+ }
+
+ /**
+ * Tell if a path is under a subst drive.
+ * @return
+ * @throws IOException
+ */
+ public boolean isUnderSubstDrive(File filename) throws IOException {
+ Map<File, File> substDrives = getSubstDrives();
+ return substDrives.containsKey(new File(filename.getCanonicalPath().substring(0, 2)));
+ }
+
+ /**
+ * Tell if a path is under a subst drive.
+ * @return
+ * @throws IOException
+ */
+ public File getRealPath(File filename) throws IOException {
+ Map<File, File> substDrives = getSubstDrives();
+ File drive = new File(filename.getAbsolutePath().substring(0, 2));
+ if (substDrives.containsKey(drive)) {
+ return new File(substDrives.get(drive), filename.getAbsolutePath().substring(3)).getAbsoluteFile();
+ } else {
+ return filename.getCanonicalFile();
+ }
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected String getExecutable() {
+ return "subst";
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void throwException(String message, Throwable t) throws IOException {
+ throw new IOException(message);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/src/com/nokia/helium/core/filesystem/windows/SubstStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.core.filesystem.windows;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+/**
+ * Parse subst output.
+ *
+ */
+public class SubstStreamConsumer implements StreamConsumer {
+ private Map<File, File> substDrives = new HashMap<File, File>();
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void consumeLine(String line) {
+ if (line.trim().length() > 0) {
+ substDrives.put( new File(line.substring(0, 2)), new File(line.substring(8)));
+ }
+ }
+
+ /**
+ * Get the mapping between subst drive and folder.
+ * @return the mapping.
+ */
+ public Map<File, File> getSubstDrives() {
+ return substDrives;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/antunit/resourceaccess/test_resourceaccess.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_serializepath.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-resource-access" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium antlib core resource access tests.</description>
+
+ <property environment="env"/>
+
+ <dirname property="current.dir" file="${ant.file.test-resource-access}" />
+
+
+ <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+ <property name="base.dir" value="${test.temp.dir}/resourceAccess" />
+
+ <!-- is called prior to the test -->
+ <target name="setUp">
+ <mkdir dir="${base.dir}" />
+ <mkdir dir="${base.dir}/1" />
+ <mkdir dir="${base.dir}/2" />
+ <condition property="isWindows">
+ <os family="windows" />
+ </condition>
+ </target>
+
+ <!-- is called after the test, even if that caused an error -->
+ <target name="tearDown">
+ <delete dir="${base.dir}" failonerror="false" />
+ <delete dir="${base.dir}/1" failonerror="false" />
+ <delete dir="${base.dir}/2" failonerror="false" />
+ </target>
+
+ <target name="test-resourceaccess-invalid-dir">
+ <au:expectfailure expectedMessage="base directory of resource access task not exists">
+ <hlm:resourceaccess baseDirectory="${base.dir}/invalid-dir" lockName="subst-drive" />
+ </au:expectfailure>
+ </target>
+
+ <target name="test-resourceaccess-valid-subst" if="isWindows">
+ <antcall target="subst-drive" />
+ <au:assertFileExists file="${base.dir}/subst-drive" />
+ </target>
+
+ <target name="subst-drive">
+ <hlm:resourceaccess baseDirectory="${base.dir}" lockName="subst-drive">
+ <hlm:getfreedrive property="build.drive"/>
+ <exec osfamily="windows" executable="subst.exe" failonerror="false">
+ <arg value="${build.drive}"/>
+ <arg value="${current.dir}"/>
+ </exec>
+ </hlm:resourceaccess>
+ </target>
+
+ <target name="resource-access-test-infinite">
+ <hlm:resourceaccess baseDirectory="${base.dir}" lockName="${lock.name}">
+ <!-- tried to write as many times so there would be some delay in doing parallel operation -->
+ <echoproperties destfile="${base.dir}/${lock.name}1" />
+ <echoproperties destfile="${base.dir}/${lock.name}2" />
+ <echoproperties destfile="${base.dir}/${lock.name}3" />
+ <echoproperties destfile="${base.dir}/${lock.name}4" />
+ <echoproperties destfile="${base.dir}/${lock.name}5" />
+ <echoproperties destfile="${base.dir}/${lock.name}6" />
+ <echoproperties destfile="${base.dir}/${lock.name}7" />
+ <echoproperties destfile="${base.dir}/${lock.name}8" />
+ <echoproperties destfile="${base.dir}/${lock.name}9" />
+ <echoproperties destfile="${base.dir}/${lock.name}10" />
+ </hlm:resourceaccess>
+ </target>
+
+ <target name="resource-access-test-three-retry">
+ <hlm:resourceaccess baseDirectory="${base.dir}" lockName="${lock.name}" noOfRetry="3" interval="10">
+ <!-- tried to write as many times so there would be some delay in doing parallel operation -->
+ <echoproperties destfile="${base.dir}/${lock.name}1" />
+ <echoproperties destfile="${base.dir}/${lock.name}2" />
+ <echoproperties destfile="${base.dir}/${lock.name}3" />
+ <echoproperties destfile="${base.dir}/${lock.name}4" />
+ <echoproperties destfile="${base.dir}/${lock.name}5" />
+ <echoproperties destfile="${base.dir}/${lock.name}6" />
+ <echoproperties destfile="${base.dir}/${lock.name}7" />
+ <echoproperties destfile="${base.dir}/${lock.name}8" />
+ <echoproperties destfile="${base.dir}/${lock.name}9" />
+ <echoproperties destfile="${base.dir}/${lock.name}10" />
+ </hlm:resourceaccess>
+ </target>
+
+ <target name="test-parallel-infinite" if="isWindows">
+ <parallel>
+ <antcall target="resource-access-test-infinite">
+ <param name="lock.name" value="parallel-test"/>
+ <param name="base.dir" value="${base.dir}/1"/>
+ </antcall>
+ <antcall target="resource-access-test-infinite">
+ <param name="lock.name" value="parallel-test"/>
+ <param name="base.dir" value="${base.dir}/2"/>
+ </antcall>
+ </parallel>
+ </target>
+
+ <target name="test-parallel-three-retry" if="isWindows">
+ <au:expectfailure expectedMessage="lock not acquired">
+ <parallel>
+ <antcall target="resource-access-test-three-retry">
+ <param name="lock.name" value="parallel-test"/>
+ <param name="base.dir" value="${base.dir}/1"/>
+ </antcall>
+ <antcall target="resource-access-test-three-retry">
+ <param name="lock.name" value="parallel-test"/>
+ <param name="base.dir" value="${base.dir}/2"/>
+ </antcall>
+ </parallel>
+ </au:expectfailure>
+ </target>
+
+</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/antunit/run-scenario.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_signaltask.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="run-scenario" xmlns:ac="antlib:net.sf.antcontrib" xmlns:au="antlib:org.apache.ant.antunit">
+ <description>Helium Antlib feature enabler macro.</description>
+ <property environment="env" />
+
+ <target name="setUp">
+ <tempfile property="temp.dir" suffix=".dir" />
+ <mkdir dir="${temp.dir}" />
+ </target>
+
+ <target name="tearDown">
+ <delete dir="${temp.dir}" />
+ </target>
+
+ <macrodef name="runScenario">
+ <attribute name="scenario" />
+ <attribute name="target" />
+ <attribute name="cmdline" default=""/>
+ <sequential>
+ <ac:trycatch property="scenario.unittest.error">
+ <try>
+ <exec osfamily="windows" executable="cmd" dir="${ant.file.run-scenario}/../../scenarii/@{scenario}" failonerror="true" errorproperty="scenario.unittest.error.log">
+ <env key="ANT_ARGS" value="${env.ANT_ARGS} -logger com.nokia.helium.core.ant.HeliumLogger" />
+ <arg line="/c ..\build.bat" />
+ <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
+ <arg value="-Dtemp.dir=${temp.dir}" />
+ <arg line="@{target}" />
+ <arg value="@{cmdline}" />
+ </exec>
+ <exec osfamily="unix" executable="bash" dir="${ant.file.run-scenario}/../../scenarii/@{scenario}" failonerror="true" errorproperty="scenario.unittest.error.log">
+ <env key="ANT_ARGS" value="${env.ANT_ARGS} -logger com.nokia.helium.core.ant.HeliumLogger" />
+ <arg value="../bld.sh" />
+ <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
+ <arg value="-Dtemp.dir=${temp.dir}" />
+ <arg line="@{target}" />
+ <arg line="@{cmdline}" />
+ </exec>
+ </try>
+ </ac:trycatch>
+ <au:assertTrue message="${scenario.unittest.error.log}">
+ <not>
+ <isset property="scenario.unittest.error" />
+ </not>
+ </au:assertTrue>
+ </sequential>
+ </macrodef>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/antunit/test_buildstatusdef.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_buildstatusdef.ant.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_buildstatusdef" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+
+ <import file="run-scenario.ant.xml" />
+
+
+ <target name="test-properties">
+ <runScenario scenario="config_report" target="run-target-disabled" />
+ <au:assertLogContains text="Warning: enable.feature property has been deprecated since 11.0. Start using feature.enabled property"/>
+ <au:assertLogContains text="Warning: internal.abc.enabled property has been overridden"/>
+ <au:assertLogContains text="Warning: internal.bla.enabled property has been deprecated since 6.0. Start using internal.abc.enabled property"/>
+ <au:assertLogContains text="Warning: feature.enabled property has been overridden"/>
+ <au:assertLogContains text="Warning: Property 'test.prop.bool.val' has invalid boolean value set as 't'. (Valid values: true|false)"/>
+ <au:assertLogContains text="Warning: Property 'test.comment.prop.bool.val' has invalid boolean value set as 'yes'. (Valid values: true|false)"/>
+ <au:assertLogContains text="Warning: Property 'test.build.number' has invalid integer value set as '123aa'."/>
+ <au:assertLogContains text="Warning: Property 'test.prop.int.3' has invalid integer value set as '1.8'."/>
+ <au:assertLogContains text="Warning: Property 'test.prop.float.2' has invalid float value set as '1.5a'."/>
+ </target>
+
+ <target name="test-deprecated-target-with-antcall">
+ <runScenario scenario="config_report" target="antcall-deprecated-target" />
+ <au:assertLogContains text="Warning: a-deprecated-target target has been deprecated. Implementation of the feature has changed, and the target is not needed anymore."/>
+ </target>
+
+ <target name="test-deprecated-target-with-runtarget">
+ <runScenario scenario="config_report" target="runtarget-deprecated-target" />
+ <au:assertLogContains text="Warning: b-deprecated-target target has been deprecated. Implementation of the feature has changed, and the target is not needed anymore."/>
+ </target>
+
+ <target name="test-deprecated-target-with-depends">
+ <runScenario scenario="config_report" target="depends-deprecated-target" />
+ <au:assertLogContains text="Warning: c-deprecated-target target has been deprecated. Implementation of the feature has changed, and the target is not needed anymore."/>
+ </target>
+
+ <target name="test-private-target-with-antcall">
+ <runScenario scenario="config_report" target="run-private-target-as-antcall" />
+ <au:assertLogContains text="Warning: a-private-target is private and should only be called by helium"/>
+ </target>
+
+ <target name="test-private-target-with-runtarget">
+ <runScenario scenario="config_report" target="run-private-target-as-runtarget" />
+ <au:assertLogContains text="Warning: b-private-target is private and should only be called by helium"/>
+ </target>
+
+ <target name="test-private-target-with-depends">
+ <runScenario scenario="config_report" target="run-private-target-as-depends" />
+ <au:assertLogContains text="Warning: c-private-target is private and should only be called by helium"/>
+ </target>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/core/tests/antunit/test_core.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/tests/antunit/test_core.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -25,6 +25,8 @@
Testing core targets
</description>
+ <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
<target name="test-prettyprintxml-filter">
<loadfile srcfile="./../data/config_test.cfg.xml" property="xml.test.content">
<filterchain>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/antunit/test_feature_enabled_flags.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_feature_enabled_flags.ant.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_feature_enabled_flags" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>
+ Testing targets.
+ </description>
+
+ <property environment="env"/>
+ <import file="run-scenario.ant.xml"/>
+
+ <!-- Target to test a disabled target (if property not set)-->
+ <target name="test-target-disabled">
+ <runScenario scenario="test" target="run-target-disabled" />
+ <au:assertLogContains text="Skipped because property 'feature.enabled' not set to 'true'"/>
+ </target>
+
+ <!-- Target to test a enabled target (if property set)-->
+ <target name="test-target-enabled">
+ <runScenario scenario="test" target="run-target-enabled" />
+ <au:assertLogContains text="[echo] Running run-target-enabled"/>
+ </target>
+
+ <!-- Target to test enabled target with old property -->
+ <target name="test-target-enabled-with-old-flag">
+ <runScenario scenario="test" target="run-with-old-flag-enabled" />
+ <au:assertLogContains text="[echo] Running run-with-old-flag-enabled"/>
+ </target>
+
+ <!-- Target to test enabled target -->
+ <target name="test-target-enabled-with-new-flag">
+ <runScenario scenario="test" target="run-with-new-flag-enabled" />
+ <au:assertLogContains text="[echo] Running run-with-new-flag-enabled"/>
+ </target>
+
+ <!-- Target to test enabled target (both old and new properties set) -->
+ <target name="test-target-enabled-with-both">
+ <runScenario scenario="test" target="run-with-both-enabled" />
+ <au:assertLogContains text="[echo] Running run-with-both-enabled"/>
+ </target>
+
+ <!-- Target to test whether target is run when unless property is set -->
+ <target name="test-target-unless-enabled">
+ <runScenario scenario="test" target="run-with-unless-enabled" />
+ <au:assertLogContains text="Skipped because property 'skip.ats.sending' set"/>
+ </target>
+
+ <!-- Target to test whether target is run when unless internal property is set -->
+ <target name="test-target-unless-internal-enabled">
+ <runScenario scenario="test" target="run-with-unless-internal-enabled" />
+ <au:assertLogContains text="Skipped because property 'old.enabled' is set"/>
+ </target>
+
+</project>
+
--- a/buildframework/helium/sf/java/core/tests/antunit/test_getfreedrive.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/tests/antunit/test_getfreedrive.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -25,8 +25,8 @@
<description>
Testing getFreeDrive targets
</description>
-
- <property name="current.dir" value="."/>
+
+ <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<condition property="is.windows">
<os family="windows"/>
@@ -49,10 +49,10 @@
<hlm:getfreedrive property="build.drive"/>
<exec osfamily="windows" executable="subst.exe" failonerror="false">
<arg value="${build.drive}"/>
- <arg value="${current.dir}"/>
+ <arg value="."/>
</exec>
<au:assertTrue>
- <hasfreespace partition="${build.drive}" needed="1M"/>
+ <available file="${build.drive}" type="dir" />
</au:assertTrue>
<exec osfamily="windows" executable="subst.exe" failonerror="false">
<arg value="${build.drive}"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/antunit/test_helpdef.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_helpdef.ant.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_helpdef" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+
+ <import file="run-scenario.ant.xml" />
+
+
+ <target name="test-help">
+ <runScenario scenario="help" target="help" />
+ <au:assertLogContains text="Help:"/>
+ <au:assertLogContains text="This is the documentation."/>
+ <au:assertLogContains text="help.item: ${help.item}"/>
+ </target>
+
+
+ <target name="test-target-help">
+ <runScenario scenario="help" target="help" cmdline="custom-target"/>
+ <au:assertLogContains text="Help:"/>
+ <au:assertLogContains text="This is the documentation."/>
+ <au:assertLogContains text="help.item: custom-target"/>
+ </target>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/core/tests/bld.sh Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/tests/bld.sh Mon Oct 18 10:23:52 2010 +0100
@@ -21,4 +21,4 @@
. ~/.bashrc
fi
-ant -Dant.executor.class="com.nokia.helium.core.ant.HeliumExecutor" $*
+ant $*
--- a/buildframework/helium/sf/java/core/tests/build.bat Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/core/tests/build.bat Mon Oct 18 10:23:52 2010 +0100
@@ -21,7 +21,7 @@
set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
) ELSE set TESTED_JAVA=%JAVA_6_HOME%
if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
-call ant -Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor %*
+call ant %*
if "%ERRORLEVEL%" neq "0" (goto error)
endlocal
goto :eof
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/scenarii/bld.sh Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+#
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+if [ -f ~/.bashrc ] ; then
+ . ~/.bashrc
+fi
+ant $*
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/scenarii/build.bat Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,32 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem
+
+setlocal
+if not defined JAVA_6_HOME (
+set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
+) ELSE set TESTED_JAVA=%JAVA_6_HOME%
+if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
+echo %ANT_ARGS%
+call ant %*
+if "%ERRORLEVEL%" neq "0" (goto error)
+endlocal
+goto :eof
+
+:error
+endlocal
+if "%OS%"=="Windows_NT" color 00
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/scenarii/config_report/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-enable-flags" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium" xmlns:ac="antlib:net.sf.antcontrib">
+ <description>Helium Antlib logger unittests.</description>
+
+ <property name="feature.enabled" value="true"/>
+ <property name="enable.feature" value="true"/>
+ <property name="internal.abc.enabled" value="true"/>
+ <property name="internal.bla.enabled" value="false"/>
+ <property name="skip.ats.sending" value="t"/>
+ <property name="test.prop.bool.val" value="t"/>
+ <property name="test.comment.prop.bool.val" value="yes"/>
+ <property name="test.build.number" value="123aa"/>
+ <property name="test.build.id" value="test-build-id-1"/>
+ <property name="test.bn" value="123"/>
+ <property name="test.prop.float.1" value="6.5"/>
+ <property name="test.prop.float.2" value="1.5a"/>
+ <property name="test.prop.int.3" value="1.8"/>
+
+ <import file="feature/feature.ant.xml"/>
+
+ <condition property="internal.old.enabled">
+ <or>
+ <istrue value="${xyz.enabled}"/>
+ <isset property="enable.feature"/>
+ </or>
+ </condition>
+
+ <condition property="internal.new.enabled">
+ <or>
+ <istrue value="${feature.enabled}"/>
+ <isset property="abc.feature"/>
+ </or>
+ </condition>
+
+ <condition property="internal.both.enabled">
+ <or>
+ <istrue value="${feature.enabled}"/>
+ <isset property="enable.feature"/>
+ </or>
+ </condition>
+
+ <target name="run-target-disabled" if="internal.feature.enabled">
+ <echo>Running run-target-disabled</echo>
+ </target>
+
+ <target name="run-target-enabled" if="feature.enabled">
+ <echo>Running run-target-enabled</echo>
+ </target>
+
+ <target name="run-with-old-flag-enabled" if="internal.old.enabled">
+ <echo>Running run-with-old-flag-enabled</echo>
+ </target>
+
+ <target name="run-with-new-flag-enabled" if="internal.new.enabled">
+ <echo>Running run-with-new-flag-enabled</echo>
+ </target>
+
+ <target name="run-with-both-enabled" if="internal.both.enabled">
+ <echo>Running run-with-both-enabled</echo>
+ </target>
+
+ <target name="run-with-unless-enabled" unless="skip.ats.sending">
+ <echo>Running run-with-unless-enabled</echo>
+ </target>
+
+ <target name="run-with-unless-internal-enabled" unless="internal.old.enabled">
+ <echo>Running run-with-unless-internal-enabled</echo>
+ </target>
+
+ <target name="antcall-deprecated-target" if="test.bool.val">
+ <echo>Running antcall-deprecated-target</echo>
+ <antcall target="a-deprecated-target"/>
+ </target>
+
+ <target name="runtarget-deprecated-target">
+ <echo>Running runtarget-deprecated-target</echo>
+ <ac:runtarget target="b-deprecated-target"/>
+ </target>
+
+ <target name="depends-deprecated-target" depends="c-deprecated-target">
+ <echo>Running depends-deprecated-target</echo>
+ </target>
+
+ <target name="run-private-target-as-antcall">
+ <echo>Running run-private-target-as-antcall</echo>
+ <antcall target="a-private-target"/>
+ </target>
+
+ <target name="run-private-target-as-runtarget">
+ <echo>Running run-private-target-as-runtarget</echo>
+ <ac:runtarget target="b-private-target"/>
+ </target>
+
+ <target name="run-private-target-as-depends" depends="c-private-target">
+ <echo>Running run-private-target-as-depends</echo>
+ </target>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/scenarii/config_report/feature/feature.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : feature.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="feature" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium Antlib logger unittests.</description>
+
+ <property name="helium.dir" location="${ant.file.feature}/.." />
+
+ <!-- Set to true to enable feature
+ @type boolean
+ @editable required
+ @scope private
+ -->
+ <property name="feature.enabled" value="true"/>
+
+ <!-- Set to true to enable feature - deprecated: Start using feature.enabled property
+ @type boolean
+ @editable required
+ @scope public
+ @deprecated since 11.0
+ -->
+ <property name="enable.feature" value="true"/>
+
+ <!--* @property internal.abc.enabled
+ Set to true to true to run targets.
+ @type boolean
+ @editable required
+ @scope private
+ -->
+
+ <!--* @property internal.bla.enabled
+ Set to true to true to run targets - deprecated: Start using internal.abc.enabled property.
+ @type boolean
+ @editable required
+ @scope public
+ @deprecated since 6.0
+ -->
+
+ <!-- Test Property to check for boolean type
+ @type boolean
+ @editable required
+ @scope public
+ -->
+ <property name="test.prop.bool.val" value="true"/>
+
+ <!--* @property test.comment.prop.bool.val
+ Test Property to check for boolean type of comment properties
+ @type boolean
+ @editable required
+ @scope public
+ -->
+
+ <!--* @property test.build.number
+ Test Property to check for integer type of comment properties
+ @type integer
+ @editable required
+ @scope public
+ -->
+
+ <!--* @property test.build.id
+ Test Property to check for string type of comment properties
+ @type string
+ @editable required
+ @scope public
+ -->
+
+ <!--* @property test.bn
+ Test Property to check for integer type of properties
+ @type integer
+ @editable required
+ @scope public
+ -->
+ <property name="test.bn" value="abc"/>
+
+ <!-- Test property to check for valid float property types.
+ @type float
+ @scope public
+ -->
+ <property name="test.prop.float.1" value="1.5"/>
+
+ <!--* @property test.prop.float.2
+ Test property to check for invalid float property types.
+ @type float
+ @scope public
+ -->
+
+ <!-- Test property to check for invalid integer property types.
+ @type integer
+ @scope public
+ -->
+ <property name="test.prop.int.3" value="1"/>
+
+ <!-- Test target to check for antcall of deprecated target.
+
+ @deprecated Implementation of the feature has changed, and the target is not needed anymore
+ -->
+ <target name="a-deprecated-target">
+ <echo>Warning: this target is deprecated, please remove it from your configuration</echo>
+ </target>
+
+ <!-- Test target to check for runtarget of deprecated target.
+
+ @deprecated Implementation of the feature has changed, and the target is not needed anymore
+ -->
+ <target name="b-deprecated-target">
+ <echo>Warning: this target is deprecated, please remove it from your configuration</echo>
+ </target>
+
+ <!-- Test target to check for dependencies for deprecated target.
+
+ @deprecated Implementation of the feature has changed, and the target is not needed anymore
+ -->
+ <target name="c-deprecated-target">
+ <echo>Warning: this target is deprecated, please remove it from your configuration</echo>
+ </target>
+
+ <!-- Test target to check for private target usage with antcall. @scope private -->
+ <target name="a-private-target">
+ <echo>Inside private target a-private-target </echo>
+ </target>
+
+ <!-- Test target to check for private target usage with runtarget. @scope private -->
+ <target name="b-private-target">
+ <echo>Inside private target b-private-target </echo>
+ </target>
+
+ <!-- Test target to check for private target usage as dependent target. @scope private -->
+ <target name="c-private-target">
+ <echo>Inside private target c-private-target </echo>
+ </target>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/scenarii/help/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-help" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium Antlib logger unittests.</description>
+
+ <target name="help">
+ <echo>
+Help:
+This is the documentation.
+help.item: ${help.item}
+ </echo>
+ </target>
+
+ <!--
+ This is a custom target.
+ @scope public
+ @since 1.0
+ -->
+ <target name="custom-target" />
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/scenarii/property/feature.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : feature.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-properties" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium Antlib logger unittests.</description>
+
+ <!-- Set to true to enable feature
+ @type boolean
+ @editable required
+ @scope private
+ -->
+ <property name="feature.enabled" value="true"/>
+
+ <!-- Set to true to enable feature - deprecated: Start using feature.enabled property
+ @type boolean
+ @editable required
+ @scope public
+ @deprecated since 11.0
+ -->
+ <property name="enable.feature" value="true"/>
+
+ <!--* @property internal.abc.enabled
+ Set to true to true to run targets.
+ @type boolean
+ @editable required
+ @scope private
+ -->
+
+ <!--* @property internal.bla.enabled
+ Set to true to true to run targets - deprecated: Start using internal.abc.enabled property.
+ @type boolean
+ @editable required
+ @scope public
+ @deprecated since 6.0
+ -->
+
+
+
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/scenarii/test/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-enable-flags" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium Antlib logger unittests.</description>
+
+ <import file="../property/feature.ant.xml"/>
+ <property name="feature.enabled" value="true"/>
+ <property name="enable.feature" value="true"/>
+ <property name="internal.abc.enabled" value="true"/>
+ <property name="internal.bla.enabled" value="false"/>
+ <property name="skip.ats.sending" value="t"/>
+
+
+ <condition property="internal.old.enabled">
+ <or>
+ <istrue value="${xyz.enabled}"/>
+ <isset property="enable.feature"/>
+ </or>
+ </condition>
+
+ <condition property="internal.new.enabled">
+ <or>
+ <istrue value="${feature.enabled}"/>
+ <isset property="abc.feature"/>
+ </or>
+ </condition>
+
+ <condition property="internal.both.enabled">
+ <or>
+ <istrue value="${feature.enabled}"/>
+ <isset property="enable.feature"/>
+ </or>
+ </condition>
+
+ <!-- Disabled testing target -->
+ <target name="run-target-disabled" if="internal.feature.enabled">
+ <echo>Running run-target-disabled</echo>
+ </target>
+
+ <!-- Enabled testing target -->
+ <target name="run-target-enabled" if="feature.enabled">
+ <echo>Running run-target-enabled</echo>
+ </target>
+
+ <!-- Testing target with old property set -->
+ <target name="run-with-old-flag-enabled" if="internal.old.enabled">
+ <echo>Running run-with-old-flag-enabled</echo>
+ </target>
+
+ <!-- Testing target with new property set -->
+ <target name="run-with-new-flag-enabled" if="internal.new.enabled">
+ <echo>Running run-with-new-flag-enabled</echo>
+ </target>
+
+ <!-- Testing target with old and new properties set -->
+ <target name="run-with-both-enabled" if="internal.both.enabled">
+ <echo>Running run-with-both-enabled</echo>
+ </target>
+
+ <!-- Target with unless property set -->
+ <target name="run-with-unless-enabled" unless="skip.ats.sending">
+ <echo>Running run-with-unless-enabled</echo>
+ </target>
+
+ <!-- Target with unless propety set -->
+ <target name="run-with-unless-internal-enabled" unless="internal.old.enabled">
+ <echo>Running run-with-unless-internal-enabled</echo>
+ </target>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/src/com/nokia/helium/core/ant/tests/TestResourceCollectionUtils.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,99 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.core.ant.tests;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.junit.Test;
+
+import com.nokia.helium.core.ant.ResourceCollectionUtils;
+
+/**
+ * Testing the ResourceCollectionUtils utility class
+ *
+ */
+public class TestResourceCollectionUtils {
+
+ /**
+ * Simplistic ResourceCollection used by unittests.
+ */
+ class ResourceCollectionImpl implements ResourceCollection {
+
+ private List<Resource> resources = new ArrayList<Resource>();
+
+ private ResourceCollectionImpl(File[] files) {
+ for (File file : files) {
+ Resource res = new Resource();
+ res.setName(file.getAbsolutePath());
+ resources.add(res);
+ }
+ }
+
+ public boolean isFilesystemOnly() {
+ return true;
+ }
+
+ public Iterator<Resource> iterator() {
+ return resources.iterator();
+ }
+
+ public int size() {
+ // TODO Auto-generated method stub
+ return resources.size();
+ }
+
+ }
+
+ @Test
+ public void getFile() {
+ File[] files = new File[3];
+ files[0] = new File("foo.xml");
+ files[1] = new File("foo.html");
+ files[2] = new File("foo.dat");
+ File file = ResourceCollectionUtils.getFile(new ResourceCollectionImpl(files), ".*.xml");
+ assertTrue("must find one file", file != null);
+ assertTrue("must find one file (name check)", file.getName().equals(files[0].getName()));
+ }
+
+ @Test
+ public void getFileReturnsNull() {
+ File[] files = new File[3];
+ files[0] = new File("foo.xml");
+ files[1] = new File("foo.html");
+ files[2] = new File("foo.dat");
+ File file = ResourceCollectionUtils.getFile(new ResourceCollectionImpl(files), ".*\\.ini$");
+ assertTrue("must not find a file", file == null);
+ }
+
+ @Test
+ public void getFiles() {
+ File[] files = new File[3];
+ files[0] = new File("foo.xml");
+ files[1] = new File("foo.html");
+ files[2] = new File("foo.dat");
+ List<File> outFiles = ResourceCollectionUtils.getFiles(new ResourceCollectionImpl(files));
+ assertTrue("must not return null", outFiles != null);
+ assertTrue("size must be 3", outFiles.size() == 3);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/core/tests/src/com/nokia/helium/core/filesystem/windows/test/TestSubstStreamConsumer.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,53 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.core.filesystem.windows.test;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.Locale;
+import java.util.Map;
+
+import org.junit.Test;
+
+import com.nokia.helium.core.filesystem.windows.SubstStreamConsumer;
+
+public class TestSubstStreamConsumer {
+
+ /**
+ * This test should only run on windows as subst is only
+ * meaningful on that platform.
+ */
+ @Test
+ public void validateSubstOutputParsing() {
+ String osName = System.getProperty("os.name").toLowerCase(Locale.US);
+ if (osName.contains("windows")) {
+ // Setting up an Ant task
+ SubstStreamConsumer consumer = new SubstStreamConsumer();
+ consumer.consumeLine("");
+ consumer.consumeLine("I:\\: => E:\\Build_E\\buildarea\\tb92_201012");
+ consumer.consumeLine("J:\\: => E:\\Build_E\\buildarea\\tb92_201013");
+ Map<File, File> substDrives = consumer.getSubstDrives();
+ assertTrue(substDrives.size() == 2);
+ assertTrue(substDrives.containsKey(new File("I:")));
+ assertTrue(substDrives.containsKey(new File("J:")));
+ assertTrue(substDrives.containsValue(new File("E:\\Build_E\\buildarea\\tb92_201012")));
+ assertTrue(substDrives.containsValue(new File("E:\\Build_E\\buildarea\\tb92_201013")));
+ }
+ }
+
+}
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/AllTargetDiamondsListener.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.diamonds;
-
-import java.io.BufferedWriter;
-import java.io.FileInputStream;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Vector;
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.Target;
-
-/**
- * Generate target times
- */
-public class AllTargetDiamondsListener extends DiamondsListenerImpl {
-
- private static Logger log = Logger.getLogger(DiamondsListenerImpl.class);
-
- private Vector<AntTarget> antTargets = new Vector<AntTarget>();
-
-
-
-
- /**
- * Function to process logging info during begining of target execution
- *
- * @param event of target execution.
- */
- public void targetBegin(BuildEvent buildEvent) {
- antTargets.add(new AntTarget(buildEvent.getTarget()));
- }
-
- /**
- * Function to process logging info during end of target execution
- *
- * @param event of target execution.
- */
- public void targetEnd(BuildEvent buildEvent) {
- for (AntTarget at : antTargets)
- {
- if (at.equals(buildEvent.getTarget())) {
- at.setEndTime(new Date());
- }
- }
- }
-
- /**
- * Function to process logging info during end of build
- *
- * @param event of target execution.
- */
- public void buildEnd(BuildEvent buildEvent) throws DiamondsException {
- try {
- if (isInitialized()) {
- File tempFile = File.createTempFile("diamonds-targets", ".xml");
- FileWriter fstream = new FileWriter(tempFile);
- BufferedWriter out = new BufferedWriter(fstream);
- out.write("<targets>\n");
-
- for (AntTarget at : antTargets)
- {
- Calendar startcalendar = Calendar.getInstance();
- Calendar endcalendar = Calendar.getInstance();
- startcalendar.setTime(at.getStartTime());
- if (at.getEndTime() != null)
- {
- endcalendar.setTime(at.getEndTime());
- endcalendar.add(Calendar.SECOND, -5);
- if (endcalendar.after(startcalendar))
- {
- out.write("<target>\n");
- out.write("<name>" + at.getName() + "</name>\n");
- out.write("<started>" + getTimeFormat().format(at.getStartTime()) + "</started>\n");
- out.write("<finished>" + getTimeFormat().format(at.getEndTime()) + "</finished>\n");
- out.write("</target>\n");
- }
- }
- }
-
- out.write("</targets>\n");
- out.close();
- FileInputStream stream = new FileInputStream(tempFile);
- log.debug("alltargetdiamondslistener file: " + tempFile);
- mergeToFullResults(stream);
- stream.close();
- stream = new FileInputStream(tempFile);
- log.debug("diamondsclient: " + getDiamondsClient());
- log.debug("diamondsclient: " + DiamondsConfig.getBuildId());
- getDiamondsClient().sendData(stream, DiamondsConfig.getBuildId());
- }
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
-
- class AntTarget {
- private String targetName;
- private Date startTime;
- private Date endTime;
- private int hashCode;
-
- public AntTarget(Target target)
- {
- targetName = target.getName();
- hashCode = target.hashCode();
- startTime = new Date();
- }
- public String getName() { return targetName; }
- public Date getStartTime() { return startTime; }
- public Date getEndTime() { return endTime; }
- public void setEndTime(Date e) { endTime = e; }
- public boolean equals(Object obj) { return obj.hashCode() == hashCode; }
- public int hashCode() { return hashCode; }
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsClient.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,309 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.diamonds;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.methods.FileRequestEntity;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.RequestEntity;
-import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
-import org.apache.commons.lang.StringUtils;
-import org.apache.log4j.Logger;
-
-import com.nokia.helium.core.EmailDataSender;
-import com.nokia.helium.core.EmailSendException;
-
-/**
- * Diamonds client used to connect to get build id and also to send the build results
- *
- */
-public class DiamondsClient {
-
- private static final int INT_SERV_ERROR = 500;
-
- private static final int SERV_NOT_FOUND = 404;
-
- private static final int SERV_OK = 200;
-
- private boolean isRecordOnly;
-
- private Logger log = Logger.getLogger(DiamondsClient.class);
-
- private String host;
-
- private String port;
-
- private String path;
-
- private String emailID;
-
- private HttpClient httpClient;
-
- public DiamondsClient(String hst, String prt, String pth, String mailID) {
- host = hst;
- port = prt;
- path = pth;
- emailID = mailID;
- httpClient = new HttpClient();
- }
-
- private int executeMethod(PostMethod postMethod) throws DiamondsException {
- int result = 0;
- try {
- result = httpClient.executeMethod(postMethod);
- }
- catch (IOException e) {
- isRecordOnly = true;
- throw new DiamondsException("IOException while sending http request." + e.getMessage());
- // e.printStackTrace();
- }
- return result;
- }
-
- private String checkForProtocol(String url) throws DiamondsException {
- String retURL = url;
- if (!StringUtils.containsIgnoreCase(url, "http://")) {
- retURL = "http://" + url;
- }
- return retURL;
- }
-
- private String getURL() throws DiamondsException {
- return getURL(null);
- }
-
- private String getURL(String subPath) throws DiamondsException {
- String urlPath = path;
- if (subPath != null) {
- urlPath = subPath;
- }
- return checkForProtocol("http://" + host + ":" + port + urlPath);
- }
-
- private PostMethod getPostMethod(String fileName, String urlPath) {
-
- // Get the Diamonds XML-file which is to be exported
- File input = new File(fileName);
-
- // Prepare HTTP post
- PostMethod post = new PostMethod(urlPath);
-
- // Request content will be retrieved directly
- // from the input stream
-
- RequestEntity entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");
- post.setRequestEntity(entity);
- return post;
- }
-
- private int processPostMethodResult(int result) {
- // Log status code
- switch (result) {
- case INT_SERV_ERROR:
- // log.error("Internal server error");
- break;
- case SERV_NOT_FOUND:
- // log.error("Server not found");
- break;
- case SERV_OK:
- // log.info("Connection to diamonds server - OK");
- break;
- default:
- // log.debug("Response code: " + result);
- }
- return result;
- }
-
- public String getBuildId(InputStream stream) throws DiamondsException {
- String diamondsBuildID = null;
- PostMethod postMethod = null;
- try {
- if (!isRecordOnly) {
- String strURL = getURL();
- log.debug("strURL:" + strURL);
- postMethod = getPostMethod(stream, strURL);
- log.debug("postmethod:" + postMethod);
- int postMethodResult = httpClient.executeMethod(postMethod);
- log.debug("postmethod-result:" + postMethodResult);
-
- int result = processPostMethodResult(postMethodResult);
-
- if (result == SERV_OK) {
- // Display and save response code which functions as a id for
- // the build.
- diamondsBuildID = postMethod.getResponseBodyAsString();
- log.debug("diamondsBuildID: " + diamondsBuildID);
- }
- else {
- isRecordOnly = true;
- log.error("Diamonds data not sent, because of connection failure.");
- // throw new DiamondsException("Connection Failed");
- }
- }
- }
- catch (HttpException ex) {
- isRecordOnly = true;
- log.debug("Diamonds data not sent:s", ex);
- log.error("Diamonds data not sent: " + ex.getMessage());
- }
- catch (IOException ex) {
- isRecordOnly = true;
- log.debug("Diamonds data not sent:", ex);
- log.error("Diamonds data not sent: " + ex.getMessage());
- }
- finally {
- // Release current connection to the connection pool once you are
- // done
- if (postMethod != null) {
- postMethod.releaseConnection();
- }
- }
- return diamondsBuildID;
- }
-
- /**
- *
- * @param fileName Filename to export to Diamonds
- * @return diamonds build id
- */
- public String getBuildId(String fileName) throws DiamondsException {
- String diamondsBuildID = null;
- PostMethod postMethod = null;
-
- // Get HTTP client
- // MyHttpClient httpclient = createHttpClient();
-
- // Execute post request
- try {
- if (!isRecordOnly) {
- String strURL = getURL();
- log.debug("strURL:" + strURL);
- postMethod = getPostMethod(fileName, strURL);
- log.debug("postmethod:" + postMethod);
- int postMethodResult = httpClient.executeMethod(postMethod);
- log.debug("postmethod-result:" + postMethodResult);
-
- int result = processPostMethodResult(postMethodResult);
-
- if (result == SERV_OK) {
- // Display and save response code which functions as a id for
- // the build.
- diamondsBuildID = postMethod.getResponseBodyAsString();
- log.debug("diamondsBuildID: " + diamondsBuildID);
- }
- else {
- isRecordOnly = true;
- log.error("Diamonds data not sent, because of connection failure.");
- // throw new DiamondsException("Connection Failed");
- }
- }
- }
- catch (HttpException ex) {
- isRecordOnly = true;
- log.debug("Diamonds data not sent:s", ex);
- log.error("Diamonds data not sent: " + ex.getMessage());
- }
- catch (IOException ex) {
- isRecordOnly = true;
- log.debug("Diamonds data not sent:", ex);
- log.error("Diamonds data not sent: " + ex.getMessage());
- }
- finally {
- // Release current connection to the connection pool once you are
- // done
- if (postMethod != null) {
- postMethod.releaseConnection();
- }
- }
- return diamondsBuildID;
- }
-
- private PostMethod getPostMethod(InputStream stream, String urlPath) {
-
- // Get the Diamonds XML-file which is to be exported
- //File input = new File(fileName);
-
- // Prepare HTTP post
- PostMethod post = new PostMethod(urlPath);
-
- RequestEntity entity = new InputStreamRequestEntity(stream, "text/xml");
- post.setRequestEntity(entity);
- return post;
- }
-
- public int sendData(InputStream stream, String urlPath) {
- PostMethod postMethod = null;
- int result = -1;
- if (urlPath != null && !isRecordOnly) {
- try {
- String strURL = getURL(urlPath);
- postMethod = getPostMethod(stream, strURL);
- result = processPostMethodResult(httpClient.executeMethod(postMethod));
- }
- catch (IllegalArgumentException e) {
- // Catching this exception is needed because it is raised by httpclient
- // library if the server is under update.
- log.error("sendData:The final data via http not sent because errors:IllegalArgumentException ", e);
- }
- catch (DiamondsException e) {
- log.error("sendData:The final data via http not sent because errors:DiamondsException ", e);
- }
- catch (IOException e) {
- log.error("sendData:The final data via http not sent because errors:IOException ", e);
- }
- }
- return result;
- }
-
- public int sendData(String fileName, String urlPath) {
- PostMethod postMethod = null;
- int result = -1;
- if (urlPath != null && !isRecordOnly) {
- try {
- String strURL = getURL(urlPath);
- postMethod = getPostMethod(fileName, strURL);
- result = processPostMethodResult(httpClient.executeMethod(postMethod));
- }
- catch (IllegalArgumentException e) {
- // Catching this exception is needed because it is raised by httpclient
- // library if the server is under update.
- log.error("sendData:The final data via http not sent because errors:IllegalArgumentException ", e);
- }
- catch (DiamondsException e) {
- log.error("sendData:The final data via http not sent because errors:DiamondsException ", e);
- }
- catch (IOException e) {
- log.error("sendData:The final data via http not sent because errors:IOException ", e);
- }
- }
- return result;
- }
-
- public int sendDataByMail(String fileName, String smtpServer, String ldapServer) throws EmailSendException {
- log.debug("DiamondsClient:sendDataByEmail:emailID" + emailID);
- EmailDataSender emailSender = new EmailDataSender(emailID, smtpServer, ldapServer);
- log.debug("DiamondsClient:sendDataByEmail: " + fileName);
- emailSender.sendData("diamonds", new File(fileName), "application/xml", "[DIAMONDS_DATA]", null);
- log.debug("DiamondsClient:sendDataByEmail:succeeds");
- return 0;
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsConfig.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsConfig.java Mon Oct 18 10:23:52 2010 +0100
@@ -17,27 +17,13 @@
package com.nokia.helium.diamonds;
-import java.util.HashMap;
-import java.util.Map;
-import com.nokia.helium.core.ant.types.Stage;
-import com.nokia.helium.core.ant.types.TargetMessageTrigger;
import org.apache.tools.ant.Project;
-import java.util.Hashtable;
-import org.apache.log4j.Logger;
/**
- * Loads the configuration information from the xml file.
+ * Loads the configuration information from Ant project.
*
*/
public final class DiamondsConfig {
-
- private static HashMap<String, Stage> stages = new HashMap<String, Stage>();
-
- private static Logger log = Logger.getLogger(DiamondsConfig.class);
-
- private static String initialiserTargetName;
-
- private static Project project;
private static final String DIAMONDS_HOST_PROPERTY = "diamonds.host";
private static final String DIAMONDS_PORT_PROPERTY = "diamonds.port";
@@ -48,131 +34,71 @@
private static final String DIAMONDS_SMTP_PROPERTY = "diamonds.smtp.server";
private static final String DIAMONDS_INITIALIZER_TARGET_PROPERTY = "diamonds.initializer.targetname";
private static final String DIAMONDS_CATEGORY_PROPERTY = "diamonds.category";
-
-
+ private static final String DIAMONDS_BUILD_ID_PROPERTY = "diamonds.build.id";
private static final String[] PROPERTY_NAMES = {DIAMONDS_HOST_PROPERTY, DIAMONDS_PORT_PROPERTY, DIAMONDS_PATH_PROPERTY,
DIAMONDS_TSTAMP_PROPERTY, DIAMONDS_MAIL_PROPERTY,
DIAMONDS_LDAP_PROPERTY, DIAMONDS_SMTP_PROPERTY,
DIAMONDS_INITIALIZER_TARGET_PROPERTY, DIAMONDS_CATEGORY_PROPERTY};
-
- private static HashMap<String, TargetMessageTrigger> targetMessageList = new HashMap<String, TargetMessageTrigger>();
-
- private DiamondsConfig() {
- }
-
-
- @SuppressWarnings("unchecked")
- private static void initializeMessage(Project prj) {
- Hashtable<String, Object> references = prj.getReferences();
- for (String key : references.keySet()) {
- Object object = references.get(key);
- log.debug("key: " + key);
- if (object instanceof TargetMessageTrigger) {
- log.debug("found message map:" + object);
- log.debug("found key: " + key);
- TargetMessageTrigger message = (TargetMessageTrigger)object;
- targetMessageList.put(message.getTargetName(), (TargetMessageTrigger)object);
- }
+
+ private Project project;
+ private Boolean enabled;
+
+ public DiamondsConfig(Project project) throws DiamondsException {
+ this.project = project;
+ if (this.isDiamondsEnabled()) {
+ initialize();
}
}
- @SuppressWarnings("unchecked")
- public static void initialize(Project prj) throws DiamondsException {
- project = prj;
- log.debug("Diamonds config initialization: project: " + project);
- initializeMessage(prj);
- for (String property : PROPERTY_NAMES ) {
- validateProperty(property);
- }
- Hashtable<String, Object> references = prj.getReferences();
- for (String key : references.keySet()) {
- Object object = references.get(key);
- if (object instanceof Stage) {
- log.debug("stage found: " + key);
- Stage stageMap = (Stage)object;
- stageMap.setStageName(key);
- stages.put(key, (Stage)object);
+ private void initialize() throws DiamondsException {
+ for (String property : PROPERTY_NAMES) {
+ String propertyValue = project.getProperty(property);
+ if (propertyValue == null) {
+ throw new DiamondsException("required property: " + property + " not defined");
}
}
- }
-
- private static void validateProperty(String propertyName) throws DiamondsException {
- String propertyValue = project.getProperty(propertyName);
- if (propertyValue == null) {
- throw new DiamondsException("required property: " + propertyName + " not defined");
+ try {
+ Integer.parseInt(project.getProperty(DIAMONDS_PORT_PROPERTY));
+ } catch (NumberFormatException e) {
+ throw new DiamondsException("Invalid port number for property " +
+ DIAMONDS_PORT_PROPERTY + ": " + project.getProperty(DIAMONDS_PORT_PROPERTY));
}
}
- /**
- * Helper function to get the stages
- *
- * @return the stages from config in memory
- */
- static Map<String, Stage> getStages() {
- return stages;
- }
-
- /**
- * Helper function to get the targets
- *
- * @return the targets from config in memory
- */
- static HashMap<String, TargetMessageTrigger> getTargetsMap() {
- return targetMessageList;
- }
-
- /**
- * Returns true if stages exists in config
- *
- * @return the existance of stages in config
- */
- public static boolean isStagesInConfig() {
- return !stages.isEmpty();
- }
-
- /**
- * Returns true if targets exists in config
- *
- * @return the targets from config in memory
- */
- public static boolean isTargetsInConfig() {
- return !targetMessageList.isEmpty();
- }
-
- public static String getHost() {
+ public String getHost() {
return project.getProperty(DIAMONDS_HOST_PROPERTY);
}
- public static String getPort() {
+ public String getPort() {
return project.getProperty(DIAMONDS_PORT_PROPERTY);
}
- public static String getPath() {
+ public String getPath() {
return project.getProperty(DIAMONDS_PATH_PROPERTY);
}
- public static String getTimeFormat() {
+ public String getTimeFormat() {
return project.getProperty(DIAMONDS_TSTAMP_PROPERTY);
}
- public static String getMailInfo() {
+ public String getMailInfo() {
return project.getProperty(DIAMONDS_MAIL_PROPERTY);
}
- public static String getLDAPServer() {
+ public String getLDAPServer() {
return project.getProperty(DIAMONDS_LDAP_PROPERTY);
}
- public static String getSMTPServer() {
+ public String getSMTPServer() {
return project.getProperty(DIAMONDS_SMTP_PROPERTY);
}
- public static String getBuildIdProperty() {
- return "diamonds.build.id";
+ public String getBuildIdProperty() {
+ return DIAMONDS_BUILD_ID_PROPERTY;
}
- public static String getBuildId() {
- return project.getProperty(getBuildIdProperty());
+ public String getBuildId() {
+ return project.getProperty(DIAMONDS_BUILD_ID_PROPERTY);
}
/**
@@ -180,12 +106,32 @@
*
* @return the initialiserTargetName
*/
- public static String getInitializerTargetProperty() {
- return DIAMONDS_INITIALIZER_TARGET_PROPERTY;
+ public String getInitializerTargetName() {
+ String targetName = project.getProperty(DIAMONDS_INITIALIZER_TARGET_PROPERTY);
+ if (targetName != null) {
+ if (project.getTargets().containsKey(targetName)) {
+ return targetName;
+ } else {
+ project.log("'" + DIAMONDS_INITIALIZER_TARGET_PROPERTY + "' property reference and unexisting target: " + targetName);
+ }
+ }
+ return null;
}
- public static String getCategory() {
+ public String getCategory() {
return project.getProperty(DIAMONDS_CATEGORY_PROPERTY);
}
+
+ public boolean isDiamondsEnabled() {
+ if (enabled == null) {
+ String diamondsEnabled = project.getProperty("diamonds.enabled");
+ if (diamondsEnabled != null) {
+ enabled = new Boolean(Project.toBoolean(diamondsEnabled));
+ } else {
+ enabled = Boolean.TRUE;
+ }
+ }
+ return enabled.booleanValue();
+ }
}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsException.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsException.java Mon Oct 18 10:23:52 2010 +0100
@@ -27,12 +27,19 @@
private static final long serialVersionUID = 8743300713686555395L;
/**
- * Constructor
- *
- * @exception - exception to be processed.
+ * Diamonds exception with error message.
+ * @param message the error message.
*/
+ public DiamondsException(String message) {
+ super(message);
+ }
- public DiamondsException(String exception) {
- super(exception);
+ /**
+ * Diamonds exception with error message and a root cause
+ * @param message the error message
+ * @param cause the root cause
+ */
+ public DiamondsException(String message, Throwable cause) {
+ super(message, cause);
}
}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsExceptionStatusUpdate.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description: To update the build status to Diamonds with signals in case of build exceptions.
- *
- */
-
-package com.nokia.helium.diamonds;
-
-import java.text.SimpleDateFormat;
-import org.apache.tools.ant.types.DataType;
-import java.util.Hashtable;
-import java.util.Vector;
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.Project;
-import com.nokia.helium.core.ant.HlmExceptionHandler;
-import com.nokia.helium.signal.SignalStatus;
-import com.nokia.helium.signal.SignalStatusList;
-
-
-/**
- * Class to store the builds status and check the signal is present in the deferred signal list.
- * if so get the signal informations like signal name, error message and target name.
- * With collected signal information and build status send the generated XML file to diamonds client class
- * to update the information into diamonds
- */
-public class DiamondsExceptionStatusUpdate extends DataType implements HlmExceptionHandler {
- private Logger log = Logger.getLogger(DiamondsExceptionStatusUpdate.class);
-
- /* Initiate build status to failed as this method will be invoked in case of exceptions only */
- private String buildStatus = "failed";
-
- private SimpleDateFormat timeFormat;
-
- private Hashtable<String, String> signalInformation = new Hashtable<String, String>();
-
- private String outputFile,templateFile;
-
-
- /**
- * Implements the Exception method to update build status and signal information to diamonds.
- * @param project
- * @param module
- * @param e
- */
- @SuppressWarnings("unchecked")
- public void handleException(Project project, Exception e) {
- Project prj = DiamondsListenerImpl.getProject();
-
- try {
- if (DiamondsListenerImpl.isInitialized()) {
- if (SignalStatusList.getDeferredSignalList().hasSignalInList()) {
- Vector<SignalStatus> signalList = SignalStatusList.getDeferredSignalList().getSignalStatusList();
- timeFormat = new SimpleDateFormat(DiamondsConfig.getTimeFormat());
- log.debug("Build Status = " + buildStatus);
- int i = 0;
- for (SignalStatus status : signalList) {
- prj.setProperty("diamond.signal.name." + i, status.getName());
- prj.setProperty("diamond.error.message." + i, status.getName());
- prj.setProperty("diamond.time.stamp." + i, new String(timeFormat.format(status.getTimestamp())));
- DiamondsListenerImpl.sendMessage("diamonds-signal");
- }
- }
- if (SignalStatusList.getNowSignalList().hasSignalInList()) {
- Vector<SignalStatus> signalList = SignalStatusList.getNowSignalList().getSignalStatusList();
- buildStatus = "failed";
- timeFormat = new SimpleDateFormat(DiamondsConfig.getTimeFormat());
- log.debug("Build Status = " + buildStatus);
- int i = 0;
- for (SignalStatus status : signalList) {
- prj.setProperty("diamond.signal.name." + i, status.getName());
- prj.setProperty("diamond.error.message." + i, status.getMessage());
- prj.setProperty("diamond.time.stamp." + i,new String(timeFormat.format(status.getTimestamp())));
- i += 1;
- }
- DiamondsListenerImpl.sendMessage("diamonds.signal.message");
- }
- prj.setProperty("build.status", buildStatus);
- DiamondsListenerImpl.sendMessage("diamonds.status.message");
- }
- } catch (DiamondsException dex) {
- log.debug("exception: ", dex);
- }
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsListener.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsListener.java Mon Oct 18 10:23:52 2010 +0100
@@ -19,18 +19,23 @@
import org.apache.tools.ant.BuildEvent;
+import com.nokia.helium.diamonds.ant.Listener;
+
/**
* Diamonds specific Listener interface.
*
*/
public interface DiamondsListener {
+
+ void configure(Listener listener) throws DiamondsException;
+
/**
* Function to process logging info during beginning of target execution
*
* @param event
* of target execution.
*/
- void targetBegin(BuildEvent buildEvent) throws DiamondsException;
+ void targetStarted(BuildEvent buildEvent) throws DiamondsException;
/**
* Function to process logging info during end of target execution
@@ -38,7 +43,7 @@
* @param event
* of target execution.
*/
- void targetEnd(BuildEvent buildEvent) throws DiamondsException;
+ void targetFinished(BuildEvent buildEvent) throws DiamondsException;
/**
* Function to process logging info during beginning of build
@@ -46,7 +51,7 @@
* @param event
* of target execution.
*/
- void buildBegin(BuildEvent buildEvent) throws DiamondsException;
+ void buildStarted(BuildEvent buildEvent) throws DiamondsException;
/**
* Function to process logging info during end of build
@@ -54,5 +59,5 @@
* @param event
* of target execution.
*/
- void buildEnd(BuildEvent buildEvent) throws DiamondsException;
+ void buildFinished(BuildEvent buildEvent) throws DiamondsException;
}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsListenerImpl.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,255 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.diamonds;
-
-import org.apache.tools.ant.BuildEvent;
-
-import org.apache.tools.ant.Project;
-import java.util.Date;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import org.apache.log4j.Logger;
-import com.nokia.helium.core.EmailSendException;
-import com.nokia.helium.core.ant.Message;
-import com.nokia.helium.core.MessageCreationException;
-import com.nokia.helium.diamonds.XMLMerger.XMLMergerException;
-import java.io.InputStream;
-
-/**
- * Base diamonds logger implementation. The common implementation like initialization done here and
- * used by sub classes.
- */
-public class DiamondsListenerImpl implements DiamondsListener {
-
- private static ArrayList<InputStream> finalStreamList = new ArrayList<InputStream>();
-
- private static DiamondsClient diamondsClient;
-
- private static boolean isInitialized;
-
- private static ArrayList<String> deferLogList = new ArrayList<String>();
-
- private static Logger log = Logger.getLogger(DiamondsListenerImpl.class);
-
- private static Project project;
-
- private static Object mutexObject = new Object();;
-
- private static SimpleDateFormat timeFormat;
-
- /**
- * Default constructor
- */
- public DiamondsListenerImpl() {
- }
-
- public static void initialize(Project prj) {
- project = prj;
- log.debug("buildbegin:" + project);
- Date date = new Date();
- timeFormat = new SimpleDateFormat(DiamondsConfig.getTimeFormat());
- log.debug("build.start.time:" + date);
- project.setProperty("build.start.time", timeFormat.format(date));
- }
-
- /**
- * Function to process logging info during end of build
- *
- * @param event of target execution.
- */
- public final void buildBegin(BuildEvent buildEvent) throws DiamondsException {
- }
-
- /**
- * Function to process logging info during end of build
- *
- * @param event of target execution.
- */
- @SuppressWarnings("unchecked")
- public void buildEnd(BuildEvent buildEvent) throws DiamondsException {
- log.debug("build end: " + isInitialized());
- if (isInitialized()) {
- project.setProperty("build.end.time", timeFormat.format(new Date()));
- sendMessage("final.message");
- isInitialized = false;
- InputStream first = finalStreamList.remove(0);
- try {
- //printStreamContent(first);
- File fullResultsFile = File.createTempFile("diamonds-full-results", ".xml");
- XMLMerger merger = new XMLMerger(first, fullResultsFile);
- String smtpServer = DiamondsConfig.getSMTPServer();
- String ldapServer = DiamondsConfig.getLDAPServer();
- for (InputStream stream : finalStreamList) {
- try {
- merger.merge(stream);
- }
- catch (XMLMerger.XMLMergerException xe) {
- log.debug("Error during the merge: ", xe);
- }
- }
- diamondsClient.sendDataByMail(fullResultsFile.getAbsolutePath(), smtpServer, ldapServer);
- } catch (EmailSendException ese) {
- log.warn("Error occured while sending mail: " + ese.getMessage());
-
- } catch (IOException e) {
- log.error("Error sending diamonds final log: IOException", e);
- }
- catch (XMLMergerException e) {
- log.error("Error sending diamonds final log: XMLMergerException ", e);
- }
- }
- }
-
- /**
- * Function to process logging info during begining of target execution
- *
- * @param event of target execution.
- */
- public void targetBegin(BuildEvent buildEvent) throws DiamondsException {
- initDiamondsClient();
- }
-
- /**
- * Function to process logging info during end of target execution
- *
- * @param event of target execution.
- */
- public void targetEnd(BuildEvent buildEvent) throws DiamondsException {
- }
-
- /**
- * returns true if diamonds is already initialized for the build.
- *
- * @param true diamonds initialized otherwise false.
- */
- public static boolean isInitialized() {
- return isInitialized;
- }
-
- public static void mergeToFullResults(InputStream stream) throws DiamondsException {
- finalStreamList.add(stream);
- }
-
-
- /**
- * Helper function to return the default project passed to messages.
- */
- static Project getProject() {
- return project;
- }
-
-
-
- protected DiamondsClient getDiamondsClient() {
- return diamondsClient;
- }
-
-
- protected boolean getIsInitialized() {
- return isInitialized;
- }
-
- protected static SimpleDateFormat getTimeFormat() {
- return timeFormat;
- }
-
- protected ArrayList<String> getDeferLogList() {
- return deferLogList;
- }
-
- protected static File streamToTempFile(InputStream stream) throws IOException {
- File temp = File.createTempFile("diamonds", "xml");
- FileOutputStream out = new FileOutputStream(temp);
- int read = 0;
- byte[] bytes = new byte[1024];
-
- while ((read = stream.read(bytes)) != -1) {
- out.write(bytes, 0, read);
- }
- out.flush();
- out.close();
- stream.close();
- return temp;
- }
-
- private static void sendMessage(Message message, String buildID) throws DiamondsException {
- try {
- File tempFile = streamToTempFile(message.getInputStream());
- tempFile.deleteOnExit();
- if (buildID == null) {
- buildID = diamondsClient.getBuildId(new FileInputStream(tempFile));
- if (buildID != null) {
- project.setProperty(DiamondsConfig.getBuildIdProperty(), buildID);
- log.info("got Build ID from diamonds:" + buildID);
- }
- } else {
- diamondsClient.sendData(new FileInputStream(tempFile), buildID);
- }
- mergeToFullResults(new FileInputStream(tempFile));
- } catch (IOException iex) {
- log.debug("IOException while retriving message:", iex);
- throw new DiamondsException("IOException while retriving message");
- }
- catch (MessageCreationException mex) {
- log.debug("IOException while retriving message:", mex);
- throw new DiamondsException("error during message retrival");
- }
- }
-
- /**
- * Send message to diamonds.
- * @param messageId - id to look from in the ant config and to send it to diamonds.
- * id is pointing to an fmpp message.
- */
- public static void sendMessage(String messageId) throws DiamondsException {
- log.debug("send-message:" + messageId);
- synchronized (mutexObject) {
- String buildID = project.getProperty(DiamondsConfig.getBuildIdProperty());
- Object obj = project.getReference(messageId);
- if (obj != null) {
- if (obj instanceof Message) {
- sendMessage((Message)obj, buildID);
- }
- } else {
- log.debug("Message not sent for message id: " + messageId);
- }
- }
- }
-
- /**
- * Initializes the diamonds client and sends the initial data
- */
- @SuppressWarnings("unchecked")
- protected void initDiamondsClient() throws DiamondsException {
- if (!isInitialized) {
- diamondsClient = new DiamondsClient(DiamondsConfig.getHost(),
- DiamondsConfig.getPort(),
- DiamondsConfig.getPath(),
- DiamondsConfig.getMailInfo());
- String buildID = project.getProperty(DiamondsConfig.getBuildIdProperty());
- if (buildID == null ) {
- sendMessage("initial.message");
- }
- isInitialized = true;
- }
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsPostBuildStatusUpdate.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description: To update the build status to Diamonds with signals in case of build exceptions.
- *
- */
-
-package com.nokia.helium.diamonds;
-
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.types.DataType;
-import org.apache.tools.ant.Project;
-import com.nokia.helium.core.ant.PostBuildAction;
-
-/**
- * Class to store the builds status and send the generated XML file to diamonds client class to
- * update the build status into diamonds
- */
-public class DiamondsPostBuildStatusUpdate extends DataType implements PostBuildAction {
- private Logger log;
-
- /* Initiate build status to failed as this method will be invoked in case of exceptions only */
- private String buildStatus = "succeeded";
-
- private String outputFile, templateFile;
-
-
- public DiamondsPostBuildStatusUpdate() {
- log = Logger.getLogger(DiamondsPostBuildStatusUpdate.class);
- }
-
- /**
- * Override execute method to update build status to diamonds.
- *
- * @param prj
- * @param module
- * @param targetNames
- */
- @SuppressWarnings("unchecked")
- public void executeOnPostBuild(Project project, String[] targetNames) {
- try {
- if (DiamondsListenerImpl.isInitialized()) {
- Project prj = DiamondsListenerImpl.getProject();
- prj.setProperty("build.status", buildStatus);
- DiamondsListenerImpl.sendMessage("diamonds-status");
- }
- } catch (DiamondsException de) {
- log.error("Not able to merge into full results XML file " + de.getMessage(), de);
- }
- }
-
-}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsSession.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: To update the build status to Diamonds with signals in case of build exceptions.
+ *
+ */
+package com.nokia.helium.diamonds;
+
+import com.nokia.helium.core.ant.Message;
+
+/**
+ * Defines the interface needed to communicated with Diamonds.
+ *
+ */
+public interface DiamondsSession {
+
+ /**
+ * Open the session, using custom message.
+ * @param message
+ * @throws DiamondsException if the opening failed.
+ */
+ void open(Message message) throws DiamondsException;
+
+ /**
+ * Close the session using a custom message.
+ * @param message
+ * @throws DiamondsException if the session is not opened
+ */
+ void close(Message message) throws DiamondsException;
+
+ /**
+ * Sending a custom message.
+ *
+ * @param message
+ * @throws DiamondsException if the session is not opened
+ */
+ void send(Message message) throws DiamondsException;
+
+ /**
+ * Returns true if the session to diamonds has been opened successfully.
+ * @return
+ */
+ boolean isOpen();
+
+ /**
+ * Returns the build id as a string, or null if session is not yet
+ * open, or opening failed.
+ * @return the build id.
+ */
+ String getBuildId();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsSessionSocket.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,234 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: To update the build status to Diamonds with signals in case of build exceptions.
+ *
+ */
+package com.nokia.helium.diamonds;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.methods.FileRequestEntity;
+import org.apache.commons.httpclient.methods.PostMethod;
+
+import com.nokia.helium.core.EmailDataSender;
+import com.nokia.helium.core.EmailSendException;
+import com.nokia.helium.core.MessageCreationException;
+import com.nokia.helium.core.ant.Message;
+import com.nokia.helium.diamonds.XMLMerger.XMLMergerException;
+
+/**
+ * This class implements the DiamondsSession interface. The implementation
+ * is based on TCP/IP socket communication.
+ *
+ */
+public class DiamondsSessionSocket implements DiamondsSession {
+
+ private List<File> messages = new ArrayList<File>();
+ private String buildId;
+ private HttpClient httpClient = new HttpClient();
+ private URL url;
+ private String email;
+ private String smtpServer;
+ private String ldapServer;
+
+ /**
+ * Create a new session instance. The session needs to be opened.
+ * @param url the diamonds base url
+ * @param email the diamonds email address where to send merged results
+ * @param smtpServer the address of the SMTP server.
+ * @param ldapServer the url of the LDAP server.
+ */
+ public DiamondsSessionSocket(URL url, String email, String smtpServer, String ldapServer) {
+ this.url = url;
+ this.email = email;
+ this.smtpServer = smtpServer;
+ this.ldapServer = ldapServer;
+ }
+
+ /**
+ * Create a new session instance based on an already existing build id
+ * @param url the diamonds base url
+ * @param email the diamonds email address where to send merged results
+ * @param smtpServer the address of the SMTP server.
+ * @param ldapServer the url of the LDAP server.
+ * @param buildId diamonds build id
+ */
+ public DiamondsSessionSocket(URL url, String email, String smtpServer, String ldapServer, String buildId) {
+ this.url = url;
+ this.email = email;
+ this.smtpServer = smtpServer;
+ this.ldapServer = ldapServer;
+ this.buildId = buildId;
+ }
+
+
+ /**
+ * {@inheritDoc}
+ */
+ public synchronized void open(Message message) throws DiamondsException {
+ if (!isOpen()) {
+ buildId = sendInternal(message, false);
+ } else {
+ throw new DiamondsException("Diamonds session is already open.");
+ }
+ }
+
+ /**
+ * Internal method to send data to diamonds.
+ * If ignore result is true, then the method will return null, else the message return by the query
+ * will be returned.
+ * @param message
+ * @param ignoreResult
+ * @return
+ * @throws DiamondsException is thrown in case of message retrieval error, connection error.
+ */
+ protected synchronized String sendInternal(Message message, boolean ignoreResult) throws DiamondsException {
+ URL destURL = url;
+ if (buildId != null) {
+ try {
+ destURL = new URL(url.getProtocol(), url.getHost(), url.getPort(), buildId);
+ } catch (MalformedURLException e) {
+ throw new DiamondsException("Error generating the url to send the message: " + e.getMessage(), e);
+ }
+ }
+ PostMethod post = new PostMethod(destURL.toExternalForm());
+ try {
+ File tempFile = streamToTempFile(message.getInputStream());
+ tempFile.deleteOnExit();
+ messages.add(tempFile);
+ post.setRequestEntity(new FileRequestEntity(tempFile, "text/xml"));
+ } catch (MessageCreationException e) {
+ throw new DiamondsException("Error retrieving the message: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new DiamondsException("Error serializing the message into a temporary file: " + e.getMessage(), e);
+ }
+ try {
+ int result = httpClient.executeMethod(post);
+ if (result != HttpStatus.SC_OK && result != HttpStatus.SC_ACCEPTED) {
+ throw new DiamondsException("Error sending the message: " + post.getStatusLine() +
+ "(" + post.getResponseBodyAsString() + ")");
+ }
+ if (!ignoreResult) {
+ return post.getResponseBodyAsString();
+ }
+ } catch (HttpException e) {
+ throw new DiamondsException("Error sending the message: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new DiamondsException("Error sending the message: " + e.getMessage(), e);
+ } finally {
+ post.releaseConnection();
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public synchronized void send(Message message) throws DiamondsException {
+ if (isOpen()) {
+ sendInternal(message, true);
+ } else {
+ throw new DiamondsException("Diamonds session is not opened.");
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public synchronized void close(Message message) throws DiamondsException {
+ if (isOpen()) {
+ sendInternal(message, true);
+ buildId = null;
+
+ if (!messages.isEmpty()) {
+ // Sending the data via email.
+ String mergingErrors = null;
+ File firstFile = messages.remove(0);
+ try {
+ File fullResultsFile = File.createTempFile("diamonds-full-results", ".xml");
+ XMLMerger merger = new XMLMerger(new FileInputStream(firstFile), fullResultsFile);
+ for (File file : messages) {
+ try {
+ merger.merge(new FileInputStream(file));
+ } catch (XMLMerger.XMLMergerException xe) {
+ mergingErrors = mergingErrors == null ? xe.getMessage() :
+ mergingErrors + "\n" + xe.getMessage();
+ }
+ }
+ EmailDataSender emailSender = new EmailDataSender(email, smtpServer, ldapServer);
+ emailSender.sendData("diamonds", fullResultsFile, "application/xml", "[DIAMONDS_DATA]", null);
+ } catch (IOException e) {
+ throw new DiamondsException("Error while merging the xml files: " + e.getMessage(), e);
+ } catch (XMLMergerException e) {
+ throw new DiamondsException("Error while merging the xml files: " + e.getMessage(), e);
+ } catch (EmailSendException e) {
+ throw new DiamondsException("Error occured while sending mail: " + e.getMessage(), e);
+ }
+ if (mergingErrors != null) {
+ throw new DiamondsException("Error occured while sending mail: " + mergingErrors);
+ }
+ }
+
+ } else {
+ throw new DiamondsException("Diamonds session is not opened.");
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isOpen() {
+ return getBuildId() != null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getBuildId() {
+ return buildId;
+ }
+
+ /**
+ * Write the content of an inputstream into a temp file. Deletion of the file
+ * has to be made by the caller.
+ * @param stream the input stream
+ * @return the temp file created.
+ */
+ protected static File streamToTempFile(InputStream stream) throws IOException {
+ File temp = File.createTempFile("diamonds", "xml");
+ FileOutputStream out = new FileOutputStream(temp);
+ int read = 0;
+ byte[] bytes = new byte[1024];
+
+ while ((read = stream.read(bytes)) != -1) {
+ out.write(bytes, 0, read);
+ }
+ out.flush();
+ out.close();
+ stream.close();
+ return temp;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/DiamondsStatusUpdate.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: To update the build status to Diamonds with signals in case of build exceptions.
+ *
+ */
+
+package com.nokia.helium.diamonds;
+
+import java.text.SimpleDateFormat;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.Project;
+import com.nokia.helium.core.ant.HlmExceptionHandler;
+import com.nokia.helium.core.ant.Message;
+import com.nokia.helium.core.ant.PostBuildAction;
+import com.nokia.helium.diamonds.ant.Listener;
+import com.nokia.helium.signal.ant.SignalStatus;
+import com.nokia.helium.signal.ant.Signals;
+
+
+/**
+ * Class to store the builds status and check the signal is present in the deferred signal list.
+ * if so get the signal informations like signal name, error message and target name.
+ * With collected signal information and build status send the generated XML file to diamonds client class
+ * to update the information into diamonds
+ *
+ * @ant.type name="diamondsStatusUpdate" category="diamonds"
+ */
+public class DiamondsStatusUpdate extends DataType implements HlmExceptionHandler, PostBuildAction {
+ private static final String BUILD_SIGNAL_MESSAGE_REFERENCE_ID = "diamonds.signal.message";
+ private static final String BUILD_STATUS_MESSAGE_REFERENCE_ID = "diamonds.status.message";
+ private static final String BUILD_STATUS_PROPERTY = "build.status";
+ private String buildStatus = "succedded";
+
+ /**
+ * Implements the Exception method to update build status and signal information to diamonds.
+ * @param project
+ * @param module
+ * @param e
+ */
+ public void handleException(Project project, Exception e) {
+ buildStatus = "failed";
+ Listener listener = Listener.getDiamondsListener(project);
+ if (listener != null && listener.getConfiguration() != null &&
+ listener.getSession() != null && listener.getSession().isOpen()) {
+ try {
+ log("Build Status = " + buildStatus, Project.MSG_DEBUG);
+ project.setProperty(BUILD_STATUS_PROPERTY, buildStatus);
+ sendMessage(listener, BUILD_STATUS_MESSAGE_REFERENCE_ID);
+ } catch (DiamondsException dex) {
+ log(dex.getMessage(), Project.MSG_WARN);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void executeOnPostBuild(Project project, String[] targetNames) {
+ Listener listener = Listener.getDiamondsListener(project);
+ if (listener != null && listener.getSession() != null && listener.getSession().isOpen()) {
+ try {
+ // Sending the signal data on post build, as they have already been raised.
+ sendSignals(listener);
+ log("Build Status = " + buildStatus, Project.MSG_DEBUG);
+ project.setProperty(BUILD_STATUS_PROPERTY, buildStatus);
+ sendMessage(listener, BUILD_STATUS_MESSAGE_REFERENCE_ID);
+ } catch (DiamondsException de) {
+ log("Not able to merge into full results XML file " + de.getMessage(), Project.MSG_WARN);
+ }
+ }
+ }
+
+ /**
+ * Send a message.
+ * @param listener the diamonds listener
+ * @param the messageId a reference string to a Message instance.
+ */
+ protected void sendMessage(Listener listener, String messageId) throws DiamondsException {
+ Object object = listener.getProject().getReference(messageId);
+ if (object != null
+ && object instanceof Message) {
+ listener.getSession().send((Message)object);
+ }
+ }
+
+ /**
+ * Sending signal information to diamonds
+ * @param project the root project instance
+ * @param listener the diamonds listener.
+ * @return
+ */
+ protected void sendSignals(Listener listener) {
+ Project project = listener.getProject();
+ try {
+ SimpleDateFormat timeFormat = new SimpleDateFormat(listener.getConfiguration().getTimeFormat());
+ int i = 0;
+ if (!Signals.getSignals().getDeferredSignalList().isEmpty()) {
+ buildStatus = "failed";
+ for (SignalStatus status : Signals.getSignals().getDeferredSignalList()) {
+ project.setProperty("diamond.signal.name." + i, status.getName());
+ project.setProperty("diamond.error.message." + i, status.getMessage());
+ project.setProperty("diamond.time.stamp." + i, new String(timeFormat.format(status.getTimestamp())));
+ i += 1;
+ }
+ }
+ if (!Signals.getSignals().getNowSignalList().isEmpty()) {
+ buildStatus = "failed";
+ for (SignalStatus status : Signals.getSignals().getNowSignalList()) {
+ project.setProperty("diamond.signal.name." + i, status.getName());
+ project.setProperty("diamond.error.message." + i, status.getMessage());
+ project.setProperty("diamond.time.stamp." + i,new String(timeFormat.format(status.getTimestamp())));
+ i += 1;
+ }
+ }
+ // At list one signal has been found, let's send the message.
+ if (i > 0) {
+ sendMessage(listener, BUILD_SIGNAL_MESSAGE_REFERENCE_ID);
+ }
+ } catch (DiamondsException dex) {
+ log(dex.getMessage(), Project.MSG_WARN);
+ }
+ }
+}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/StageDiamondsListener.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,202 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.diamonds;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Vector;
-
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Target;
-import com.nokia.helium.core.ant.types.Stage;
-
-/**
- * Diamonds client used to connect to get build id and also to send the build results
- *
- */
-public class StageDiamondsListener extends DiamondsListenerImpl {
-
- private static final Date INVALID_DATE = new Date(-1);
-
- private static Object mutexObject = new Object();;
-
- private Logger log = Logger.getLogger(StageDiamondsListener.class);
-
- private List<Map<String, Date>> stageTargetBeginList = new ArrayList<Map<String, Date>>();
-
- private Map<String, List<Stage>> stageTargetEndMap = new HashMap<String, List<Stage>>();
-
- private Map<String, String> stageStartTargetMap = new HashMap<String, String>();
-
- private Map<String, Date> stageStartTargetTimeMap = new HashMap<String, Date>();
-
- private boolean isTargetMapInitialized;
-
- private Map<String, Stage> stages;
-
-
- public StageDiamondsListener() {
- stages = DiamondsConfig.getStages();
- }
-
- public void targetBegin(BuildEvent buildEvent) throws DiamondsException {
- initDiamondsClient();
- Project projectInStage = buildEvent.getProject();
- int hashCode = projectInStage.hashCode();
- String targetName = buildEvent.getTarget().getName();
- if (!isTargetMapInitialized && stages != null) {
- log.debug("diamonds:StageDiamondsListener: initializing for all stages.");
- initStageTargetsMap(projectInStage);
- isTargetMapInitialized = true;
- }
- String targetNameWithHashCode = targetName + "-" + hashCode;
- log.debug("targetBegin: targetNameWithHashCode: " + targetNameWithHashCode);
- log.debug("targetBegin targetName: " + targetName + " - currentStartTargetName:"
- + stageStartTargetMap.get(targetNameWithHashCode));
- if (stageStartTargetMap.get(targetNameWithHashCode) == null) {
- log.debug("looking for start target match and associating time to it");
- findAndSetStartTimeForTargetInStageList(targetName, targetNameWithHashCode);
- }
- }
-
- private Date getStartTime(Stage stage) {
- String startTargetName = stage.getStartTarget();
- for (Iterator<Map<String, Date>> listIter = stageTargetBeginList.iterator(); listIter.hasNext();) {
- Map<String, Date> stageMap = listIter.next();
- if (stageMap.get(startTargetName) != null) {
- Set<String> targetSet = stageMap.keySet();
- for (String key : targetSet) {
- log.debug("key: " + key);
- Date time = stageMap.get(key);
- log.debug("time: " + time);
- if (time != INVALID_DATE) {
- return time;
- }
- }
- }
- }
- throw new BuildException("No time recorded " + "for stage:" + stage.getStageName());
- }
-
- private void sendStageInfo(String targetName, int hashCode) throws DiamondsException {
- List<Stage> stageList = stageTargetEndMap.get(targetName);
- synchronized (mutexObject) {
- if (stageList != null) {
- for (Stage stage : stageList) {
- if (stage != null) {
- log.debug("stage.name: " + stage.getStageName());
- log.debug("stage.start target name: " + stage.getStartTarget());
- String currentStageTargetName = stageStartTargetMap.get(stage.getStartTarget()
- + "-" + hashCode);
- log.debug("getStageBasedOnEndTarget: currentStargetTargetName" + currentStageTargetName);
- if (currentStageTargetName != null) {
- log.debug("stage in targetend: " + stage);
- if (stage != null && getIsInitialized()) {
- //initDiamondsClient();
- String stageName = stage.getStageName();
- log.debug("stageName in targetend: " + stageName);
- String stageMessage = stageName + ".id";
- sendMessage(stageMessage);
- Date startTime = getStartTime(stage);
- getProject().setProperty("logical.stage", stageName);
- getProject().setProperty("stage.start.time", getTimeFormat().format(startTime));
- getProject().setProperty("stage.end.time", getTimeFormat().format(new Date()));
- sendMessage("stage.time.message");
- }
- }
- }
- }
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- public void targetEnd(BuildEvent buildEvent) throws DiamondsException {
- String targetName = buildEvent.getTarget().getName();
- Project prj = buildEvent.getProject();
- int hashCode = prj.hashCode();
- String targetNameWithHashCode = targetName + "-" + hashCode;
- log.debug("targetEnd: targetNamewith-hashcode: " + targetNameWithHashCode);
- sendStageInfo(targetName, hashCode);
- }
-
- private void findAndSetStartTimeForTargetInStageList(String targetName,
- String targetNameWithHashCode) throws DiamondsException {
- for (Iterator<Map<String, Date>> listIter = stageTargetBeginList.iterator(); listIter.hasNext();) {
- Map<String, Date> stageMap = listIter.next();
- Date targetTime = stageMap.get(targetName);
- if (targetTime != null && targetTime.equals(INVALID_DATE)) {
- log.debug("diamonds:StageDiamondsListener: started recording for stage-target-----: "
- + targetName);
- log.debug("findtime: targetNamewith-hashcode: " + targetNameWithHashCode);
- log.debug("findtime: time: " + new Date());
- stageMap.put(targetName, new Date());
- stageStartTargetMap.put(targetNameWithHashCode, targetName);
- stageStartTargetTimeMap.put(targetNameWithHashCode, new Date());
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- private void initStageTargetsMap(Project projectInStage) {
- for (String key : stages.keySet()) {
- Stage stage = stages.get(key);
- String startTargetName = stage.getStartTarget();
- Map<String, Date> stageMap = new LinkedHashMap<String, Date>();
- Vector<Target> arrayList = null;
- try {
- arrayList = projectInStage.topoSort(startTargetName, projectInStage.getTargets(), false);
- }
- catch (BuildException be) {
- log.debug("Diamonds target missing: ", be);
- }
- if (arrayList != null) {
- log.debug(" + Stage definition: " + stage.getStageName());
- Enumeration<Target> targetEnum = arrayList.elements();
- while (targetEnum.hasMoreElements()) {
- // fast lookup
- Target target = targetEnum.nextElement();
- stageMap.put(target.getName(), INVALID_DATE);
- log.debug(" - Start target: " + target.getName());
- }
- stageTargetBeginList.add(stageMap);
-
- // stage end process
- String endTargetName = stage.getEndTarget();
- // fast lookup
- List<Stage> existingStageList = stageTargetEndMap.get(endTargetName);
- if (existingStageList == null) {
- existingStageList = new ArrayList<Stage>();
- stageTargetEndMap.put(endTargetName, existingStageList);
- }
- existingStageList.add(stage);
- log.debug(" - End target: " + endTargetName);
- }
- }
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/TargetDiamondsListener.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.diamonds;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Map;
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Target;
-import com.nokia.helium.core.ant.types.TargetMessageTrigger;
-import com.nokia.helium.core.ant.Message;
-
-/**
- * Listener sending data based on target configuration to diamonds.
- */
-public class TargetDiamondsListener extends DiamondsListenerImpl {
-
-
- private Logger log = Logger.getLogger(TargetDiamondsListener.class);
-
- private Map<String, TargetMessageTrigger> targetsMap;
-
- private String currentTarget;
-
- /**
- * Default constructor
- */
- public TargetDiamondsListener() {
- targetsMap = DiamondsConfig.getTargetsMap();
- for (String key : targetsMap.keySet()) {
- log.debug("target name: " + key);
- }
- }
-
- private boolean isTargetsToExecute(BuildEvent buildEvent) {
- Project projectInTarget = buildEvent.getProject();
- Target target = buildEvent.getTarget();
- boolean retValue = false;
- log.debug("isTargetsToExecute: target:" + target.getName() );
- TargetMessageTrigger targetInMap = targetsMap.get(target.getName());
- log.debug("isTargetsToExecute: targetInMap:" + targetInMap );
- if (targetInMap != null) {
- log.debug("target: " + target.getName());
- log.debug("targetInMap: " + targetInMap);
- String targetNameInMap = targetInMap.getTargetName();
- log.debug("targetNameInMap: " + targetInMap.getTargetName());
- if (targetNameInMap != null) {
- retValue = true;
- String ifCondition = target.getIf();
- if ((ifCondition != null) && (projectInTarget.getProperty(
- projectInTarget.replaceProperties(ifCondition)) == null)) {
- retValue = false;
- }
- String unlessCondition = target.getUnless();
- if (unlessCondition != null && (projectInTarget.getProperty(
- projectInTarget.replaceProperties(unlessCondition)) != null)) {
- retValue = false;
- }
- }
- }
- return retValue;
- }
-
- /**
- * Function to process logging info during beginning of target execution. This checks that the
- * current target execution is in config and requires some data to be send it to diamonds.
- *
- * @param event of target execution.
- */
- public void targetBegin(BuildEvent buildEvent) throws DiamondsException {
- initDiamondsClient();
- String targetName = buildEvent.getTarget().getName();
- if (isTargetsToExecute(buildEvent)) {
- currentTarget = targetName;
- }
- }
-
- /**
- * Function to process logging info during end of build. If the target in config, sends the data
- * to diamonds (uses the template conversion if needed).
- *
- * @param event of target execution.
- */
- public void targetEnd(BuildEvent buildEvent) throws DiamondsException {
- String targetName = buildEvent.getTarget().getName();
- if (isTargetsToExecute(buildEvent)) {
- if (currentTarget != null && currentTarget.equals(targetName)) {
- log.debug("targetEnd: " + targetName);
- if (getIsInitialized()) {
- log.debug("diamonds:TargetDiamondsListener:finished recording, sending data to diamonds for target: "
- + buildEvent.getTarget().getName());
- sendTargetData(buildEvent, buildEvent.getTarget().getProject());
- }
- currentTarget = null;
- }
- }
- }
-
- private void sendData(InputStream stream) throws DiamondsException {
- String urlPath = DiamondsConfig.getBuildId();
- getDiamondsClient().sendData(stream, urlPath);
- log.debug("urlPath:" + urlPath);
- }
- /**
- * Sends the data to diamonds. First it looks if the template with target name exists, then it
- * looks for input source file from config, if ant properties required from config, it uses it
- * for template conversion. If no template file exists, sends the data directly.
- *
- * @param event of target execution.
- */
- private void sendTargetData(BuildEvent buildEvent, Project project) throws DiamondsException {
- TargetMessageTrigger targetMap = targetsMap.get(currentTarget);
- if (targetMap != null) {
-
- List<Message> messageList = targetMap.getMessageList();
- for ( Message message : messageList ) {
- try {
- File tempFile = streamToTempFile(message.getInputStream());
- tempFile.deleteOnExit();
- sendData(new FileInputStream(tempFile));
- mergeToFullResults(new FileInputStream(tempFile));
- } catch (IOException iex) {
- throw new DiamondsException("error closing the stream while sending data");
- }
- catch (com.nokia.helium.core.MessageCreationException mex) {
- log.debug("IOException while retriving message:", mex);
- throw new DiamondsException("error during message retrival");
- }
- }
- }
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/ant/HeliumListener.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,248 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-
-package com.nokia.helium.diamonds.ant;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.BuildListener;
-import org.apache.tools.ant.Project;
-
-import com.nokia.helium.diamonds.AllTargetDiamondsListener;
-import com.nokia.helium.diamonds.DiamondsConfig;
-import com.nokia.helium.diamonds.DiamondsException;
-import com.nokia.helium.diamonds.DiamondsListener;
-import com.nokia.helium.diamonds.DiamondsListenerImpl;
-import com.nokia.helium.diamonds.StageDiamondsListener;
-import com.nokia.helium.diamonds.TargetDiamondsListener;
-
-/**
- * Listener class that can connect to Ant and log information regarding to build
- * times, number of errors and such. Data is sent to Diamonds server, where it
- * is processed further.
- *
- * This class is listening all build related events. It catches the build
- * start-finish, target start-finish events of Ant and gather build start-end
- * time, errors/warnings and store in BuildData class. Stored data will be
- * exported to XML and uploaded to Diamonds server after each specific target.
- * For example after target "create-bom" this class will upload all BOM data to
- * Diamonds.
- *
- *
- */
-public class HeliumListener implements BuildListener {
-
- private Logger log = Logger.getLogger(HeliumListener.class);
-
- private List<DiamondsListener> diamondsListeners;
-
- private Project project;
-
- private boolean isInitialized;
-
- private boolean skipDiamonds ;
- private boolean skipDiamondsSet;
-
- /**
- * Default constructor.
- */
- public HeliumListener() {
- diamondsListeners = new ArrayList<DiamondsListener>();
- }
-
- /**
- * Ant call this function when build start.
- */
- public void buildStarted(BuildEvent event) {
- project = event.getProject();
- }
-
- /**
- * Triggered when a target starts.
- */
- @SuppressWarnings("unchecked")
- public void targetStarted(BuildEvent event) {
- Project prj = event.getProject();
- String targetName = event.getTarget().getName();
-
- String diamondsEnabled = prj.getProperty("diamonds.enabled");
- String skip = prj.getProperty("skip.diamonds");
- log.debug("diamondsenabled: " + diamondsEnabled);
- log.debug("skip: " + skip);
- if (!isInitialized) {
- if (diamondsEnabled != null && !Project.toBoolean(diamondsEnabled)) {
- log.info("'diamonds.enabled' is not true, to use diamonds set 'diamonds.enabled' to 'true'.");
- skipDiamonds = true;
- isInitialized = true;
- } else if (skip != null && Project.toBoolean(skip)) {
- log.info("'skip.diamonds' is deprecated. Please consider using 'diamonds.enabled'.");
- skipDiamonds = true;
- isInitialized = true;
- }
- }
-
- try {
- if (!skipDiamonds) {
- if (!isInitialized) {
- /**
- * Initialize Diamonds if and only if initializer-target-name has been called
- */
- String buildID = prj.getProperty(DiamondsConfig.getBuildIdProperty());
- log.debug("targetStarted:buildid:" + buildID);
- String initializerTargetName = prj.getProperty(DiamondsConfig.getInitializerTargetProperty());
- log.debug("initializerTargetName:" + initializerTargetName);
- log.debug("targetName:" + targetName);
- if ( buildID != null || (initializerTargetName != null && targetName.equals(initializerTargetName))) {
- isInitialized = true;
- project = prj;
- log.debug("trying to initialize diamonds config");
- DiamondsConfig.initialize(project);
- DiamondsListenerImpl.initialize(project);
- String category = DiamondsConfig.getCategory();
- log.debug("category:" + category);
- if (category != null && diamondsListeners.isEmpty()) {
- addListeners(event);
- log.info("Diamonds enabled");
- }
- }
- }
- } else {
- if (!skipDiamondsSet && skipDiamonds)
- {
- skipDiamondsSet = true;
- }
- }
- } catch (DiamondsException ex) {
- log.debug("Diamonds error: ", ex);
- String errorMessage = ex.getMessage();
- if (errorMessage == null) {
- errorMessage = "";
- }
- log.error("Diamonds Error, might not be logged properly, see debug log. "
- + errorMessage);
- }
- if (diamondsListeners != null) {
- for (DiamondsListener diamondsListener : diamondsListeners) {
- try {
- diamondsListener.targetBegin(event);
- } catch (DiamondsException e) {
- e.printStackTrace();
- log.debug("Error:", e);
- String errorMessage = e.getMessage();
- if (errorMessage == null) {
- errorMessage = "";
- }
- log.error("Diamonds Error, might not be logged properly, see debug log. "
- + errorMessage);
- }
- }
- }
- }
-
- private void addListeners(BuildEvent event) throws DiamondsException {
- if (DiamondsConfig.isStagesInConfig()) {
- StageDiamondsListener stageListener = new StageDiamondsListener();
- diamondsListeners.add(stageListener);
- stageListener.buildBegin(event);
- }
- if (DiamondsConfig.isTargetsInConfig()) {
- TargetDiamondsListener targetListener = new TargetDiamondsListener();
- diamondsListeners.add(targetListener);
- targetListener.buildBegin(event);
- }
-
- AllTargetDiamondsListener allTargetListener = new AllTargetDiamondsListener();
- diamondsListeners.add(allTargetListener);
- allTargetListener.buildBegin(event);
- }
-
- /**
- * Triggered when a target finishes.
- */
- public void targetFinished(BuildEvent event) {
- if (diamondsListeners != null) {
- for (DiamondsListener diamondsListener : diamondsListeners) {
- try {
- diamondsListener.targetEnd(event);
- } catch (DiamondsException e) {
- log.debug("Error:", e);
- String errorMessage = e.getMessage();
- if (errorMessage == null) {
- errorMessage = "";
- }
- log.error("Diamonds Error, might not be logged properly, see debug log. "
- + errorMessage);
- }
-
- }
- }
- }
-
- /**
- * Triggered when the build finishes.
- */
- public void buildFinished(BuildEvent event) {
- if (diamondsListeners != null) {
- for (DiamondsListener diamondsListener : diamondsListeners) {
- try {
- diamondsListener.buildEnd(event);
- } catch (DiamondsException e) {
- log.error("Failed to log in diamonds: " + e);
- }
-
- }
- }
- project = event.getProject();
- cleanup();
- }
-
- /**
- * See if build needs a final cleanup target to be called.
- */
- private void cleanup() {
- String loggingoutputfile = project.getProperty("logging.output.file");
- if (loggingoutputfile != null) {
- File file = new File(loggingoutputfile);
- if (file.exists()) {
- file.delete();
- }
- }
- }
-
- /**
- * Triggered when a task starts.
- */
- public void taskStarted(BuildEvent event) {
- }
-
- /**
- * Triggered when a task finishes.
- */
- public void taskFinished(BuildEvent event) {
- }
-
- /**
- * Triggered when a build message is logged.
- */
- public void messageLogged(BuildEvent event) {
- }
-}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/ant/Listener.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,250 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.helium.diamonds.ant;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.Project;
+
+
+import com.nokia.helium.core.ant.Message;
+import com.nokia.helium.diamonds.DiamondsConfig;
+import com.nokia.helium.diamonds.DiamondsException;
+import com.nokia.helium.diamonds.DiamondsListener;
+import com.nokia.helium.diamonds.DiamondsSession;
+import com.nokia.helium.diamonds.DiamondsSessionSocket;
+
+/**
+ * Listener class that can connect to Ant and log information regarding to build
+ * times, number of errors and such. Data is sent to Diamonds server, where it
+ * is processed further.
+ *
+ * This class is listening all build related events. It catches the build
+ * start-finish, target start-finish events of Ant and gather build start-end
+ * time, errors/warnings and store in BuildData class. Stored data will be
+ * exported to XML and uploaded to Diamonds server after each specific target.
+ * For example after target "create-bom" this class will upload all BOM data to
+ * Diamonds.
+ *
+ *
+ */
+public class Listener implements BuildListener {
+
+ private static final String INITIAL_MESSAGE = "initial.message";
+ private static final String FINAL_MESSAGE = "final.message";
+ private static final String BUILD_START_TIME_PROPERTY = "build.start.time";
+ private static final String BUILD_END_TIME_PROPERTY = "build.end.time";
+ private Project project;
+ private DiamondsConfig config;
+ private DiamondsSession session;
+ private List<DiamondsListener> diamondsListeners = new ArrayList<DiamondsListener>();
+ private Date startTime = new Date();
+
+ public DiamondsConfig getConfiguration() {
+ return config;
+ }
+
+ public DiamondsSession getSession() {
+ return session;
+ }
+
+ public Project getProject() {
+ return project;
+ }
+
+ /**
+ * Ant call this function when build start.
+ */
+ public void buildStarted(BuildEvent event) {
+ }
+
+ private Message getMessage(String messageId) throws DiamondsException {
+ Object obj = project.getReference(messageId);
+ if (obj != null && obj instanceof Message) {
+ return (Message)obj;
+ }
+ throw new DiamondsException("Could not find message '" + messageId + "'");
+ }
+
+ /**
+ * Triggered when a target starts.
+ */
+ public void targetStarted(BuildEvent event) {
+ if (project == null) {
+ project = event.getProject();
+ try {
+ config = new DiamondsConfig(project);
+
+ // Set initial start time property.
+ SimpleDateFormat timeFormat = new SimpleDateFormat(config.getTimeFormat());
+ project.setProperty(BUILD_START_TIME_PROPERTY, timeFormat.format(startTime));
+ } catch (DiamondsException e) {
+ config = null;
+ project.log("Diamonds reporting is disabled, because the listener is not configured properly: " + e.getMessage(), Project.MSG_ERR);
+ }
+ if (config == null || !config.isDiamondsEnabled()) {
+ project.log("'diamonds.enabled' is not true, to use diamonds set 'diamonds.enabled' to 'true'.");
+ } else {
+ try {
+ for (Object object : project.getReferences().values()) {
+ if (object instanceof DiamondsListener) {
+ DiamondsListener diamondsListener = (DiamondsListener)object;
+ diamondsListener.configure(this);
+ project.log("Adding DiamondsListener: " + diamondsListener.getClass(), Project.MSG_DEBUG);
+ diamondsListeners.add(diamondsListener);
+ }
+ }
+ } catch (DiamondsException e) {
+ throw new BuildException("Diamonds listener is not configured properly: " + e.getMessage(), e);
+ }
+ }
+ for (DiamondsListener diamondsListener : diamondsListeners) {
+ try {
+ diamondsListener.buildStarted(new BuildEvent(project));
+ } catch (DiamondsException e) {
+ // Voluntarily ignoring errors happening.
+ project.log(e.getMessage(), Project.MSG_ERR);
+ }
+ }
+ }
+
+ if (config != null && config.isDiamondsEnabled() && session == null) {
+ String buildId = project.getProperty(config.getBuildIdProperty());
+ try {
+ if (session == null && buildId != null) {
+ project.log("Reusing diamonds session with the following build id: " + buildId);
+ // we have a pre-configured build id.
+ session = new DiamondsSessionSocket(new URL("http", config.getHost(),
+ Integer.parseInt(config.getPort()), config.getPath()),
+ config.getMailInfo(), config.getSMTPServer(), config.getLDAPServer(), buildId);
+ } else if (session == null && event.getTarget().getName().equals(config.getInitializerTargetName())) {
+ session = new DiamondsSessionSocket(new URL("http", config.getHost(),
+ Integer.parseInt(config.getPort()), config.getPath()),
+ config.getMailInfo(), config.getSMTPServer(), config.getLDAPServer());
+ session.open(getMessage(INITIAL_MESSAGE));
+ // defining build id on the both root project, and current target project.
+ event.getTarget().getProject().setProperty(config.getBuildIdProperty(), session.getBuildId());
+ project.setProperty(config.getBuildIdProperty(), session.getBuildId());
+ project.log("Diamonds build id: " + project.getProperty(config.getBuildIdProperty()));
+ }
+ } catch (NumberFormatException e) {
+ project.log(e.getMessage(), Project.MSG_ERR);
+ project.log("Diamonds reporting will be disabled.", Project.MSG_ERR);
+ session = null;
+ } catch (MalformedURLException e) {
+ project.log(e.getMessage(), Project.MSG_ERR);
+ project.log("Diamonds reporting will be disabled.", Project.MSG_ERR);
+ session = null;
+ } catch (DiamondsException e) {
+ project.log(e.getMessage(), Project.MSG_ERR);
+ project.log("Diamonds reporting will be disabled.", Project.MSG_ERR);
+ session = null;
+ }
+ } else if (session != null && session.isOpen()) {
+ for (DiamondsListener diamondsListener : diamondsListeners) {
+ try {
+ diamondsListener.targetStarted(event);
+ } catch (DiamondsException e) {
+ // Voluntarily ignoring errors happening.
+ project.log(e.getMessage(), Project.MSG_ERR);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Triggered when a target finishes.
+ */
+ public void targetFinished(BuildEvent event) {
+ if (config != null && config.isDiamondsEnabled() && session != null && session.isOpen()) {
+ for (DiamondsListener diamondsListener : diamondsListeners) {
+ try {
+ diamondsListener.targetFinished(event);
+ } catch (DiamondsException e) {
+ // Voluntarily ignoring errors happening.
+ project.log(e.getMessage(), Project.MSG_ERR);
+ }
+ }
+ }
+ }
+
+ /**
+ * Triggered when the build finishes.
+ */
+ public void buildFinished(BuildEvent event) {
+ if (config != null && config.isDiamondsEnabled() && session != null && session.isOpen()) {
+ // Setting the final timestamp
+ SimpleDateFormat timeFormat = new SimpleDateFormat(config.getTimeFormat());
+ project.setProperty(BUILD_END_TIME_PROPERTY, timeFormat.format(new Date()));
+ for (DiamondsListener diamondsListener : diamondsListeners) {
+ try {
+ diamondsListener.buildFinished(event);
+ } catch (DiamondsException e) {
+ // Voluntarily ignoring errors happening.
+ project.log(e.getMessage(), Project.MSG_ERR);
+ }
+ }
+ try {
+ // Sending the message
+ Message message = getMessage(FINAL_MESSAGE);
+ session.close(message);
+ } catch (DiamondsException e) {
+ project.log(e.getMessage(), Project.MSG_ERR);
+ }
+ }
+ }
+
+
+ /**
+ * Triggered when a task starts.
+ */
+ public void taskStarted(BuildEvent event) {
+ }
+
+ /**
+ * Triggered when a task finishes.
+ */
+ public void taskFinished(BuildEvent event) {
+ }
+
+ /**
+ * Triggered when a build message is logged.
+ */
+ public void messageLogged(BuildEvent event) {
+ }
+
+
+ public static Listener getDiamondsListener(Project project) {
+ for (Object bl : project.getBuildListeners()) {
+ if (bl instanceof Listener) {
+ return (Listener)bl;
+ }
+ }
+ return null;
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/ant/antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : antlib.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<antlib>
+ <!-- Task definition -->
+ <!-- Type definition -->
+ <typedef name="targetTimingMessageListener" classname="com.nokia.helium.diamonds.ant.types.AllTargetDiamondsListener"/>
+ <typedef name="targetMessageListener" classname="com.nokia.helium.diamonds.ant.types.TargetDiamondsListener" />
+ <typedef name="stageMessageListener" classname="com.nokia.helium.diamonds.ant.types.StageDiamondsListener" />
+
+</antlib>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/ant/types/AllTargetDiamondsListener.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.helium.diamonds.ant.types;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Vector;
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Target;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.ant.types.FileMessage;
+import com.nokia.helium.diamonds.DiamondsException;
+import com.nokia.helium.diamonds.DiamondsListener;
+import com.nokia.helium.diamonds.ant.Listener;
+
+/**
+ * The targetTimingMessageListener should be used as a reference in a build
+ * file so the message listener can detect it an record target execution time
+ * before sending it.
+ *
+ * <pre>
+ * <hlm:targetTimingMessageListener id="target.time.message.listener" />
+ * </pre>
+ *
+ * @ant.type name="targetTimingMessageListener" category="Diamonds"
+ */
+public class AllTargetDiamondsListener extends DataType implements DiamondsListener {
+
+ private List<AntTarget> antTargets = new Vector<AntTarget>();
+ private List<AntTarget> completedTargets = new Vector<AntTarget>();
+ private Listener diamondsListener;
+ private int minTime = 5000; // in ms
+
+ /**
+ * Function to process logging info during end of build
+ *
+ * @param event of target execution.
+ */
+ class AntTarget {
+ private String targetName;
+ private Date startTime;
+ private Date endTime;
+ private int hashCode;
+
+ public AntTarget(Target target) {
+ targetName = target.getName();
+ this.hashCode = target.hashCode();
+ startTime = new Date();
+ }
+
+ public String getName() { return targetName; }
+ public Date getStartTime() { return startTime; }
+ public Date getEndTime() { return endTime; }
+ public void setEndTime(Date e) { endTime = e; }
+ public boolean equals(Object obj) { return obj.hashCode() == hashCode; }
+ public int hashCode() { return hashCode; }
+ }
+
+ public synchronized void buildFinished(BuildEvent buildEvent) throws DiamondsException {
+ try {
+ SimpleDateFormat timeFormat = new SimpleDateFormat(diamondsListener.getConfiguration().getTimeFormat());
+ File tempFile = File.createTempFile("diamonds-targets", ".xml");
+ tempFile.deleteOnExit();
+ BufferedWriter out = new BufferedWriter(new FileWriter(tempFile));
+ out.write("<?xml version=\"1.0\" ?>\n");
+ out.write("<diamonds-build>\n");
+ out.write("<schema>24</schema>\n");
+ out.write("<targets>\n");
+
+ for (AntTarget at : completedTargets) {
+ if (at.getEndTime() != null) {
+ out.write("<target>\n");
+ out.write("<name>" + at.getName() + "</name>\n");
+ out.write("<started>" + timeFormat.format(at.getStartTime()) + "</started>\n");
+ out.write("<finished>" + timeFormat.format(at.getEndTime()) + "</finished>\n");
+ out.write("</target>\n");
+ }
+ }
+
+ out.write("</targets>\n");
+ out.write("</diamonds-build>\n");
+ out.close();
+ FileMessage message = new FileMessage();
+ message.setProject(getProject());
+ message.setFile(tempFile);
+ diamondsListener.getSession().send(message);
+ } catch (IOException e) {
+ throw new DiamondsException(e.getMessage(), e);
+ }
+ }
+
+ public void buildStarted(BuildEvent buildEvent) throws DiamondsException {
+ }
+
+ public void configure(Listener listener) throws DiamondsException {
+ diamondsListener = listener;
+ }
+
+ public synchronized void targetFinished(BuildEvent buildEvent) throws DiamondsException {
+ for (AntTarget at : antTargets) {
+ if (at.equals(buildEvent.getTarget())) {
+ at.setEndTime(new Date());
+ if (at.getEndTime().getTime() - at.getStartTime().getTime() >= minTime) {
+ completedTargets.add(at);
+ }
+ antTargets.remove(at);
+ break;
+ }
+ }
+ }
+
+ public synchronized void targetStarted(BuildEvent buildEvent) throws DiamondsException {
+ antTargets.add(new AntTarget(buildEvent.getTarget()));
+ }
+
+ /**
+ * Defines the minimum execution time for a target to be recorded. Time is in millisecond.
+ * If set to 0 then all target are recorded.
+ * @param minTime
+ * @ant.not-required Default is 5000ms
+ */
+ public void setMinTime(Integer minTime) {
+ if (minTime.intValue() < 0) {
+ throw new BuildException("Invalid value for minTime attribute: " +
+ minTime.intValue() + ", value must be >=0. At " + this.getLocation());
+ }
+ this.minTime = minTime.intValue();
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/ant/types/StageDiamondsListener.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.helium.diamonds.ant.types;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.ant.Message;
+import com.nokia.helium.core.ant.types.Stage;
+import com.nokia.helium.diamonds.DiamondsException;
+import com.nokia.helium.diamonds.DiamondsListener;
+import com.nokia.helium.diamonds.ant.Listener;
+
+/**
+ * The targetTimingMessageListener should be used as a reference in a build
+ * file so the message listener can detect it an record target execution time
+ * before sending it.
+ *
+ * <pre>
+ * <hlm:stageMessageListener id="stage.message.listener">
+ * <hlm:fmppMessage sourceFile="tool.xml.ftl">
+ * <data expandProperties="yes">
+ * ant: antProperties()
+ * </data>
+ * </hlm:fmppMessage>
+ * </hlm:stageMessageListener>
+ * </pre>
+ *
+ * @ant.type name="stageMessageListener" category="Diamonds"
+ */
+public class StageDiamondsListener extends DataType implements DiamondsListener {
+ private Listener diamondsListener;
+ private List<DiamondsStage> stages = new ArrayList<DiamondsStage>();
+ private List<DiamondsStage> completedStages = new ArrayList<DiamondsStage>();
+ private DiamondsStage currentStage;
+ private Message message;
+
+ class DiamondsStage extends Stage {
+ private Date startTime;
+ private Date endTime;
+ private String stageName;
+
+ public DiamondsStage(Stage stage) {
+ this.setEndTarget(stage.getEndTarget());
+ this.setStartTarget(stage.getStartTarget());
+ stageName = stage.getStageName();
+ }
+
+ public void setStartTime(Date startTime) {
+ this.startTime = startTime;
+ }
+
+ public void setEndTime(Date endTime) {
+ this.endTime = endTime;
+ }
+
+ public void setProperties(Project project, String timeFormatString) {
+ SimpleDateFormat timeFormat = new SimpleDateFormat(timeFormatString);
+ project.setProperty("logical.stage", this.getStageName());
+ project.setProperty("stage.start.time", timeFormat.format(startTime));
+ project.setProperty("stage.end.time", timeFormat.format(endTime));
+ }
+
+ public String getStageName() {
+ return stageName;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void configure(Listener listener) throws DiamondsException {
+ diamondsListener = listener;
+ if (message == null) {
+ throw new BuildException(this.getDataTypeName() + " must have one nested message at " + this.getLocation());
+ }
+ Map<String, String> startStageName = new Hashtable<String, String>();
+ for (Map.Entry<String, Object> entry : ((Map<String, Object>)listener.getProject().getReferences()).entrySet()) {
+ if (entry.getValue() instanceof Stage) {
+ Stage stage = (Stage)entry.getValue();
+ if (stage.getStartTarget() != null && stage.getEndTarget() != null) {
+ if (startStageName.containsKey(stage.getStartTarget())) {
+ log("Stage " + entry.getKey() + " uses the start target named '" + stage.getStartTarget() +
+ "' which is already used by stage " + startStageName.get(stage.getStartTarget()) +
+ ". Stage " + entry.getKey() + " will be ignored.", Project.MSG_WARN);
+ } else {
+ if (!getProject().getTargets().containsKey(stage.getStartTarget())) {
+ log("Stage " + entry.getKey() + " refer to an inexistant start target: " + stage.getStartTarget()
+ + ". Stage will be ignored", Project.MSG_ERR);
+ } else if (!getProject().getTargets().containsKey(stage.getEndTarget())) {
+ log("Stage " + entry.getKey() + " refer to an inexistant end target: " + stage.getEndTarget()
+ + ". Stage will be ignored", Project.MSG_ERR);
+ } else {
+ startStageName.put(stage.getStartTarget(), entry.getKey());
+ DiamondsStage diamondsStage = new DiamondsStage(stage);
+ stages.add(diamondsStage);
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ public void buildFinished(BuildEvent buildEvent) throws DiamondsException {
+ if (currentStage != null) {
+ currentStage.setEndTime(new Date());
+ completedStages.add(currentStage);
+ currentStage = null;
+ }
+ }
+
+ public void buildStarted(BuildEvent buildEvent) throws DiamondsException {
+ }
+
+ public synchronized void targetFinished(BuildEvent buildEvent) throws DiamondsException {
+ if (currentStage != null) {
+ if (buildEvent.getTarget().getName().equals(currentStage.getEndTarget())) {
+ getProject().log("Stage ending - " + currentStage.getStageName(), Project.MSG_DEBUG);
+ currentStage.setEndTime(new Date());
+ completedStages.add(currentStage);
+ try {
+ sendCompletedStage(currentStage);
+ } finally {
+ currentStage = null;
+ }
+ }
+ }
+ }
+
+ protected void sendCompletedStage(DiamondsStage stage) throws DiamondsException {
+ if (message != null) {
+ stage.setProperties(diamondsListener.getProject(), diamondsListener.getConfiguration().getTimeFormat());
+ diamondsListener.getSession().send(message);
+ }
+ }
+
+ public synchronized void targetStarted(BuildEvent buildEvent) throws DiamondsException {
+ if (currentStage == null) {
+ currentStage = geStageByStartTarget(buildEvent.getTarget().getName());
+ if (currentStage != null) {
+ getProject().log("Stage starting - " + currentStage.getStageName(), Project.MSG_DEBUG);
+ currentStage.setStartTime(new Date());
+ }
+ } else {
+ // In this case we have an overlap...
+ DiamondsStage newStage = geStageByStartTarget(buildEvent.getTarget().getName());
+ if (newStage != null) {
+ getProject().log("Stage " + currentStage.getStageName() + " and stage " + newStage.getStageName() + " are overlapping.", Project.MSG_WARN);
+ getProject().log("Stage ending - " + currentStage.getStageName(), Project.MSG_DEBUG);
+ currentStage.setEndTime(new Date());
+ newStage.setStartTime(new Date());
+ completedStages.add(currentStage);
+ try {
+ sendCompletedStage(currentStage);
+ } finally {
+ currentStage = newStage;
+ getProject().log("Stage starting - " + currentStage.getStageName(), Project.MSG_DEBUG);
+ }
+
+ }
+ }
+ }
+
+ private DiamondsStage geStageByStartTarget(String targetName) {
+ for (DiamondsStage stage : stages) {
+ if (targetName.equals(stage.getStartTarget())) {
+ return stage;
+ }
+ }
+ return null;
+ }
+
+
+ public void add(Message message) {
+ if (this.message != null) {
+ throw new BuildException(this.getDataTypeName() + " cannot accept more than one nested message at " + this.getLocation());
+ }
+ this.message = message;
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/ant/types/TargetDiamondsListener.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.helium.diamonds.ant.types;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+
+import com.nokia.helium.core.ant.Message;
+import com.nokia.helium.core.MessageCreationException;
+import com.nokia.helium.core.ant.types.TargetMessageTrigger;
+import com.nokia.helium.diamonds.DiamondsException;
+import com.nokia.helium.diamonds.DiamondsListener;
+import com.nokia.helium.diamonds.DiamondsSession;
+import com.nokia.helium.diamonds.ant.Listener;
+
+/**
+ * Listener sending data based on target configuration to diamonds.
+ */
+public class TargetDiamondsListener implements DiamondsListener {
+ private static final int READ_ARRAY_SIZE = 1000;
+
+ private Listener diamondsListener;
+ private Map<String, TargetMessageTrigger> targetTriggers = new HashMap<String, TargetMessageTrigger>();
+
+
+ public void configure(Listener diamondsListener) throws DiamondsException {
+ this.diamondsListener = diamondsListener;
+ for (Object entry : diamondsListener.getProject().getReferences().values()) {
+ if (entry instanceof TargetMessageTrigger) {
+ TargetMessageTrigger targetMessageTrigger = (TargetMessageTrigger)entry;
+ targetTriggers.put(targetMessageTrigger.getTargetName(), targetMessageTrigger);
+ }
+ }
+ }
+
+ public void buildFinished(BuildEvent buildEvent) throws DiamondsException {
+ }
+
+ public void buildStarted(BuildEvent buildEvent) throws DiamondsException {
+ }
+
+ public void targetFinished(BuildEvent buildEvent) throws DiamondsException {
+ String targetName = buildEvent.getTarget().getName();
+ if (testIfCondition(buildEvent.getTarget()) && testUnlessCondition(buildEvent.getTarget()) &&
+ targetTriggers.containsKey(buildEvent.getTarget().getName())) {
+ DiamondsSession session = diamondsListener.getSession();
+ if (session != null && session.isOpen()) {
+ for (Message message : targetTriggers.get(targetName).getMessageList()) {
+ buildEvent.getProject().log("Sending message to Diamonds:\n" + dumpMessage(message), Project.MSG_DEBUG);
+ session.send(message);
+ }
+ }
+ }
+ }
+
+ /**
+ * Check if the target should be skipped because of the if attribute.
+ * @param target the target instance to be tested.
+ * @return Returns true if the target should be executed, false otherwise.
+ */
+ private boolean testIfCondition(Target target) {
+ if (target.getIf() == null) {
+ return true;
+ }
+ String test = target.getProject().replaceProperties(target.getIf());
+ return target.getProject().getProperty(test) != null;
+ }
+
+ /**
+ * Check if the target should be skipped because of the unless attribute.
+ * @param target the target instance to be tested.
+ * @return Returns true if the target should be executed, false otherwise.
+ */
+ private boolean testUnlessCondition(Target target) {
+ if (target.getUnless() == null) {
+ return true;
+ }
+ String test = target.getProject().replaceProperties(target.getUnless());
+ return target.getProject().getProperty(test) == null;
+ }
+
+ /**
+ * Dump the content of a Message and return a String.
+ * @param message The message.
+ * @return String of contents.
+ * @throws DiamondsException If any IO errors.
+ */
+ private String dumpMessage(Message message) throws DiamondsException {
+ StringBuilder builder;
+ try {
+ InputStream in = message.getInputStream();
+ builder = new StringBuilder();
+ byte[] data = new byte[READ_ARRAY_SIZE];
+ int length = in.read(data);
+ while (length > 0) {
+ builder.append(new String(data, 0, length));
+ length = in.read(data);
+ }
+ }
+ catch (IOException e) {
+ throw new DiamondsException(e.toString());
+ } catch (MessageCreationException e) {
+ throw new DiamondsException(e.toString());
+ }
+ return builder.toString();
+ }
+
+ public void targetStarted(BuildEvent buildEvent) throws DiamondsException {
+ }
+}
+
+
--- a/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/helium.antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/src/com/nokia/helium/diamonds/helium.antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -25,11 +25,9 @@
Ant task definition declarations.
</description>
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
- <typedef name="diamondsExceptionStatusUpdate" classname="com.nokia.helium.diamonds.DiamondsExceptionStatusUpdate" uri="http://www.nokia.com/helium"/>
- <typedef name="diamondsPostBuildStatusUpdate" classname="com.nokia.helium.diamonds.DiamondsPostBuildStatusUpdate" uri="http://www.nokia.com/helium"/>
+ <typedef name="diamondsStatusUpdate" classname="com.nokia.helium.diamonds.DiamondsStatusUpdate" uri="http://www.nokia.com/helium"/>
<hlm:deflist id="helium-diamonds.list">
- <hlm:listenerdef classname="com.nokia.helium.diamonds.ant.HeliumListener"/>
- <hlm:diamondsExceptionStatusUpdate/>
- <hlm:diamondsPostBuildStatusUpdate/>
+ <hlm:listenerdef classname="com.nokia.helium.diamonds.ant.Listener" preappend="true" />
+ <hlm:diamondsStatusUpdate/>
</hlm:deflist>
</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/tests/antunit/run-scenario.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/tests/antunit/run-scenario.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -25,12 +25,11 @@
<property environment="env" />
<target name="setUp">
- <tempfile property="temp.dir" suffix=".dir" />
- <mkdir dir="${temp.dir}" />
+ <mkdir dir="${test.temp.dir}" />
</target>
<target name="tearDown">
- <delete dir="${temp.dir}" />
+ <delete dir="${test.temp.dir}" />
</target>
<macrodef name="runScenario">
@@ -43,13 +42,13 @@
<arg line="/c ..\build.bat" />
<arg line="@{target}" />
<arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
- <arg value="-Dtemp.dir=${temp.dir}" />
+ <arg value="-Dtemp.dir=${test.temp.dir}" />
</exec>
<exec osfamily="unix" executable="../bld.sh" dir="${ant.file.run-scenario}/../../scenarii/@{scenario}" failonerror="@{failonerror}">
<env key="ANT_ARGS" value="${env.ANT_ARGS}" />
<arg line="@{target}" />
<arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
- <arg value="-Dtemp.dir=${temp.dir}" />
+ <arg value="-Dtemp.dir=${test.temp.dir}" />
</exec>
</sequential>
</macrodef>
--- a/buildframework/helium/sf/java/diamonds/tests/antunit/test_diamonds.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/tests/antunit/test_diamonds.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -23,24 +23,102 @@
<project name="test-diamonds" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
<description>Helium Antlib diamonds unittests.</description>
-
+ <taskdef name="xpathtest" classname="se.jtech.ant.xpath.XPathEvaluatorTask" onerror="ignore"/>
+
<import file="run-scenario.ant.xml" />
<target name="test-build">
<runScenario scenario="build" target="unittest-diamonds" />
+ <au:assertLogContains text="Diamonds build id:" />
</target>
<target name="test-build-with-invalid-address">
<runScenario scenario="invalid-address" target="unittest-diamonds" />
- <au:assertLogContains text="Error occured while sending mail" />
+ <au:assertLogContains text="Error sending the message: invalid.server.local" />
+ <au:assertLogContains text="Diamonds reporting will be disabled." />
</target>
<target name="test-build-with-invalid-templates">
<runScenario scenario="invalid-templates" target="unittest-diamonds" />
+ <au:assertLogContains text="Error with invalid-ant-properties-input-file.ftl" />
+ <au:assertLogContains text="Diamonds build id:" />
</target>
<target name="test-build-with-invalid-templates-1">
- <runScenario scenario="invalid-templates-1" failonerror="false" target="unittest-diamonds" />
+ <runScenario scenario="invalid-templates-1" target="unittest-diamonds" />
+ <au:assertLogContains text="Diamonds build id:" />
+ </target>
+
+ <target name="test-build-without-config">
+ <runScenario scenario="build-without-config" target="unittest-diamonds" />
+ <au:assertLogContains text="Diamonds reporting is disabled, because the listener is not configured properly: required property: diamonds.host not defined" />
+ </target>
+
+ <target name="test-failing-build">
+ <au:expectfailure>
+ <runScenario scenario="failing-build" target="build" />
+ </au:expectfailure>
+ <au:assertLogContains text="BUILD FAILED" />
+ <au:assertLogContains text="diamonds:" />
+ <au:assertLogContains text="failing-target:" />
+ <property file="${test.temp.dir}/diamonds.ini" />
+ <get src="http://${diamonds.host}:${diamonds.port}${diamonds.build.id}?fmt=xml"
+ dest="${test.temp.dir}/diamonds_data.xml"
+ usetimestamp="true" />
+ <xpathtest xmlfile="${test.temp.dir}/diamonds_data.xml">
+ <namespace uri="" prefix=""/>
+ <xpath expression="/diamonds-build/build[status='failed']"/>
+ </xpathtest>
+ <xpathtest xmlfile="${test.temp.dir}/diamonds_data.xml">
+ <namespace uri="" prefix=""/>
+ <xpath expression="/diamonds-build/build/finished"/>
+ </xpathtest>
+ </target>
+
+ <target name="test-signal-build">
+ <au:expectfailure>
+ <runScenario scenario="signal-build" target="build" />
+ </au:expectfailure>
+ <au:assertLogContains text="BUILD FAILED" />
+ <au:assertLogContains text="diamonds:" />
+ <au:assertLogContains text="failing-target:" />
+ <property file="${test.temp.dir}/diamonds.ini" />
+ <get src="http://${diamonds.host}:${diamonds.port}${diamonds.build.id}?fmt=xml"
+ dest="${test.temp.dir}/diamonds_data.xml"
+ usetimestamp="true" />
+ <xpathtest xmlfile="${test.temp.dir}/diamonds_data.xml">
+ <namespace uri="" prefix=""/>
+ <xpath expression="/diamonds-build/build[status='failed']"/>
+ </xpathtest>
+ <xpathtest xmlfile="${test.temp.dir}/diamonds_data.xml">
+ <namespace uri="" prefix=""/>
+ <xpath expression="/diamonds-build/build/finished"/>
+ </xpathtest>
+ <xpathtest xmlfile="${test.temp.dir}/diamonds_data.xml">
+ <namespace uri="" prefix=""/>
+ <xpath expression="/diamonds-build/signals/signal[position()=1 and name='testDeferredSignalInput']"/>
+ </xpathtest>
+ <xpathtest xmlfile="${test.temp.dir}/diamonds_data.xml">
+ <namespace uri="" prefix=""/>
+ <xpath expression="/diamonds-build/signals/signal[position()=2 and name='testNowSignalInput']"/>
+ </xpathtest>
+ </target>
+
+ <target name="test-target-recording">
+ <runScenario scenario="target-recording" target="build" />
+ <au:assertLogContains text="BUILD SUCCESSFUL" />
+ <au:assertLogContains text="diamonds:" />
+ <property file="${test.temp.dir}/diamonds.ini" />
+ <get src="http://${diamonds.host}:${diamonds.port}${diamonds.build.id}?fmt=xml"
+ dest="${test.temp.dir}/diamonds_data.xml"
+ usetimestamp="true" />
+ <xpathtest xmlfile="${test.temp.dir}/diamonds_data.xml">
+ <namespace uri="" prefix=""/>
+ <xpath expression="/diamonds-build/targets/target[name='target-recording']"/>
+ <xpath expression="/diamonds-build/targets/target[name='sub-target2']"/>
+ <xpath expression="/diamonds-build/targets/target[name='sub-target3']"/>
+ <xpath expression="/diamonds-build/targets[count(target)=3]"/>
+ </xpathtest>
</target>
</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/tests/config/diamonds_config_default.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/tests/config/diamonds_config_default.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -29,29 +29,17 @@
<property name="diamonds.tstamp.format" value="yyyy-MM-dd'T'HH:mm:ss" />
<property name="diamonds.category" value="${build.family}" />
- <hlm:stage id="test-echo-operation"
- startTarget="test-echo-operation" endTarget="test-echo-operation" />
- <hlm:stage id="test-echo-operation1"
- startTarget="test-echo-operation1" endTarget="test-echo-operation1" />
- <hlm:stage id="test-echo-operation2"
- startTarget="test-echo-operation2" endTarget="test-echo-operation2" />
- <hlm:stage id="test-echo-operation3"
- startTarget="test-echo-operation3" endTarget="test-echo-operation3" />
- <hlm:stage id="test-echo-operation4"
- startTarget="test-echo-operation4" endTarget="test-echo-operation4" />
- <hlm:stage id="test-echo-operation5"
- startTarget="test-echo-operation5" endTarget="test-echo-operation5" />
+ <!-- those stages should be ignored -->
+ <hlm:stage id="inexistant-start-target"
+ startTarget="inexistant-start-target" endTarget="diamonds" />
+ <hlm:stage id="inexistant-end-target"
+ startTarget="diamonds" endTarget="inexistant-end-target" />
-<!--
- <stage name="build" start="compile-target" end="compile-target"
- logfile="${ant['compile.log.input']}"/>
- -->
- <hlm:stage id="stage-sequence-1" startTarget="test-buildid-set" endTarget="test-version"
- />
- <hlm:stage id="stage-sequence-2" startTarget="test-buildid-set" endTarget="test-defer-type"
- />
-
- <hlm:stage id="invalid-template-sequence" startTarget="test-buildid-set" endTarget="test-invalid-template-file"/>
+ <!-- stage 2 should be ignored. -->
+ <hlm:stage id="stage-sequence-1" startTarget="test-buildid-set" endTarget="test-version" />
+ <hlm:stage id="stage-sequence-2" startTarget="test-buildid-set" endTarget="test-defer-type" />
+ <hlm:stage id="stage-sequence-3" startTarget="test-defer-type" endTarget="test-version" />
+
<hlm:fmppMessage id="initial.message" sourceFile="${diamonds.template-dir}/diamonds_start.xml.ftl">
<data expandProperties="yes">
@@ -77,11 +65,6 @@
</data>
</hlm:fmppMessage>
- <hlm:fmppMessage id="stage.time.message" sourceFile="${diamonds.template-dir}/diamonds_stage.xml.ftl">
- <data expandProperties="yes">
- ant: antProperties()
- </data>
- </hlm:fmppMessage>
<hlm:targetMessageTrigger id="codescanner.id" target="codescanner">
@@ -115,5 +98,23 @@
</data>
</hlm:fmppMessage>
</hlm:targetMessageTrigger>
+
+ <hlm:targetMessageTrigger id="skipped-target.id" target="skipped-target">
+ <hlm:fmppMessage sourceFile="${diamonds.template-dir}${file.separator}skipped-target.xml.ftl">
+ <data expandProperties="yes">
+ ant: antProperties()
+ </data>
+ </hlm:fmppMessage>
+ </hlm:targetMessageTrigger>
+
+ <hlm:targetTimingMessageListener id="target.timing.message.listener" minTime="1500" />
+ <hlm:targetMessageListener id="target.message.listener" />
+ <hlm:stageMessageListener id="stage.message.listener">
+ <hlm:fmppMessage sourceFile="${diamonds.template-dir}/diamonds_stage.xml.ftl">
+ <data expandProperties="yes">
+ ant: antProperties()
+ </data>
+ </hlm:fmppMessage>
+ </hlm:stageMessageListener>
</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/tests/data/templates/diamonds_signal.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/tests/data/templates/diamonds_signal.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : finish.xml.ftl
+Name : diamonds_signal.xml.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -21,21 +21,14 @@
-->
<#include "header.ftl">
<signals>
- <#assign diamondsignalname = ""/>
- <#assign diamondkeys = ant?keys>
- <#list diamondkeys as diamondkey>
- <#if diamondkey?contains("diamond.signal.name")>
- <#list diamondkey?split(".") as index>
- <#assign signalIndex = index/>
- </#list>
+ <#list ant?keys as diamondskey>
+ <#if diamondskey?starts_with("diamond.signal.name.")>
+ <#assign signalIndex = diamondskey?split(".")?last />
<signal>
- <#list diamondkeys as diamondkey>
- <#if diamondkey?contains("${signalIndex}")>
- <#if ant?contains("diamond.signal.name.${signalIndex}")><name>${ant["diamond.signal.name.${signalIndex}"]}</name></#if>
- <#if ant?contains("diamond.error.message.${signalIndex}")><message>${ant["diamond.error.message.${signalIndex}"]}</message></#if>
- <#if ant?contains("diamond.time.stamp.${signalIndex}")><timestamp>${ant["diamond.time.stamp.${signalIndex}"]}</timestamp></#if>
- </#if>
- </#list>
+ <id>${signalIndex}</id>
+ <#if ant?keys?seq_contains("diamond.signal.name.${signalIndex}")><name>${ant["diamond.signal.name.${signalIndex}"]?xml}</name></#if>
+ <#if ant?keys?seq_contains("diamond.error.message.${signalIndex}")><message>${ant["diamond.error.message.${signalIndex}"]?xml}</message></#if>
+ <#if ant?keys?seq_contains("diamond.time.stamp.${signalIndex}")><timestamp>${ant["diamond.time.stamp.${signalIndex}"]?xml}</timestamp></#if>
</signal>
</#if>
</#list>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/tests/data/templates/skipped-target.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+<#--
+============================================================================
+Name : skipped-target.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#include "header.ftl">
+ <tools>
+ <tool>
+ <name>invalid_target</name>
+ <version>0.0</version>
+ </tool>
+ </tools>
+<#include "footer.ftl">
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/tests/scenarii/build-without-config/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,167 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name : test_diamonds.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-diamonds" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium Antlib diamonds unittests.</description>
+ <property environment="env" />
+ <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef resource="com/nokia/helium/diamonds/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef name="xpathtest" classname="se.jtech.ant.xpath.XPathEvaluatorTask" onerror="ignore"/>
+ <property name="diamonds.enabled" value="true" />
+ <property name="diamonds.unitest.dir" location="${ant.file.test-diamonds}/../../../" />
+ <property name="diamonds.output.dir" location="${temp.dir}" />
+ <property name="diamonds.template.dir" location="${diamonds.unitest.dir}/data/templates" />
+ <property name="build.family" value="test_new_hlm"/>
+ <property name="id" value="123"/>
+ <property name="name" value="${build.family}_${id}"/>
+ <property name="build.system" value="ec-helium"/>
+ <property name="compile.log.input" location="${diamonds.unitest.dir}/data/compile.log.xml" />
+ <property name="codescanner.log.input" location="${diamonds.unitest.dir}/data/problemIndex.xml" />
+ <property name="policy.log.input" location="${diamonds.unitest.dir}/data/policy.log.xml" />
+ <property name="invalid.target.input.file" location="${diamonds.unitest.dir}/data/invalid.target.input.log.xml" />
+ <property name="symsee.version" value="9.1.0" />
+
+ <import file="${diamonds.unitest.dir}/config/diamonds_config_default.ant.xml" />
+
+
+ <target name="unittest" depends="unittest-diamonds" />
+
+ <target name="unittest-diamonds" depends="test-all" />
+
+ <dirname property="project.dir" file="${ant.file.test-diamonds}" />
+ <target name="version">
+ <echo message="version target for diamonds to verify sending data to diamonds" />
+ </target>
+
+ <target name="diamonds" />
+
+ <target name="compile-target">
+ <echo message="verify the build stage with input source xml file" />
+ </target>
+
+ <target name="codescanner">
+ <echo message="target verification with input source xml file" />
+ </target>
+
+ <target name="create-bom-log">
+ <echo message="target without input file and just to send the data" />
+ </target>
+
+
+ <target name="defer-type">
+ <echo message="version target for diamonds to verify sending data to diamonds" />
+ </target>
+
+ <target name="test-defer-type">
+ <antcall target="defer-type" />
+ </target>
+
+ <target name="test-create-bom-log">
+ <antcall target="create-bom-log" />
+ </target>
+
+ <target name="test-codescanner">
+ <antcall target="codescanner" />
+ </target>
+
+
+
+
+ <target name="test-compile-target">
+ <antcall target="compile-target" />
+ </target>
+
+ <target name="test-version">
+ <antcall target="version" />
+ </target>
+
+ <target name="test-buildid-set">
+ </target>
+
+ <target name="test-buildid-notset">
+ </target>
+
+ <target name="test-echo-operation">
+ <echo message="echo operation: test" />
+ </target>
+
+ <target name="test-echo-operation1">
+ <echo message="echo operation1: test" />
+ </target>
+
+ <target name="test-echo-operation2">
+ <echo message="echo operation2: test" />
+ </target>
+
+ <target name="test-echo-operation3">
+ <echo message="echo operation3: test" />
+ </target>
+
+ <target name="test-echo-operation4">
+ <echo message="echo operation4: test" />
+ </target>
+
+ <target name="test-echo-operation5">
+ <echo message="echo operation5: test" />
+ </target>
+
+ <target name="test-depend-target" depends="test-echo-operation" />
+
+ <target name="test-ant-call">
+ <echo message="test-ant-call" />
+ <delete file="${diamonds.output.dir}/diamonds_stage.xml" failonerror="false" />
+ <antcall target="test-echo-operation1" />
+ </target>
+
+ <target name="test-ant-call-multiple">
+ <echo message="test-ant-call" />
+ <delete file="${diamonds.output.dir}/diamonds_stage.xml" failonerror="false" />
+ <antcall target="test-echo-operation2" />
+ <antcall target="test-echo-operation3" />
+ </target>
+
+ <target name="test-ant-call-multiple-parallel">
+ <echo message="test-ant-call" />
+ <delete file="${diamonds.output.dir}/diamonds_stage.xml" failonerror="false" />
+ <parallel>
+ <antcall target="test-echo-operation4" />
+ <antcall target="test-echo-operation5" />
+ </parallel>
+ </target>
+
+ <target name="sequence-config-test-target-1">
+ </target>
+
+ <target name="sequence-config-test-target-2">
+ </target>
+
+ <target name="test-verify-targets">
+ </target>
+
+ <target name="test-verify-stages">
+ </target>
+
+ <target name="test-all" depends="test-buildid-notset, diamonds, test-buildid-set, test-defer-type, test-version,
+ test-create-bom-log,test-codescanner,test-compile-target, test-depend-target,
+ test-ant-call, test-ant-call-multiple, test-ant-call-multiple-parallel,
+ sequence-config-test-target-1,sequence-config-test-target-2, test-verify-stages, test-verify-targets" />
+</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/tests/scenarii/build/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/tests/scenarii/build/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -24,6 +24,7 @@
<description>Helium Antlib diamonds unittests.</description>
<property environment="env" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef resource="com/nokia/helium/diamonds/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
<taskdef name="xpathtest" classname="se.jtech.ant.xpath.XPathEvaluatorTask" onerror="ignore"/>
<property name="diamonds.enabled" value="true" />
<property name="diamonds.unitest.dir" location="${ant.file.test-diamonds}/../../../" />
@@ -31,7 +32,7 @@
<import file="../../config/diamonds_config_default.ant.xml" />
<property name="diamonds.output.dir" location="${temp.dir}/output" />
<property name="diamonds.template.dir" location="${diamonds.unitest.dir}/data/templates" />
- <property name="build.family" value="test_new_hlm"/>
+ <property name="build.family" value="test_helium_diamonds_unitest_build"/>
<property name="id" value="123"/>
<property name="name" value="${build.family}_${id}"/>
<property name="build.system" value="ec-helium"/>
@@ -88,9 +89,6 @@
<antcall target="codescanner" />
</target>
-
-
-
<target name="test-compile-target">
<antcall target="compile-target" />
</target>
@@ -112,7 +110,7 @@
usetimestamp="true" />
<xpathtest xmlfile="${temp.dir}/test-buildid-set_output.xml">
<namespace uri="" prefix=""/>
- <xpath expression="/diamonds-build[schema='23']"/>
+ <xpath expression="/diamonds-build/schema"/>
</xpathtest>
</target>
@@ -179,6 +177,8 @@
<target name="sequence-config-test-target-2">
</target>
+ <target name="skipped-target" if="property.not.defined.so.target.is.skipped" />
+
<target name="test-verify-targets">
<get src="http://${diamonds.host}:${diamonds.port}${diamonds.build.id}?fmt=xml"
dest="${temp.dir}/test-verify-targets.xml"
@@ -186,8 +186,14 @@
<xpathtest xmlfile="${temp.dir}/test-verify-targets.xml">
<namespace uri="" prefix=""/>
<xpath expression="/diamonds-build/tools/tool[name='SymSEE']"/>
- </xpathtest>
- </target>
+ </xpathtest>
+ <au:expectfailure>
+ <xpathtest xmlfile="${temp.dir}/test-verify-targets.xml">
+ <namespace uri="" prefix=""/>
+ <xpath expression="/diamonds-build/tools/tool[name='invalid_target']"/>
+ </xpathtest>
+ </au:expectfailure>
+ </target>
<target name="test-verify-stages">
<get src="http://${diamonds.host}:${diamonds.port}${diamonds.build.id}?fmt=xml"
@@ -195,19 +201,13 @@
usetimestamp="true" />
<xpathtest xmlfile="${temp.dir}/test-verify-stages.xml">
<namespace uri="" prefix=""/>
- <xpath expression="/diamonds-build/stages/stage[name='test-echo-operation']"/>
- <xpath expression="/diamonds-build/stages/stage[name='test-echo-operation1']"/>
- <xpath expression="/diamonds-build/stages/stage[name='test-echo-operation2']"/>
- <xpath expression="/diamonds-build/stages/stage[name='test-echo-operation3']"/>
- <xpath expression="/diamonds-build/stages/stage[name='test-echo-operation4']"/>
- <xpath expression="/diamonds-build/stages/stage[name='test-echo-operation5']"/>
- <xpath expression="/diamonds-build/stages/stage[name='stage-sequence-1']"/>
<xpath expression="/diamonds-build/stages/stage[name='stage-sequence-2']"/>
+ <xpath expression="/diamonds-build/stages/stage[name='stage-sequence-3']"/>
</xpathtest>
</target>
<target name="test-all" depends="test-buildid-notset, diamonds, test-buildid-set, test-defer-type, test-version,
- test-create-bom-log,test-codescanner,test-compile-target, test-depend-target,
+ test-create-bom-log,test-codescanner,test-compile-target, test-depend-target, skipped-target,
test-ant-call, test-ant-call-multiple, test-ant-call-multiple-parallel,
sequence-config-test-target-1,sequence-config-test-target-2, test-verify-stages, test-verify-targets" />
</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/tests/scenarii/failing-build/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,60 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name : test_diamonds.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-diamonds" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium Antlib diamonds unittests.</description>
+ <property environment="env" />
+ <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef resource="com/nokia/helium/diamonds/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+
+ <property name="diamonds.enabled" value="true" />
+ <property name="diamonds.unitest.dir" location="${ant.file.test-diamonds}/../../../" />
+ <import file="../../../../../../nokia/companyproperties.ant.xml" optional="true"/>
+ <import file="../../config/diamonds_config_default.ant.xml" />
+ <property name="diamonds.output.dir" location="${temp.dir}/output" />
+ <property name="diamonds.template.dir" location="${diamonds.unitest.dir}/data/templates" />
+ <property name="build.family" value="test_helium_diamonds_unitest_failing_build"/>
+ <property name="id" value="123"/>
+ <property name="name" value="${build.family}_${id}"/>
+ <property name="build.system" value="ec-helium"/>
+ <import file="${diamonds.unitest.dir}/config/diamonds_config_default.ant.xml" />
+
+
+ <target name="build" depends="diamonds,backup-diamonds-id,failing-target" />
+
+ <target name="diamonds" />
+
+ <target name="backup-diamonds-id">
+ <echoproperties destfile="${temp.dir}/diamonds.ini">
+ <propertyset>
+ <propertyref prefix="diamonds.host"/>
+ <propertyref prefix="diamonds.port"/>
+ <propertyref prefix="diamonds.build.id"/>
+ </propertyset>
+ </echoproperties>
+ </target>
+
+ <target name="failing-target">
+ <fail message="some error in the build." />
+ </target>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/diamonds/tests/scenarii/invalid-address/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/tests/scenarii/invalid-address/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -24,6 +24,7 @@
<description>Helium Antlib diamonds unittests.</description>
<property environment="env" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef resource="com/nokia/helium/diamonds/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
<property name="diamonds.enabled" value="true" />
<property name="diamonds.host" value="invalid.server.local" />
<property name="diamonds.port" value="80" />
--- a/buildframework/helium/sf/java/diamonds/tests/scenarii/invalid-templates-1/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/tests/scenarii/invalid-templates-1/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -24,6 +24,7 @@
<description>Helium Antlib diamonds unittests.</description>
<property environment="env" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef resource="com/nokia/helium/diamonds/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
<property name="diamonds.enabled" value="true" />
<property name="diamonds.unitest.dir" location="${ant.file.test-diamonds-invalid-template}/../../../" />
<import file="../../../../../../nokia/companyproperties.ant.xml" optional="true"/>
--- a/buildframework/helium/sf/java/diamonds/tests/scenarii/invalid-templates/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/diamonds/tests/scenarii/invalid-templates/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -24,6 +24,7 @@
<description>Helium Antlib diamonds unittests.</description>
<property environment="env" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef resource="com/nokia/helium/diamonds/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
<taskdef name="xpathtest" classname="se.jtech.ant.xpath.XPathEvaluatorTask" onerror="ignore"/>
<property name="diamonds.enabled" value="true" />
<property name="diamonds.unitest.dir" location="${ant.file.test-diamonds-invalid-template}/../../../" />
@@ -121,10 +122,12 @@
<get src="http://${diamonds.host}:${diamonds.port}${diamonds.build.id}?fmt=xml"
dest="${temp.dir}/test-verify-stages.xml"
usetimestamp="true" />
- <xpathtest xmlfile="${temp.dir}/test-verify-stages.xml">
- <namespace uri="" prefix=""/>
- <xpath expression="/diamonds-build/stages/stage[name='invalid-template-sequence']"/>
- </xpathtest>
+ <au:expectfailure>
+ <xpathtest xmlfile="${temp.dir}/test-verify-stages.xml">
+ <namespace uri="" prefix=""/>
+ <xpath expression="/diamonds-build/stages/stage"/>
+ </xpathtest>
+ </au:expectfailure>
</target>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/tests/scenarii/signal-build/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name : test_diamonds.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-diamonds" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium Antlib diamonds unittests.</description>
+ <property environment="env" />
+ <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+ <taskdef resource="com/nokia/helium/diamonds/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+
+ <property name="diamonds.enabled" value="true" />
+ <property name="diamonds.unitest.dir" location="${ant.file.test-diamonds}/../../../" />
+ <import file="../../../../../../nokia/companyproperties.ant.xml" optional="true"/>
+ <import file="../../config/diamonds_config_default.ant.xml" />
+ <property name="diamonds.output.dir" location="${temp.dir}/output" />
+ <property name="diamonds.template.dir" location="${diamonds.unitest.dir}/data/templates" />
+ <property name="build.family" value="test_helium_diamonds_unitest_signal_build"/>
+ <property name="id" value="123"/>
+ <property name="name" value="${build.family}_${id}"/>
+ <property name="build.system" value="ec-helium"/>
+ <import file="${diamonds.unitest.dir}/config/diamonds_config_default.ant.xml" />
+
+ <!-- Deferred signal -->
+ <hlm:notifierList id="testDeferredSignalNotifiers">
+ <hlm:executeTaskNotifier>
+ <echo>Signal: ${signal.name}</echo>
+ </hlm:executeTaskNotifier>
+ </hlm:notifierList>
+
+ <hlm:signalInput id="testDeferredSignalInput" failBuild="defer">
+ <hlm:notifierListRef refid="testDeferredSignalNotifiers" />
+ </hlm:signalInput>
+
+ <hlm:signalInput id="testNowSignalInput" failBuild="now">
+ <hlm:notifierListRef refid="testDeferredSignalNotifiers" />
+ </hlm:signalInput>
+
+
+ <target name="build" depends="diamonds,backup-diamonds-id,defer-failing-target,failing-target" />
+
+ <target name="diamonds" />
+
+ <target name="backup-diamonds-id">
+ <echoproperties destfile="${temp.dir}/diamonds.ini">
+ <propertyset>
+ <propertyref prefix="diamonds.host"/>
+ <propertyref prefix="diamonds.port"/>
+ <propertyref prefix="diamonds.build.id"/>
+ </propertyset>
+ </echoproperties>
+ </target>
+
+ <target name="defer-failing-target">
+ <echo message="Executing defer-failing-target." />
+ <hlm:signal name="testDeferredSignalInput" result="1" message="Failure under defer-failing-target." />
+ </target>
+
+ <target name="failing-target">
+ <echo message="Executing failing-target." />
+ <hlm:signal name="testNowSignalInput" result="1" message="Failure under failing-target." />
+ </target>
+
+</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/diamonds/tests/scenarii/target-recording/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,76 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name : test_diamonds.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-diamonds" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium Antlib diamonds unittests.</description>
+ <property environment="env" />
+ <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef resource="com/nokia/helium/diamonds/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+
+ <property name="diamonds.enabled" value="true" />
+ <property name="diamonds.unitest.dir" location="${ant.file.test-diamonds}/../../../" />
+ <import file="../../../../../../nokia/companyproperties.ant.xml" optional="true"/>
+ <import file="../../config/diamonds_config_default.ant.xml" />
+ <property name="diamonds.output.dir" location="${temp.dir}/output" />
+ <property name="diamonds.template.dir" location="${diamonds.unitest.dir}/data/templates" />
+ <property name="build.family" value="test_helium_diamonds_unitest_target_recording_build"/>
+ <property name="id" value="123"/>
+ <property name="name" value="${build.family}_${id}"/>
+ <property name="build.system" value="ec-helium"/>
+ <import file="${diamonds.unitest.dir}/config/diamonds_config_default.ant.xml" />
+
+
+ <target name="build" depends="diamonds,backup-diamonds-id,target-recording" />
+
+ <target name="diamonds" />
+
+ <target name="backup-diamonds-id">
+ <echoproperties destfile="${temp.dir}/diamonds.ini">
+ <propertyset>
+ <propertyref prefix="diamonds.host"/>
+ <propertyref prefix="diamonds.port"/>
+ <propertyref prefix="diamonds.build.id"/>
+ </propertyset>
+ </echoproperties>
+ </target>
+
+ <target name="target-recording">
+ <parallel>
+ <antcall target="sub-target1" />
+ <antcall target="sub-target2" />
+ <antcall target="sub-target3" />
+ </parallel>
+ </target>
+
+ <target name="sub-target1">
+ <sleep seconds="1"/>
+ </target>
+
+ <target name="sub-target2">
+ <sleep seconds="2"/>
+ </target>
+
+ <target name="sub-target3">
+ <sleep seconds="2"/>
+ </target>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/environment/src/com/nokia/helium/environment/Environment.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/environment/src/com/nokia/helium/environment/Environment.java Mon Oct 18 10:23:52 2010 +0100
@@ -44,7 +44,6 @@
*/
public class Environment {
private static final String[] WINDOWS_EXE_EXTENSIONS = { ".exe", ".bat", ".cmd" };
- private static final String STDERR_OUTPUT = "stderr";
private static final String[] DEFAULT_EXECUTABLES = { "java", "ant" };
private Project project;
@@ -79,7 +78,6 @@
* Adds default executables to the list that must have been run because Ant is running.
*/
private void addDefaultExecutables() {
-
for (int i = 0; i < DEFAULT_EXECUTABLES.length; i++) {
Executable exe = new Executable(DEFAULT_EXECUTABLES[i]);
exe.setExecuted(true);
@@ -188,6 +186,7 @@
if (executableFiles != null && executableFiles.length > 0) {
executableFile = executableFiles[0];
exec.setPath(executableFile.getCanonicalPath());
+ break;
}
}
}
@@ -226,46 +225,94 @@
return pathDirs;
}
- private boolean findVersion(Executable exec) throws IOException {
- // Get the executable additional data for this execution
- ExecutableInfo def = defs.get(exec.getNameNoExt());
- if (def != null && def.getVersionArgs() != null) {
- String path = exec.getPath();
- if (path == null) {
- path = "";
- }
- String[] versionArgs = def.getVersionArgs().split(" ");
- String[] commands = new String[versionArgs.length + 1];
- commands[0] = path;
- for (int i = 0; i < versionArgs.length; i++) {
- commands[i + 1] = versionArgs[i].trim();
- }
- Process commandProcess = Runtime.getRuntime().exec(commands);
+ private class ExecutableVersionReader implements Runnable {
+ private static final int VERSION_TEXT_READ_TIMEOUT = 5000;
+ private static final int CHAR_ARRAY_SIZE = 1000;
+
+ private String[] commands;
+ private InputStream in;
+ private StringBuilder text = new StringBuilder();
+ private char[] chars = new char[CHAR_ARRAY_SIZE];
+ private IOException exception;
- String output = def.getOutput();
- StringBuilder text = new StringBuilder();
- int dataRead = 0;
- char[] chars = new char[1000];
- if (output == null || !output.equals(STDERR_OUTPUT)) {
- InputStream in = commandProcess.getInputStream();
+ ExecutableVersionReader(String[] commands) {
+ this.commands = commands;
+ }
+
+ public void run() {
+ try {
+ int dataRead = 0;
InputStreamReader textIn = new InputStreamReader(in);
while (dataRead != -1) {
+
dataRead = textIn.read(chars, 0, chars.length);
+
if (dataRead != -1) {
text.append(chars, 0, dataRead);
}
}
}
- InputStream err = commandProcess.getErrorStream();
- InputStreamReader textErr = new InputStreamReader(err);
- dataRead = 0;
- while (dataRead != -1) {
- dataRead = textErr.read(chars, 0, chars.length);
- if (dataRead != -1) {
- text.append(chars, 0, dataRead);
+ catch (IOException e) {
+ exception = e;
+ }
+ synchronized (this) {
+ notify();
+ }
+ }
+
+ /**
+ * Read output data from both stdout and stderr streams.
+ *
+ * @return Text data.
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ public String readData() throws IOException {
+ try {
+ Process commandProcess = Runtime.getRuntime().exec(commands);
+ // Try to read from stdout
+ in = commandProcess.getInputStream();
+ new Thread(this).start();
+ synchronized (this) {
+ wait(VERSION_TEXT_READ_TIMEOUT);
+ }
+
+ // If no data available after timeout, try reading from stderr
+ if (text.length() == 0) {
+ in = commandProcess.getErrorStream();
+ new Thread(this).start();
+ synchronized (this) {
+ wait(VERSION_TEXT_READ_TIMEOUT);
+ }
}
}
- String versionText = text.toString();
+ catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ if (exception != null) {
+ throw exception;
+ }
+ return text.toString();
+ }
+ }
+
+ private boolean findVersion(Executable exec) throws IOException {
+ // Get the executable additional data for this execution
+ ExecutableInfo def = defs.get(exec.getNameNoExt());
+ if (def != null && def.getVersionArgs() != null) {
+ String exePath = exec.getPath();
+ if (exePath == null) {
+ exePath = "";
+ }
+ String[] versionArgs = def.getVersionArgs().split(" ");
+ String[] commands = new String[versionArgs.length + 1];
+ commands[0] = exePath;
+ for (int i = 0; i < versionArgs.length; i++) {
+ commands[i + 1] = versionArgs[i].trim();
+ }
+
+ ExecutableVersionReader reader = new ExecutableVersionReader(commands);
+ String versionText = reader.readData();
if (def.getVersionRegex() != null) {
Pattern versionPattern = Pattern.compile(def.getVersionRegex());
Matcher versionMatch = versionPattern.matcher(versionText);
@@ -291,7 +338,7 @@
exec.setLastModified(file.lastModified());
exec.setLength(file.length());
}
-
+
/**
* Calculate a hash value for the executable file.
*
--- a/buildframework/helium/sf/java/environment/src/com/nokia/helium/environment/ant/listener/ExecListener.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/environment/src/com/nokia/helium/environment/ant/listener/ExecListener.java Mon Oct 18 10:23:52 2010 +0100
@@ -31,6 +31,7 @@
import org.apache.tools.ant.RuntimeConfigurable;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.UnknownElement;
+import org.apache.tools.ant.taskdefs.condition.Os;
/**
* Checks for uses of the <exec> task and logs them to a CSV file.
@@ -102,6 +103,10 @@
Project project = event.getProject();
executable = project.replaceProperties(executable);
logger.debug("ExecListener: executable is run: " + executable);
+ String osFamily = (String) map.get("osfamily");
+ if (osFamily != null && !Os.isOs(osFamily, null, null, null)) {
+ return;
+ }
execCalls.add(executable);
}
}
--- a/buildframework/helium/sf/java/environment/src/com/nokia/helium/environment/ant/taskdefs/EnvironmentTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/environment/src/com/nokia/helium/environment/ant/taskdefs/EnvironmentTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -75,6 +75,7 @@
try {
if (outputFile != null) {
out = new FileOutputStream(outputFile);
+ project.log("Writing output to " + outputFile.toString(), Project.MSG_INFO);
}
List<ExecutableInfo> executableDefs = new ArrayList<ExecutableInfo>();
for (Iterator<EnvData> iterator = envDataList.iterator(); iterator.hasNext();) {
@@ -85,6 +86,7 @@
Environment environment = new Environment(project);
environment.setExecutableDefs(executableDefs);
environment.scan(ExecListener.getExecCalls());
+
EnvironmentXMLWriter writer = new EnvironmentXMLWriter(out);
writer.write(environment);
}
--- a/buildframework/helium/sf/java/environment/tests/antunit/listener/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/environment/tests/antunit/listener/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -46,6 +46,7 @@
<hlm:executable name="ant" versionArgs="-version" versionRegex="Apache Ant version (\S+)"/>
<hlm:executable name="perl" versionArgs="-v" versionRegex="This is perl, v(\S+)"/>
<hlm:executable name="python" versionArgs="--version" versionRegex="Python (\S+)"/>
+ <hlm:executable name="armcc" versionArgs="" versionRegex="RVCT(.+)"/>
</hlm:envdata>
</hlm:environment>
</target>
--- a/buildframework/helium/sf/java/environment/tests/antunit/test_listener.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/environment/tests/antunit/test_listener.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
============================================================================
-Name : test_signaltask.ant.xml
+Name : test_listener.ant.xml
Part of : Helium AntLib
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
--- a/buildframework/helium/sf/java/imaker/imaker.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/imaker/imaker.rst Mon Oct 18 10:23:52 2010 +0100
@@ -23,16 +23,16 @@
.. csv-table:: Attributes to modify
:header: "Attribute", "Description", "Values"
- ":hlm-p:`regionalVariation`", "Enable regional variation switching. - Deprecated (always false)", "false"
+ "``regionalVariation``", "Enable regional variation switching. - Deprecated (always false)", "false"
The imakerconfiguration supports three sub-types:
.. csv-table:: Attributes to modify
:header: "Sub-type", "Description"
- ":hlm-p:`makefileset`", "Defines the list of iMaker configuration to run image creation on."
- ":hlm-p:`targetset`", "List of regular expression used to match which target need to be executed."
- ":hlm-p:`variableset`", "List of variable to set when executing iMaker."
+ "``makefileset``", "Defines the list of iMaker configuration to run image creation on."
+ "``targetset``", "List of regular expression used to match which target need to be executed."
+ "``variableset``", "List of variable to set when executing iMaker."
Example of configuration:
--- a/buildframework/helium/sf/java/legacy/src/com/nokia/ant/BuildStatusDef.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,420 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.ant;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Target;
-import org.apache.tools.ant.types.DataType;
-import org.dom4j.Comment;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.Visitor;
-import org.dom4j.VisitorSupport;
-import org.dom4j.io.SAXReader;
-
-import com.nokia.helium.ant.data.PropertyCommentMeta;
-import com.nokia.helium.ant.data.PropertyMeta;
-import com.nokia.helium.core.ant.PostBuildAction;
-
-/**
- * Class to store the status of the signal of a particular target.
- */
-public class BuildStatusDef extends DataType implements PostBuildAction {
- private static final String DEPRECATED = "deprecated:";
- private HashSet<String> output = new HashSet<String>();
-
- @Override
- public void executeOnPostBuild(Project project, String[] targetNames) {
- // Run after targets execute so dynamic target names are resolved
- for (int i = 0; i < targetNames.length; i++) {
- String[] array = { targetNames[i] };
- Target target = findTarget(targetNames[i], getProject(), array);
- targetCallsHeliumTarget(target, getProject());
- }
- checkTargetsProperties(getProject());
- checkDeprecatedProperties(getProject());
-
- if (!output.isEmpty()) {
- log("*** Configuration report ***", Project.MSG_INFO);
- for (String outputStr : output) {
- log(outputStr, Project.MSG_INFO);
- }
- }
- }
-
- /**
- * @param desiredTarget
- * Target name to search
- * @param project
- * Object of the project
- * @param targetNames
- * Array of target names
- *
- */
- @SuppressWarnings("unchecked")
- public Target findTarget(String desiredTarget, Project project,
- String[] targetNames) {
- Hashtable<String, Target> targets;
- Vector<Target> sorted;
-
- // get all targets of the current project
- targets = project.getTargets();
-
- // sort all targets of the current project
- sorted = project.topoSort(targetNames[0], targets);
-
- // Find the desiredTarget Target object
- for (Target target : sorted) {
- if (target.getName().equals(desiredTarget)) {
- return target;
- }
- }
- throw new BuildException("Could not find target matching "
- + desiredTarget + "\n");
- }
-
- /**
- * If a target defined outside helium are calling a private Helium target
- * then print warning
- *
- */
- @SuppressWarnings("unchecked")
- public void targetCallsHeliumTarget(Target target, Project project) {
- String location = target.getLocation().getFileName();
-
- try {
- String heliumpath = new File(project.getProperty("helium.dir"))
- .getCanonicalPath();
- String targetpath = new File(location).getCanonicalPath();
-
- if (!targetpath.contains(heliumpath)) {
- ArrayList<String> antcallTargets = new ArrayList<String>();
- Visitor visitorTarget = new AntTargetVisitor(antcallTargets,
- project);
-
- Element element = findTargetElement(target, project);
- if (element != null) {
- element.accept(visitorTarget);
- }
- for (String depTargetString : antcallTargets) {
- String[] array = { depTargetString };
- try {
- Target depTarget = findTarget(depTargetString, project,
- array);
- targetCallsHeliumTarget(depTarget, project);
- } catch (BuildException x) {
- // We are Ignoring the errors as no need to fail the
- // build.
- log(
- "Exception occured while target defined outside helium are calling a private Helium target "
- + x.toString(), Project.MSG_DEBUG);
- x = null;
- }
- }
-
- for (Enumeration<String> depsEnum = target.getDependencies(); depsEnum
- .hasMoreElements();) {
- String depTargetString = depsEnum.nextElement();
- String[] array = { depTargetString };
- try {
- Target depTarget = findTarget(depTargetString, project,
- array);
- targetCallsHeliumTarget(depTarget, project);
- } catch (BuildException x) {
- // We are Ignoring the errors as no need to fail the
- // build.
- log(
- "Exception occured while target defined outside helium are calling a private Helium target "
- + x.toString(), Project.MSG_DEBUG);
- x = null;
- }
- }
- } else {
- checkIfTargetPrivate(target, project);
- }
-
- } catch (IOException e) {
- // We are Ignoring the errors as no need to fail the build.
- log(
- "IOException occured while target defined outside helium are calling a private Helium target "
- + e.getMessage(), Project.MSG_DEBUG);
- e.printStackTrace();
- }
- }
-
- private class AntTargetVisitor extends VisitorSupport {
- private List<String> targetList;
- private Project project;
-
- public AntTargetVisitor(List<String> targetList, Project project) {
- this.targetList = targetList;
- this.project = project;
- }
-
- public void visit(Element node) {
- String name = node.getName();
- if (name.equals("antcall") || name.equals("runtarget")) {
- String text = node.attributeValue("target");
- extractTarget(text);
- }
- }
-
- private void extractTarget(String text) {
- String iText = project.replaceProperties(text);
- targetList.add(iText);
- }
-
- }
-
- /**
- * Find the xml Element for the target
- *
- */
- @SuppressWarnings("unchecked")
- public Element findTargetElement(Target target, Project project) {
- SAXReader xmlReader = new SAXReader();
-
- Document antDoc = null;
-
- String location = target.getLocation().getFileName();
-
- try {
- File file = new File(location);
- antDoc = xmlReader.read(file);
- } catch (DocumentException e) {
- // We are Ignoring the errors as no need to fail the build.
- log("Not able read the XML file. " + e.getMessage(),
- Project.MSG_WARN);
- }
-
- String projectName = antDoc.valueOf("/project/@name");
- for (Iterator<Element> iterator = antDoc.selectNodes("//target")
- .iterator(); iterator.hasNext();) {
- Element element = iterator.next();
-
- String targetName = element.attributeValue("name");
- if (targetName.equals(target.getName())
- || (projectName + "." + targetName)
- .equals(target.getName())) {
- return element;
- }
- }
- return null;
- }
-
- /**
- * If target has comment that says it is private them print warning
- *
- */
- @SuppressWarnings("unchecked")
- public void checkIfTargetPrivate(Target target, Project project) {
- Element targetElement = findTargetElement(target, project);
- if (targetElement != null) {
- List<Node> children = targetElement
- .selectNodes("preceding-sibling::node()");
- if (children.size() > 0) {
- // Scan past the text nodes, which are most likely whitespace
- int index = children.size() - 1;
- Node child = children.get(index);
- while (index > 0 && child.getNodeType() == Node.TEXT_NODE) {
- index--;
- child = (Node) children.get(index);
- }
-
- // Check if there is a comment node
- String commentText = null;
- if (child.getNodeType() == Node.COMMENT_NODE) {
- Comment macroComment = (Comment) child;
- commentText = macroComment.getStringValue().trim();
- // log(macroName + " comment: " + commentText,
- // Project.MSG_DEBUG);
- }
-
- if (commentText != null) {
- if (commentText.contains("Private:")) {
- output
- .add("Warning: "
- + target.getName()
- + " is private and should only be called by helium");
- }
- if (commentText.contains("<deprecated>")) {
- output.add("Warning: " + target.getName() + "\n"
- + commentText);
- }
- }
- }
- }
- }
-
- /**
- * To check, is the private properties are overridden by customers.
- *
- * @param project
- */
- public void checkTargetsProperties(Project project) {
- try {
- String heliumpath = new File(project.getProperty("helium.dir"))
- .getCanonicalPath();
- com.nokia.helium.ant.data.Database db = new com.nokia.helium.ant.data.Database(
- project, "private");
- ArrayList<String> customerProps = getCustomerProperties(project);
-
- for (PropertyMeta propertyMeta : db.getProperties()) {
- if (propertyMeta.getType().equals("boolean"))
- {
- String value = project.getProperty(propertyMeta.getName());
- if (value != null && !value.equals("true") && !value.equals("false"))
- {
- output.add("Warning: " + propertyMeta.getName() + " property is boolean type and not set to true or false, value is " + value);
- }
- }
- }
- for (PropertyCommentMeta propertyMeta : db.getCommentProperties()) {
- if (propertyMeta.getType().equals("boolean"))
- {
- String value = project.getProperty(propertyMeta.getName());
- if (value != null && !value.equals("true") && !value.equals("false"))
- {
- output.add("Warning: " + propertyMeta.getName() + " property is boolean type and not set to true or false, value is " + value);
- }
- }
- }
- for (PropertyMeta propertyMeta : db.getProperties()) {
- if (propertyMeta.getLocation().contains(heliumpath)
- && propertyMeta.getScope().equals("private")
- && customerProps.contains(propertyMeta.getName())) {
- output.add("Warning: " + propertyMeta.getName()
- + " property has been overridden");
- }
- }
-
- for (PropertyCommentMeta propertyCommentMeta : db.getCommentProperties()) {
- if (propertyCommentMeta.getLocation().contains(heliumpath)
- && propertyCommentMeta.getScope().equals("private")
- && customerProps
- .contains(propertyCommentMeta.getName())) {
- output.add("Warning: " + propertyCommentMeta.getName()
- + " property has been overridden");
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * To display the warnings for deprecated properties.
- *
- * @param project
- */
- public void checkDeprecatedProperties(Project project) {
- try {
- String heliumpath = new File(project.getProperty("helium.dir"))
- .getCanonicalPath();
- com.nokia.helium.ant.data.Database db = new com.nokia.helium.ant.data.Database(
- project, "private");
- ArrayList<String> customerProps = getCustomerProperties(project);
-
- for (PropertyMeta propertyMeta : db.getProperties()) {
- if (propertyMeta.getLocation().contains(heliumpath)
- && (!propertyMeta.getDeprecated().equals(""))
- && customerProps.contains(propertyMeta.getName())) {
- output.add("Warning: "
- + propertyMeta.getName()
- + " property has been deprecated "
- + propertyMeta.getDeprecated()
- + "."
- + propertyMeta.getSummary().substring(
- propertyMeta.getSummary().lastIndexOf(
- DEPRECATED)
- + DEPRECATED.length()));
- }
- }
-
- for (PropertyCommentMeta propertyCommentMeta : db
- .getCommentProperties()) {
- if (propertyCommentMeta.getLocation().contains(heliumpath)
- && (!propertyCommentMeta.getDeprecated().equals(""))
- && customerProps
- .contains(propertyCommentMeta.getName())) {
- output.add("Warning: "
- + propertyCommentMeta.getName()
- + " property has been deprecated "
- + propertyCommentMeta.getDeprecated()
- + "."
- + propertyCommentMeta.getSummary().substring(
- propertyCommentMeta.getSummary()
- .lastIndexOf(DEPRECATED)
- + DEPRECATED.length()));
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- @SuppressWarnings("unchecked")
- public ArrayList<String> getCustomerProperties(Project project) {
- ArrayList<String> props = new ArrayList<String>();
- Database db = new Database(null, null, null);
- try {
- String heliumpath = new File(project.getProperty("helium.dir"))
- .getCanonicalPath();
-
- for (Object object : db.getAntFiles(project)) {
- String antFile = (String) object;
- antFile = new File(antFile).getCanonicalPath();
-
- if (!antFile.contains(heliumpath)) {
- SAXReader xmlReader = new SAXReader();
- Document antDoc = xmlReader.read(new File(antFile));
-
- List<Element> propertyNodes = antDoc
- .selectNodes("//property | //param");
- for (Element propertyNode : propertyNodes) {
- props.add(propertyNode.attributeValue("name"));
- }
- }
- }
- } catch (IOException e) {
- // We are Ignoring the errors as no need to fail the build.
- log("IOException: Not able read the Customer Properties "
- + e.getMessage(), Project.MSG_WARN);
- } catch (DocumentException e) {
- // We are Ignoring the errors as no need to fail the build.
- log("DocumentException: Not able read the Customer Properties "
- + e.getMessage(), Project.MSG_WARN);
- }
-
- return props;
- }
-
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/legacy/src/com/nokia/ant/Database.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,859 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.ant;
-
-import info.bliki.wiki.model.WikiModel;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Target;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.types.Reference;
-import org.apache.tools.ant.types.ResourceCollection;
-import org.apache.tools.ant.types.resources.FileResource;
-import org.dom4j.Attribute;
-import org.dom4j.CDATA;
-import org.dom4j.Comment;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.DocumentHelper;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.Text;
-import org.dom4j.Visitor;
-import org.dom4j.VisitorSupport;
-import org.dom4j.XPath;
-import org.dom4j.io.OutputFormat;
-import org.dom4j.io.SAXReader;
-import org.dom4j.io.XMLWriter;
-
-/**
- * Reads the current ant project and a fileset and generates a xml file with a summary of targets,
- * macros and properties.
- */
-public class Database {
- private Project project;
- private ResourceCollection rc;
- private Task task;
- private boolean debug;
- private boolean homeFilesOnly = true;
- private HashMap<String, List<String>> globalSignalList = new HashMap<String, List<String>>();
- private HashMap<String, String> map = new HashMap<String, String>();
- private Document signaldoc;
-
- public Database(Project project, ResourceCollection rc, Task task) {
- this.project = project;
- this.rc = rc;
- this.task = task;
- map.put("hlm", "http://www.nokia.com/helium");
- }
-
- public Project getProject() {
- return project;
- }
-
- public void setDebug(boolean debug) {
- this.debug = debug;
- }
-
- public void setHomeFilesOnly(boolean homeFilesOnly) {
- this.homeFilesOnly = homeFilesOnly;
- }
-
- public void log(String msg, int level) {
- if (task != null) {
- task.log(msg, level);
- }
- else if (debug) {
- project.log(msg, level);
- }
- }
-
- public void setRefid(Reference r) {
- Object object = r.getReferencedObject();
- if (!(object instanceof ResourceCollection)) {
- throw new BuildException(r.getRefId() + " doesn\'t denote a ResourceCollection");
- }
- rc = (ResourceCollection) object;
- }
-
- public Document createDOM() throws DocumentException, IOException {
- // log("Building Ant project database", Project.MSG_DEBUG);
- Element root = DocumentHelper.createElement("antDatabase");
- Document outDoc = DocumentHelper.createDocument(root);
- ArrayList<String> antFiles = getAntFiles(getProject(), homeFilesOnly);
- for (String antFile : antFiles) {
- readSignals(antFile);
- }
- for (String antFile : antFiles) {
- parseAntFile(root, antFile);
- }
-
- buildTaskDefs(root);
-
- return outDoc;
- }
-
- public void createXMLFile(File outputFile) {
- try {
- Document outDoc = createDOM();
- OutputStream outStream = System.out;
- if (outputFile != null) {
- outStream = new FileOutputStream(outputFile);
- }
- XMLWriter out = new XMLWriter(outStream, OutputFormat.createPrettyPrint());
- out.write(outDoc);
- }
- catch (DocumentException e) {
- throw new BuildException(e.getMessage());
- }
- catch (IOException e) {
- throw new BuildException(e.getMessage());
- }
- }
-
- @SuppressWarnings("unchecked")
- private void readSignals(String antFile) throws DocumentException, IOException {
- SAXReader xmlReader = new SAXReader();
- Document antDoc = xmlReader.read(new File(antFile));
-
- XPath xpath = DocumentHelper.createXPath("//hlm:signalListenerConfig");
- xpath.setNamespaceURIs(map);
- List<Element> signalNodes = xpath.selectNodes(antDoc);
- for (Element propertyNode : signalNodes) {
- signaldoc = antDoc;
- String signalid = propertyNode.attributeValue("id");
-
- String signaltarget = propertyNode.attributeValue("target");
- List<String> existinglist = globalSignalList.get(signaltarget);
- String failbuild = signalType(signalid, signaldoc);
- if (existinglist == null) {
- existinglist = new ArrayList<String>();
- }
- existinglist.add(signalid + "," + failbuild);
- globalSignalList.put(signaltarget, existinglist);
- }
- }
-
- @SuppressWarnings("unchecked")
- private String signalType(String signalid, Document antDoc) {
- XPath xpath2 = DocumentHelper.createXPath("//hlm:signalListenerConfig[@id='" + signalid
- + "']/signalNotifierInput/signalInput");
- xpath2.setNamespaceURIs(map);
- List<Element> signalNodes3 = xpath2.selectNodes(antDoc);
-
- for (Element propertyNode3 : signalNodes3) {
- String signalinputid = propertyNode3.attributeValue("refid");
-
- XPath xpath3 = DocumentHelper.createXPath("//hlm:signalInput[@id='" + signalinputid
- + "']");
- xpath3.setNamespaceURIs(map);
- List<Element> signalNodes4 = xpath3.selectNodes(antDoc);
- for (Element propertyNode4 : signalNodes4) {
- return propertyNode4.attributeValue("failbuild");
- }
- }
- return null;
- }
-
- /**
- * @param root
- * @param antFile
- * @throws DocumentException
- * @throws IOException
- */
- @SuppressWarnings("unchecked")
- private void parseAntFile(Element root, String antFile) throws DocumentException, IOException {
- log("Processing Ant file: " + antFile, Project.MSG_DEBUG);
- SAXReader xmlReader = new SAXReader();
- Document antDoc = xmlReader.read(new File(antFile));
-
- // Element targetElement =
- // DocumentHelper.createElement("target");
- Element projectElement = root.addElement("project");
- Element nameElement = projectElement.addElement("name");
- String projectName = antDoc.valueOf("/project/@name");
-
- nameElement.setText(projectName);
- // Element descriptionElement =
- // projectElement.addElement("description");
-
- String description = antDoc.valueOf("/project/description");
- insertDocumentation(projectElement, description);
-
- // descriptionElement.setText(description);
-
- if (!antFile.contains("antlib.xml") && description.equals("")) {
- log("Project has no comment: " + projectName, Project.MSG_WARN);
- }
-
- Element defaultElement = projectElement.addElement("default");
- defaultElement.setText(antDoc.valueOf("/project/@default"));
-
- // Project import statements
- List importNodes = antDoc.selectNodes("//import");
- for (Iterator iterator = importNodes.iterator(); iterator.hasNext();) {
- Element importCurrentNode = (Element) iterator.next();
- addTextElement(projectElement, "fileDependency", importCurrentNode.attributeValue("file"));
- }
-
- projectElement.addElement("pythonDependency");
-
- // Project exec statements
- List<Element> execNodes = antDoc.selectNodes("//exec//arg");
- for (Element argNode : execNodes) {
- String argValue = argNode.attributeValue("value");
-
- if (argValue == null) {
- argValue = argNode.attributeValue("line");
- }
-
- if (argValue != null) {
- Pattern filePattern = Pattern.compile(".pl|.py|.bat|.xml|.txt");
- Matcher fileMatcher = filePattern.matcher(argValue);
- if (fileMatcher.find()) {
- addTextElement(projectElement, "fileDependency", argValue);
- }
- }
- }
-
- List<Element> targetNodes = antDoc.selectNodes("//target");
- for (Element targetNode : targetNodes) {
- processTarget(targetNode, projectElement);
- }
-
- // Process macrodef and scriptdef tasks
- // TODO - maybe scriptdefs should be separate?
- List macroNodes = antDoc.selectNodes("//macrodef | //scriptdef");
- for (Iterator iterator = macroNodes.iterator(); iterator.hasNext();) {
- Element macroNode = (Element) iterator.next();
- processMacro(macroNode, projectElement, antFile);
- }
-
- // Project properties
- List propertyNodes = antDoc.selectNodes("//property");
- for (Iterator iterator = propertyNodes.iterator(); iterator.hasNext();) {
- Element propertyNode = (Element) iterator.next();
- processProperty(propertyNode, projectElement);
- }
- }
-
- public ArrayList<String> getAntFiles() {
- return getAntFiles(getProject(), true);
- }
-
- public ArrayList<String> getAntFiles(Project project) {
- return getAntFiles(project, true);
- }
-
- /**
- * Get the list of all Ant files we want to process. These can be project and antlib files.
- *
- * @return antFiles a list of ant files to be processed
- */
- @SuppressWarnings("unchecked")
- public ArrayList<String> getAntFiles(Project project, boolean homeOnly) {
- ArrayList<String> antFiles = new ArrayList<String>();
-
- Map<String, Target> targets = project.getTargets();
- Iterator<Target> targetsIter = targets.values().iterator();
-
- String projectHome = null;
- try {
- projectHome = new File(project.getProperty("helium.dir")).getCanonicalPath();
-
- while (targetsIter.hasNext()) {
- Target target = targetsIter.next();
- String projectPath = new File(target.getLocation().getFileName()).getCanonicalPath();
-
- if (!antFiles.contains(projectPath)) {
- if (homeOnly) {
- if (!projectPath.contains(projectHome)) {
- antFiles.add(projectPath);
- }
- } else {
- antFiles.add(projectPath);
- }
- }
- }
-
- if (rc != null) {
- Iterator extraFilesIter = rc.iterator();
- while (extraFilesIter.hasNext()) {
- FileResource fileResource = (FileResource) extraFilesIter.next();
- String extrafile = fileResource.getFile().getCanonicalPath();
-
- if (!antFiles.contains(fileResource.toString())
- && !fileResource.getFile().getName().startsWith("test_")) {
- if (homeOnly) {
- if (!extrafile.contains(projectHome)) {
- antFiles.add(extrafile);
- }
- }
- else {
- antFiles.add(extrafile);
- }
- }
- }
- }
-
- }
- catch (IOException e) {
- log(e.getMessage(), Project.MSG_ERR);
- e.printStackTrace();
- }
- return antFiles;
- }
-
- // --------------------------------- PRIVATE METHODS ------------------------------------------
-
- @SuppressWarnings("unchecked")
- private void processMacro(Element macroNode, Element outProjectNode, String antFile)
- throws IOException, DocumentException {
- String macroName = macroNode.attributeValue("name");
- log("Processing macro: " + macroName, Project.MSG_DEBUG);
-
- Element outmacroNode = outProjectNode.addElement("macro");
- addTextElement(outmacroNode, "name", macroNode.attributeValue("name"));
- addTextElement(outmacroNode, "description", macroNode.attributeValue("description"));
-
- // Add location
- // Project project = getProject();
- // Macro antmacro = (Macro) project.getTargets().get(macroName);
- // System.out.println(project.getMacroDefinitions());
- // System.out.println(macroName);
- // MacroInstance antmacro = (MacroInstance)
- // project.getMacroDefinitions().get("http://www.nokia.com/helium:" +
- // macroName);
-
- // Add the location with just the file path for now and a dummy line
- // number.
- // TODO - Later we should find the line number from the XML input.
- addTextElement(outmacroNode, "location", antFile + ":1:");
-
- List<Node> statements = macroNode.selectNodes("//scriptdef[@name='" + macroName
- + "']/attribute | //macrodef[@name='" + macroName + "']/attribute");
- String usage = "";
- for (Node statement : statements) {
- String defaultval = statement.valueOf("@default");
- if (defaultval.equals("")) {
- defaultval = "value";
- } else {
- defaultval = "<i>" + defaultval + "</i>";
- }
- usage = usage + " " + statement.valueOf("@name") + "=\"" + defaultval + "\"";
- }
-
- String macroElements = "";
- statements = macroNode.selectNodes("//scriptdef[@name='" + macroName
- + "']/element | //macrodef[@name='" + macroName + "']/element");
- for (Node statement : statements) {
- macroElements = "<" + statement.valueOf("@name") + "/>\n" + macroElements;
- }
- if (macroElements.equals("")) {
- addTextElement(outmacroNode, "usage", "<hlm:" + macroName + " " + usage + "/>");
- } else {
- addTextElement(outmacroNode, "usage", "<hlm:" + macroName + " " + usage + ">\n"
- + macroElements + "</hlm:" + macroName + ">");
- }
-
- // Add dependencies
- // Enumeration dependencies = antmacro.getDependencies();
- // while (dependencies.hasMoreElements())
- // {
- // String dependency = (String) dependencies.nextElement();
- // Element dependencyElement = addTextElement(outmacroNode,
- // "dependency", dependency);
- // dependencyElement.addAttribute("type","direct");
- // }
-
- callAntTargetVisitor(macroNode, outmacroNode);
-
- // Add documentation
- // Get comment element before the macro element to extract macro doc
- List<Node> children = macroNode.selectNodes("preceding-sibling::node()");
- if (children.size() > 0) {
- // Scan past the text nodes, which are most likely whitespace
- int index = children.size() - 1;
- Node child = (Node) children.get(index);
- while (index > 0 && child.getNodeType() == Node.TEXT_NODE) {
- index--;
- child = (Node) children.get(index);
- }
-
- // Check if there is a comment node
- String commentText = null;
- if (child.getNodeType() == Node.COMMENT_NODE) {
- Comment macroComment = (Comment) child;
- commentText = macroComment.getStringValue().trim();
- log(macroName + " comment: " + commentText, Project.MSG_DEBUG);
- }
- else {
- log("Macro has no comment: " + macroName, Project.MSG_WARN);
- }
-
- insertDocumentation(outmacroNode, commentText);
- }
-
- // Get names of all properties used in this macro
- ArrayList properties = new ArrayList();
- Visitor visitor = new AntPropertyVisitor(properties);
- macroNode.accept(visitor);
- for (Iterator iterator = properties.iterator(); iterator.hasNext();) {
- String property = (String) iterator.next();
- addTextElement(outmacroNode, "propertyDependency", property);
- }
- }
-
- private void callAntTargetVisitor(Element targetNode, Element outTargetNode) {
- // Add antcall/runtarget dependencies
- ArrayList<String> antcallTargets = new ArrayList<String>();
- ArrayList<String> logs = new ArrayList<String>();
- ArrayList<String> signals = new ArrayList<String>();
- ArrayList<String> executables = new ArrayList<String>();
- Visitor visitorTarget = new AntTargetVisitor(antcallTargets, logs, signals, executables);
- targetNode.accept(visitorTarget);
- for (String antcallTarget : antcallTargets) {
- Element dependencyElement = addTextElement(outTargetNode, "dependency", antcallTarget);
- dependencyElement.addAttribute("type", "exec");
- }
-
- for (String log : logs) {
- addTextElement(outTargetNode, "log", log);
- }
-
- if (globalSignalList.get(targetNode.attributeValue("name")) != null) {
- signals.addAll(globalSignalList.get(targetNode.attributeValue("name")));
- }
-
- for (String signal : signals) {
- addTextElement(outTargetNode, "signal", signal);
- }
-
- for (String executable : executables) {
- addTextElement(outTargetNode, "executable", executable);
- }
- }
-
- @SuppressWarnings("unchecked")
- private void processTarget(Element targetNode, Element outProjectNode) throws IOException,
- DocumentException {
- String targetName = targetNode.attributeValue("name");
- log("Processing target: " + targetName, Project.MSG_DEBUG);
-
- // Add documentation
- // Get comment element before the target element to extract target doc
- String commentText = "";
- List<Node> children = targetNode.selectNodes("preceding-sibling::node()");
- if (children.size() > 0) {
- // Scan past the text nodes, which are most likely whitespace
- int index = children.size() - 1;
- Node child = children.get(index);
- while (index > 0 && child.getNodeType() == Node.TEXT_NODE) {
- index--;
- child = (Node) children.get(index);
- }
-
- // Check if there is a comment node
- if (child.getNodeType() == Node.COMMENT_NODE) {
- Comment targetComment = (Comment) child;
- commentText = targetComment.getStringValue().trim();
-
- log(targetName + " comment: " + commentText, Project.MSG_DEBUG);
- }
- else {
- log("Target has no comment: " + targetName, Project.MSG_WARN);
- }
- }
-
- if (!commentText.contains("Private:")) {
- Element outTargetNode = outProjectNode.addElement("target");
-
- addTextElement(outTargetNode, "name", targetNode.attributeValue("name"));
- addTextElement(outTargetNode, "ifDependency", targetNode.attributeValue("if"));
- addTextElement(outTargetNode, "unlessDependency", targetNode.attributeValue("unless"));
- addTextElement(outTargetNode, "description", targetNode.attributeValue("description"));
- addTextElement(outTargetNode, "tasks", String.valueOf(targetNode.elements().size()));
-
- // Add location
- Project project = getProject();
- Target antTarget = (Target) project.getTargets().get(targetName);
-
- if (antTarget == null) {
- return;
- }
-
- addTextElement(outTargetNode, "location", antTarget.getLocation().toString());
-
- // Add dependencies
- Enumeration dependencies = antTarget.getDependencies();
- while (dependencies.hasMoreElements()) {
- String dependency = (String) dependencies.nextElement();
- Element dependencyElement = addTextElement(outTargetNode, "dependency", dependency);
- dependencyElement.addAttribute("type", "direct");
- }
-
- callAntTargetVisitor(targetNode, outTargetNode);
-
- // Process the comment text as MediaWiki syntax and convert to HTML
- insertDocumentation(outTargetNode, commentText);
-
- // Get names of all properties used in this target
- ArrayList properties = new ArrayList();
- Visitor visitor = new AntPropertyVisitor(properties);
- targetNode.accept(visitor);
- for (Iterator iterator = properties.iterator(); iterator.hasNext();) {
- String property = (String) iterator.next();
- addTextElement(outTargetNode, "propertyDependency", property);
- }
-
- // Add the raw XML content of the element
- String targetXml = targetNode.asXML();
- // Replace the CDATA end notation to avoid nested CDATA sections
- targetXml = targetXml.replace("]]>", "] ]>");
-
- addTextElement(outTargetNode, "source", targetXml, true);
- }
- }
-
- private void processProperty(Element propertyNode, Element outProjectNode) throws IOException {
- String propertyName = propertyNode.attributeValue("name");
- log("Processing Property: " + propertyName, Project.MSG_DEBUG);
-
- Element outPropertyNode = outProjectNode.addElement("property");
- addTextElement(outPropertyNode, "name", propertyNode.attributeValue("name"));
- if (propertyNode.attributeValue("value") == null) {
- addTextElement(outPropertyNode, "defaultValue", propertyNode.attributeValue("location"));
- }
- else {
- addTextElement(outPropertyNode, "defaultValue", propertyNode.attributeValue("value"));
- }
- }
-
- private void insertDocumentation(Element outNode, String commentText) throws IOException,
- DocumentException {
- if (commentText != null) {
- WikiModel wikiModel = new WikiModel("", "");
- if (!commentText.contains("</pre>")
- && (commentText.contains("**") || commentText.contains("==") || commentText.contains("- -"))) {
- commentText = commentText.replace("**", "").replace("==", "").replace("- -", "").trim();
- log("Warning: Comment code has invalid syntax: " + commentText, Project.MSG_WARN);
- }
- if (commentText.startsWith("-")) {
- commentText = commentText.replace("-", "");
- }
- commentText = commentText.trim();
-
- String commentTextCheck = commentText.replace("deprecated>", "").replace("tt>", "").replace("todo>", "");
- if (commentTextCheck.contains(">") && !commentTextCheck.contains("</pre>")) {
- log("Warning: Comment code needs <pre> tags around it: " + commentText, Project.MSG_WARN);
- }
-
- commentText = filterTextNewlines(commentText);
- commentText = wikiModel.render(commentText);
-
- // If <deprecated> tag exists in the comment, then parse the
- // deprecated message.
- if (commentText.indexOf("<deprecated>") != -1) {
- int deprecatedMsgStart = commentText.indexOf("<deprecated>") + 20;
- int deprecatedMsgEnd = commentText.indexOf("</deprecated>");
-
- // Add deprecated element.
- String deprecatedMsg = commentText.substring(deprecatedMsgStart, deprecatedMsgEnd);
- addTextElement(outNode, "deprecated", deprecatedMsg);
-
- // remove <deprecated> part from description field.
- int commentTextLength = commentText.length();
- String documentationMsgStart = commentText.substring(1, deprecatedMsgStart - 20);
- String documentationMsgEnd = commentText.substring(deprecatedMsgEnd + 21, commentTextLength);
- String documentationMsg = documentationMsgStart.concat(documentationMsgEnd);
- commentText = documentationMsg.trim();
- }
- }
- else {
- commentText = "";
- }
- // Get the documentation element as a document
- String documentationText = "<documentation>" + commentText + "</documentation>";
- Document docDoc = DocumentHelper.parseText(documentationText);
- outNode.add(docDoc.getRootElement());
- log("HTML comment: " + commentText, Project.MSG_DEBUG);
- }
-
- private Element addTextElement(Element parent, String name, String text) {
- Element element = addTextElement(parent, name, text, false);
-
- return element;
- }
-
- private Element addTextElement(Element parent, String name, String text, boolean escape) {
- Element element = parent.addElement(name);
- if (text != null) {
- if (escape) {
- element.addCDATA(text);
- }
- else {
- element.setText(text);
- }
- }
- return element;
- }
-
- private String filterTextNewlines(String text) throws IOException {
- BufferedReader in = new BufferedReader(new StringReader(text));
- StringBuilder out = new StringBuilder();
- String line = in.readLine();
- while (line != null) {
- out.append(line.trim());
- out.append("\n");
- line = in.readLine();
- }
- return out.toString();
- }
-
- /**
- * Method adds taskdef nodes to the specified project.
- *
- * @param outProjectNode
- * @throws IOException
- */
- private void buildTaskDefs(Element root) throws DocumentException, IOException {
- Element projectElement = root.addElement("project");
- projectElement.addElement("name");
- insertDocumentation(projectElement, "");
- HashMap<String, String> tasks = getHeliumAntTasks();
-
- for (String taskName : tasks.keySet()) {
- String className = tasks.get(taskName);
- log("Processing TaskDef: " + taskName, Project.MSG_DEBUG);
-
- Element outTaskDefNode = projectElement.addElement("taskdef");
- addTextElement(outTaskDefNode, "name", taskName);
- addTextElement(outTaskDefNode, "classname", className);
- }
- }
-
- /**
- * Method returns all the helium ant tasks in the project.
- *
- * @return
- */
- @SuppressWarnings("unchecked")
- private HashMap<String, String> getHeliumAntTasks() {
-
- // 1. Get all the task definitions from the project
- Hashtable<String, Class<?>> allTaskdefs = getProject().getTaskDefinitions();
- // 2. Filter the list by applying criteria
- return filterTasks(allTaskdefs);
- }
-
- /**
- * Method is used to filter tasks.
- *
- * @param allTaskdefs
- * @param criteria
- */
- private HashMap<String, String> filterTasks(Hashtable<String, Class<?>> allTaskdefs) {
- HashMap<String, String> tasks = new HashMap<String, String>();
-
- Enumeration<String> taskdefsenum = allTaskdefs.keys();
- while (taskdefsenum.hasMoreElements()) {
- String key = taskdefsenum.nextElement();
- Class<?> clazz = allTaskdefs.get(key);
- String className = clazz.getName();
- if (key.contains("nokia.com") && className.startsWith("com.nokia")
- && className.contains("ant.taskdefs")) {
- tasks.put(getTaskName(key), clazz.getName());
- }
- }
- return tasks;
- }
-
- /**
- * Returns the task name delimiting the helium namespace.
- *
- * @param text
- * @return
- */
- private String getTaskName(String text) {
- int lastIndex = text.lastIndexOf(':');
- return text.substring(lastIndex + 1);
- }
-
- // ----------------------------------- PRIVATE CLASSES -----------------------------------------
-
- private class AntPropertyVisitor extends VisitorSupport {
- private List<String> propertyList;
-
- public AntPropertyVisitor(List<String> propertyList) {
- this.propertyList = propertyList;
- }
-
- public void visit(Attribute node) {
- String text = node.getStringValue();
- extractUsedProperties(text);
- }
-
- public void visit(CDATA node) {
- String text = node.getText();
- extractUsedProperties(text);
- }
-
- public void visit(Text node) {
- String text = node.getText();
- extractUsedProperties(text);
- }
-
- public void visit(Element node) {
- if (node.getName().equals("property")) {
- String propertyName = node.attributeValue("name");
- if (!propertyList.contains(propertyName)) {
- propertyList.add(propertyName);
- log("property matches :" + propertyName, Project.MSG_DEBUG);
- }
- }
- }
-
- private void extractUsedProperties(String text) {
- Pattern p1 = Pattern.compile("\\$\\{([^@$}]*)\\}");
- Matcher m1 = p1.matcher(text);
- log(text, Project.MSG_DEBUG);
- while (m1.find()) {
- String group = m1.group(1);
- if (!propertyList.contains(group)) {
- propertyList.add(group);
- }
- log("property matches: " + group, Project.MSG_DEBUG);
- }
-
- Pattern p2 = Pattern.compile("\\$\\{([^\n]*\\})\\}");
- Matcher m2 = p2.matcher(text);
- log(text, Project.MSG_DEBUG);
- while (m2.find()) {
- String group = m2.group(1);
- if (!propertyList.contains(group)) {
- propertyList.add(group);
- }
- log("property matches: " + group, Project.MSG_DEBUG);
- }
-
- Pattern p3 = Pattern.compile("\\$\\{(\\@\\{[^\n]*)\\}");
- Matcher m3 = p3.matcher(text);
- log(text, Project.MSG_DEBUG);
- while (m3.find()) {
- String group = m3.group(1);
- if (!propertyList.contains(group)) {
- propertyList.add(group);
- }
- log("property matches: " + group, Project.MSG_DEBUG);
- }
- }
- }
-
- private class AntTargetVisitor extends VisitorSupport {
- private List<String> targetList;
- private List<String> logList;
- private List<String> signalList;
- private List<String> executableList;
-
- public AntTargetVisitor(List<String> targetList, List<String> logList,
- List<String> signalList, List<String> executableList) {
- this.targetList = targetList;
- this.logList = logList;
- this.signalList = signalList;
- this.executableList = executableList;
- }
-
- public void visit(Element node) {
- String name = node.getName();
- if (name.equals("antcall") || name.equals("runtarget")) {
- String text = node.attributeValue("target");
- extractTarget(text);
- }
-
- if (!name.equals("include") && !name.equals("exclude")) {
- String text = node.attributeValue("name");
- addLog(text);
- text = node.attributeValue("output");
- addLog(text);
- text = node.attributeValue("value");
- addLog(text);
- text = node.attributeValue("log");
- addLog(text);
- text = node.attributeValue("line");
- addLog(text);
- text = node.attributeValue("file");
- addLog(text);
- }
-
- if (name.equals("signal") || name.equals("execSignal")) {
- String signalid = getProject().replaceProperties(node.attributeValue("name"));
- String failbuild = signalType(signalid, signaldoc);
-
- if (signalList != null) {
- if (failbuild != null) {
- signalList.add(signalid + "," + failbuild);
- } else {
- signalList.add(signalid);
- }
- }
- }
-
- if (name.equals("exec") || name.equals("preset.exec")) {
- String text = node.attributeValue("executable");
- executableList.add(text);
- log("Executable: " + text, Project.MSG_DEBUG);
- }
- }
-
- private void addLog(String text) {
- if (text != null && logList != null) {
- for (String log : text.split(" ")) {
- String fulllogname = getProject().replaceProperties(log);
- if (!logList.contains(log)
- && (fulllogname.endsWith(".log") || fulllogname.endsWith(".html"))) {
- log = log.replace("--log=", "");
- logList.add(log);
- }
- }
- }
- }
-
- private void extractTarget(String text) {
- String iText = getProject().replaceProperties(text);
- targetList.add(iText);
- }
-
- }
-}
--- a/buildframework/helium/sf/java/legacy/src/com/nokia/ant/HeliumLogger.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,218 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.ant;
-
-import java.io.File;
-import java.io.PrintStream;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.DefaultLogger;
-import org.apache.tools.ant.Project;
-
-/**
- * Logger class that can connect to Ant and log information regarding to build
- * times, number of errors and such. Data is sent to Diamonds server, where it
- * is processed further.
- *
- * This class is listening all build related events. It catches the build
- * start-finish, target start-finish events of Ant and gather build start-end
- * time, errors/warnings and store in BuildData class. Stored data will be
- * exported to XML and uploaded to Diamonds server after each specific target.
- * For example after target "create-bom" this class will upload all BOM data to
- * Diamonds.
- *
- *
- */
-public class HeliumLogger extends DefaultLogger {
-
- private static boolean stopLogToConsole;
- private static final String INTERNALPROPERTY = "internal.";
-
- private Project project;
- private Logger log = Logger.getLogger(this.getClass());
-
-
-
- /**
- * Ant call this function when build start.
- */
- public void buildStarted(BuildEvent event) {
- project = event.getProject();
- super.buildStarted(event);
- }
-
- /**
- * Triggered when a target starts.
- */
- public void targetStarted(BuildEvent event) {
- /** The "if" condition to test on execution. */
- String ifCondition = "";
- /** The "unless" condition to test on execution. */
- String unlessCondition = "";
- String targetName = event.getTarget().getName();
- logTargetEvent(targetName, "start");
-
- /**get the values needed from the event **/
- ifCondition = event.getTarget().getIf();
- unlessCondition = event.getTarget().getUnless();
- project = event.getProject();
-
- super.targetStarted(event);
-
- /**if the target is not going to execute (due to 'if' or 'unless' conditions)
- print a message telling the user why it is not going to execute**/
- if (!testIfCondition(ifCondition) && ifCondition != null) {
- if (ifCondition.startsWith(INTERNALPROPERTY)) {
- String enableProperty = ifCondition.substring(INTERNALPROPERTY.length());
- project.log("Skipped because property '"
- + enableProperty
- + "' not set to 'true'.", Project.MSG_INFO);
- } else {
- project.log("Skipped because property '"
- + project.replaceProperties(ifCondition)
- + "' is not set.", Project.MSG_INFO);
- }
-
- } else if (!testUnlessCondition(unlessCondition) && unlessCondition != null) {
- if (unlessCondition.startsWith(INTERNALPROPERTY)) {
- String enableProperty = unlessCondition.substring(INTERNALPROPERTY.length());
- project.log("Skipped because property '"
- + enableProperty
- + "' is set.", Project.MSG_INFO);
- } else {
- project.log("Skipped because property '"
- + project.replaceProperties(unlessCondition)
- + "' set.", Project.MSG_INFO);
- }
- }
- }
-
- /**
- * Log the start or end of the build as a event.
- *
- * @param targetName
- * The name of the current target.
- * @param event
- * A string description of the event.
- */
- private void logTargetEvent(String targetName, String event) {
- String logTargetProperty = project.getProperty("log.target");
- if ((logTargetProperty != null) && (logTargetProperty.equals("yes"))) {
- log.info("Target #### " + targetName + " ####: " + event);
- }
- }
-
- /**
- * Triggered when a target finishes.
- */
- public void targetFinished(BuildEvent event) {
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String time = sdf.format(Calendar.getInstance().getTime());
-
- String targetName = time + "," + event.getTarget().getName();
-
- logTargetEvent(targetName, "finish");
- }
-
- /**
- * Triggered when the build finishes.
- */
- public void buildFinished(BuildEvent event) {
- // re-enabling output of messages at the end of the build
- stopLogToConsole = false;
- cleanup();
- super.buildFinished(event);
- }
-
- /**
- * See if build needs a final cleanup target to be called.
- */
- private void cleanup() {
- if (project != null) {
- String loggingoutputfile = project.getProperty("logging.output.file");
- if (loggingoutputfile != null) {
- File file = new File(loggingoutputfile);
- if (file.exists()) {
- file.delete();
- }
- }
- if ((project.getProperty("call.cleanup") != null)
- && (project.getProperty("call.cleanup").equals("yes"))) {
- project.executeTarget("cleanup-all");
- }
- }
- }
-
- /**
- * Get log to console status
- */
- public static boolean getStopLogToConsole() {
- return stopLogToConsole;
- }
-
- /**
- * Set log to console status
- */
- public static void setStopLogToConsole(boolean stop) {
- stopLogToConsole = stop;
- }
-
- /**
- * {@inheritDoc}
- */
- protected void printMessage(final String message, final PrintStream stream,
- final int priority) {
- if (!stopLogToConsole) {
- stream.println(message);
- }
- }
-
- /**
- * Tests whether or not the "if" condition is satisfied.
- *
- * @return whether or not the "if" condition is satisfied. If no
- * condition (or an empty condition) has been set,
- * <code>true</code> is returned.
- */
- private boolean testIfCondition(String ifCondition) {
- if ("".equals(ifCondition)) {
- return true;
- }
-
- String test = project.replaceProperties(ifCondition);
- return project.getProperty(test) != null;
- }
-
- /**
- * Tests whether or not the "unless" condition is satisfied.
- *
- * @return whether or not the "unless" condition is satisfied. If no
- * condition (or an empty condition) has been set,
- * <code>true</code> is returned.
- */
- private boolean testUnlessCondition(String unlessCondition) {
- if ("".equals(unlessCondition)) {
- return true;
- }
- String test = project.replaceProperties(unlessCondition);
- return project.getProperty(test) == null;
- }
-}
--- a/buildframework/helium/sf/java/legacy/src/com/nokia/ant/HelpDef.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.ant;
-
-import java.util.Iterator;
-
-import org.apache.tools.ant.BuildListener;
-import org.apache.tools.ant.BuildLogger;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.types.DataType;
-
-import com.nokia.helium.core.ant.PostBuildAction;
-
-/**
- *
- */
-public class HelpDef extends DataType implements PostBuildAction {
-
- /**
- *
- * @param project Object of the project
- * @param targetNames Array of target names to execute
- *
- */
- public void executeOnPostBuild(Project project, String[] targetNames) {
- String firstTarget;
- // take target
- if (targetNames != null && targetNames.length > 0) {
- firstTarget = targetNames[0];
- }
- // no target, so set the default one
- else {
- firstTarget = "help";
- }
-
- // If 'help' target is called, just run that and set other
- // target names as a property
- if (firstTarget.equals("help")) {
- displayHelp(project, targetNames, firstTarget);
- }
- }
-
- @SuppressWarnings("unchecked")
- private void displayHelp(Project project, String[] targetNames, String firstTarget) {
- if (targetNames.length > 1) {
- project.setProperty("help.item", targetNames[1]);
- }
-
- // Set Emacs mode to true for all listeners, so that help text does
- // not have [echo] at the start of each line
- Iterator iter = project.getBuildListeners().iterator();
- while (iter.hasNext()) {
- BuildListener listener = (BuildListener) iter.next();
- if (listener instanceof BuildLogger) {
- BuildLogger logger = (BuildLogger) listener;
- logger.setEmacsMode(true);
- }
- }
-
- // Run the 'help' target
- project.executeTarget(firstTarget);
- }
-}
--- a/buildframework/helium/sf/java/legacy/src/com/nokia/ant/Signal.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-
-package com.nokia.ant;
-
-/**
- * This class stores a signal while being deferred.
- *
- */
-public class Signal {
-
- private String name;
- private String message;
-
- public String getMessage() {
- return message;
- }
-
- public void setMessage(String message) {
- this.message = message;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
--- a/buildframework/helium/sf/java/legacy/src/com/nokia/ant/antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/legacy/src/com/nokia/ant/antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -26,7 +26,6 @@
<taskdef name="configuration" classname="com.nokia.ant.taskdefs.AntConfigurationTask"/>
<taskdef name="coveragerecord" classname="com.nokia.ant.taskdefs.CoverageRecorderTask"/>
<taskdef name="fastcopy" classname="com.nokia.ant.taskdefs.CopyParallelTask"/>
- <taskdef name="logtoconsole" classname="com.nokia.ant.taskdefs.StopLogToConsoleTask"/>
<taskdef name="parsemodel" classname="com.nokia.ant.taskdefs.ModelPropertiesTask"/>
<typedef name="typedef" classname="com.nokia.ant.TypedefURIFix"/>
--- a/buildframework/helium/sf/java/legacy/src/com/nokia/ant/helium.antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-============================================================================
-Name : libs.ant.xml
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="libs-mains" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
- <description>
- Ant task definition declarations.
- </description>
- <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
- <typedef name="buildstatusdef" classname="com.nokia.ant.BuildStatusDef" uri="http://www.nokia.com/helium"/>
- <typedef name="helpdef" classname="com.nokia.ant.HelpDef" uri="http://www.nokia.com/helium"/>
- <hlm:deflist id="helium-legacy.list">
- <hlm:buildstatusdef/>
- <hlm:helpdef/>
- </hlm:deflist>
-</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/legacy/src/com/nokia/ant/taskdefs/StopLogToConsoleTask.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,81 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-
-package com.nokia.ant.taskdefs;
-
-import org.apache.tools.ant.Task;
-
-import com.nokia.ant.HeliumLogger;
-
-/**
- * This task is deprecated, please consider using the
- * hlm:taskRecorder task from the logging framework.
- *
- * This task will control the outputing of the Helium logger.
- *
- * Example of usage, to stop logging to console:
- * <pre>
- * <hlm:logtoconsole action="stop"/>
- * </pre>
- *
- * To resume logging to console:
- * <pre>
- * <hlm:logtoconsole action="start"/>
- * </pre>
- *
- * @ant.task name="logtoconsole" category="Logging"
- * @deprecated This task is deprecated, please consider using the
- * hlm:taskRecorder task from the logging framework.
- */
-@Deprecated
-public class StopLogToConsoleTask extends Task
-{
- private boolean stopLogToConsole;
-
- /**
- * Action to perform, stop/start logging.
- * @ant.not-required Default value is start.
- */
- public void setAction(String msg)
- {
- if ( msg.equalsIgnoreCase("stop") )
- {
- stopLogToConsole = true;
- }
- else
- {
- stopLogToConsole = false;
- }
- }
-
- @Override
- public void execute()
- {
- super.execute();
- if (HeliumLogger.getStopLogToConsole() != stopLogToConsole)
- {
- if (stopLogToConsole) {
- log("Logging to console suspended.");
- }
- HeliumLogger.setStopLogToConsole(stopLogToConsole);
- if (!stopLogToConsole) {
- log("Logging to console resumed.");
- }
- }
- }
-}
--- a/buildframework/helium/sf/java/legacy/src/com/nokia/log4j.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/legacy/src/com/nokia/log4j.xml Mon Oct 18 10:23:52 2010 +0100
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
============================================================================
-Name : libs.ant.xml
+Name : log4j.xml
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -42,7 +42,7 @@
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="${log4j.cache.dir}/hlm_debug.log"/>
- <param name="append" value="false"/>
+ <param name="append" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{HH:mm:ss,SSS} %-2p - %-20c{1} - %m %n "/>
--- a/buildframework/helium/sf/java/legacy/tests/antunit/run-scenario.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-============================================================================
-Name : test_signaltask.ant.xml
-Part of : Helium AntLib
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="run-scenario" xmlns:ac="antlib:net.sf.antcontrib" xmlns:au="antlib:org.apache.ant.antunit">
- <description>Helium Antlib feature enabler macro.</description>
-
- <target name="setUp">
- <tempfile property="temp.dir" suffix=".dir" />
- <mkdir dir="${temp.dir}" />
- </target>
-
- <target name="tearDown">
- <delete dir="${temp.dir}" />
- </target>
-
- <macrodef name="runScenario">
- <attribute name="scenario" />
- <attribute name="target" />
- <attribute name="cmdline" default=""/>
- <sequential>
- <ac:trycatch property="scenario.unittest.error">
- <try>
- <exec osfamily="windows" executable="cmd" dir="${ant.file.run-scenario}/../../scenarii/@{scenario}" failonerror="true" errorproperty="scenario.unittest.error.log">
- <env key="ANT_ARGS" value="${env.ANT_ARGS} -logger com.nokia.ant.HeliumLogger" />
- <arg line="/c ..\build.bat @{target}" />
- <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
- <arg value="-Dtemp.dir=${temp.dir}" />
- <arg value="-Dhelium.dir=${ant.file.run-scenario}/../../scenarii/property" />
- </exec>
- <exec osfamily="unix" executable="../bld.sh" dir="${ant.file.run-scenario}/../../scenarii/@{scenario}" failonerror="true" errorproperty="scenario.unittest.error.log">
- <env key="ANT_ARGS" value="${env.ANT_ARGS} -logger com.nokia.ant.HeliumLogger" />
- <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
- <arg line="@{target}" />
- <arg value="-Dtemp.dir=${temp.dir}" />
- <arg line="@{cmdline}" />
- <arg value="-Dhelium.dir=${ant.file.run-scenario}/../../scenarii/property" />
- </exec>
- </try>
- </ac:trycatch>
- <!--<loadfile property="scenario.unittest.error.log" srcFile="${temp.dir}/scenario.log" />-->
- <au:assertTrue message="${scenario.unittest.error.log}">
- <not>
- <isset property="scenario.unittest.error" />
- </not>
- </au:assertTrue>
- </sequential>
- </macrodef>
-
-</project>
--- a/buildframework/helium/sf/java/legacy/tests/antunit/test_feature_enabled_flags.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-============================================================================
-Name : test_feature_enabled_flags.ant.xml
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="test_feature_enabled_flags" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
- <description>
- Testing targets.
- </description>
-
- <property environment="env"/>
- <import file="run-scenario.ant.xml"/>
-
- <target name="test-target-disabled">
- <runScenario scenario="test" target="run-target-disabled" />
- <au:assertLogContains text="Skipped because property 'feature.enabled' not set to 'true'"/>
- <au:assertLogContains text="Warning: enable.feature property has been deprecated since 11.0. Start using feature.enabled property"/>
- <au:assertLogContains text="Warning: internal.abc.enabled property has been overridden"/>
- <au:assertLogContains text="Warning: internal.bla.enabled property has been deprecated since 6.0. Start using internal.abc.enabled property"/>
- <au:assertLogContains text="Warning: feature.enabled property has been overridden"/>
- </target>
-
- <target name="test-target-enabled">
- <runScenario scenario="test" target="run-target-enabled" />
- <au:assertLogContains text="[echo] Running run-target-enabled"/>
- </target>
-
- <target name="test-target-enabled-with-old-flag">
- <runScenario scenario="test" target="run-with-old-flag-enabled" />
- <au:assertLogContains text="[echo] Running run-with-old-flag-enabled"/>
- </target>
-
- <target name="test-target-enabled-with-new-flag">
- <runScenario scenario="test" target="run-with-new-flag-enabled" />
- <au:assertLogContains text="[echo] Running run-with-new-flag-enabled"/>
- </target>
-
- <target name="test-target-enabled-with-both">
- <runScenario scenario="test" target="run-with-both-enabled" />
- <au:assertLogContains text="[echo] Running run-with-both-enabled"/>
- </target>
-
- <target name="test-target-unless-enabled">
- <runScenario scenario="test" target="run-with-unless-enabled" />
- <au:assertLogContains text="Skipped because property 'skip.ats.sending' set"/>
- </target>
-
- <target name="test-target-unless-internal-enabled">
- <runScenario scenario="test" target="run-with-unless-internal-enabled" />
- <au:assertLogContains text="Skipped because property 'old.enabled' is set"/>
- </target>
-
-
-
-</project>
-
--- a/buildframework/helium/sf/java/legacy/tests/scenarii/bld.sh Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-#!/bin/bash
-
-#
-# 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 the License "Eclipse Public License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description:
-#
-
-if [ -f ~/.bashrc ] ; then
- . ~/.bashrc
-fi
-ant $*
--- a/buildframework/helium/sf/java/legacy/tests/scenarii/build.bat Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-@echo off
-
-rem
-rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-rem All rights reserved.
-rem This component and the accompanying materials are made available
-rem under the terms of the License "Eclipse Public License v1.0"
-rem which accompanies this distribution, and is available
-rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
-rem
-rem Initial Contributors:
-rem Nokia Corporation - initial contribution.
-rem
-rem Contributors:
-rem
-rem Description:
-rem
-
-setlocal
-if not defined JAVA_6_HOME (
-set TESTED_JAVA=C:\Apps\j2sdk_1.6.0_02
-) ELSE set TESTED_JAVA=%JAVA_6_HOME%
-if exist %TESTED_JAVA% (set JAVA_HOME=%TESTED_JAVA%)
-call ant %*
-if "%ERRORLEVEL%" neq "0" (goto error)
-endlocal
-goto :eof
-
-:error
-endlocal
-if "%OS%"=="Windows_NT" color 00
--- a/buildframework/helium/sf/java/legacy/tests/scenarii/property/feature.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-============================================================================
-Name : feature.ant.xml
-Part of : Helium AntLib
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="test-properties" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
- <description>Helium Antlib logger unittests.</description>
-
- <!-- Set to true to enable feature
- @type boolean
- @editable required
- @scope private
- -->
- <property name="feature.enabled" value="true"/>
-
- <!-- Set to true to enable feature - deprecated: Start using feature.enabled property
- @type boolean
- @editable required
- @scope public
- @deprecated since 11.0
- -->
- <property name="enable.feature" value="true"/>
-
- <!--* @property internal.abc.enabled
- Set to true to true to run targets.
- @type boolean
- @editable required
- @scope private
- -->
-
- <!--* @property internal.bla.enabled
- Set to true to true to run targets - deprecated: Start using internal.abc.enabled property.
- @type boolean
- @editable required
- @scope public
- @deprecated since 6.0
- -->
-
- <target name="temp">
- <echo>Inside the temp target</echo>
- </target>
-
-
-
-</project>
--- a/buildframework/helium/sf/java/legacy/tests/scenarii/test/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-============================================================================
-Name : build.xml
-Part of : Helium AntLib
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="test-enable-flags" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
- <description>Helium Antlib logger unittests.</description>
-
- <import file="../property/feature.ant.xml"/>
- <property name="feature.enabled" value="true"/>
- <property name="enable.feature" value="true"/>
- <property name="internal.abc.enabled" value="true"/>
- <property name="internal.bla.enabled" value="false"/>
- <property name="skip.ats.sending" value="t"/>
-
-
- <condition property="internal.old.enabled">
- <or>
- <istrue value="${xyz.enabled}"/>
- <isset property="enable.feature"/>
- </or>
- </condition>
-
- <condition property="internal.new.enabled">
- <or>
- <istrue value="${feature.enabled}"/>
- <isset property="abc.feature"/>
- </or>
- </condition>
-
- <condition property="internal.both.enabled">
- <or>
- <istrue value="${feature.enabled}"/>
- <isset property="enable.feature"/>
- </or>
- </condition>
-
- <target name="run-target-disabled" if="internal.feature.enabled">
- <echo>Running run-target-disabled</echo>
- </target>
-
- <target name="run-target-enabled" if="feature.enabled">
- <echo>Running run-target-enabled</echo>
- </target>
-
- <target name="run-with-old-flag-enabled" if="internal.old.enabled">
- <echo>Running run-with-old-flag-enabled</echo>
- </target>
-
- <target name="run-with-new-flag-enabled" if="internal.new.enabled">
- <echo>Running run-with-new-flag-enabled</echo>
- </target>
-
- <target name="run-with-both-enabled" if="internal.both.enabled">
- <echo>Running run-with-both-enabled</echo>
- </target>
-
- <target name="run-with-unless-enabled" unless="skip.ats.sending">
- <echo>Running run-with-unless-enabled</echo>
- </target>
-
- <target name="run-with-unless-internal-enabled" unless="internal.old.enabled">
- <echo>Running run-with-unless-internal-enabled</echo>
- </target>
-
-
-
-</project>
--- a/buildframework/helium/sf/java/legacy/tests/src/com/nokia/ant/HeliumLoggerTest.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.ant;
-
-import junit.framework.TestCase;
-
-/**
- * Test class for Helium Logger.
- *
- */
-public class HeliumLoggerTest extends TestCase {
-
- /**
- * Basic test to check if the property
- * is set correctly.
- */
- public void testSetStopLogToConsole() {
- HeliumLogger logger = new HeliumLogger();
- logger.setStopLogToConsole(true);
- assert logger.getStopLogToConsole();
- }
-}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -28,8 +28,9 @@
<taskdef name="taskRecorder" classname="com.nokia.helium.logger.ant.taskdefs.TaskRecorder"/>
<!-- Type definition -->
- <typedef name="stagerecord" classname="com.nokia.helium.logger.ant.types.StageLogging"/>
+ <typedef name="stagerecord" classname="com.nokia.helium.logger.ant.types.StageRecord"/>
<typedef name="stagesummary" classname="com.nokia.helium.logger.ant.types.StageSummary"/>
<typedef name="recordfilterset" classname="com.nokia.helium.logger.ant.types.RecordFilterSet"/>
+ <typedef name="stagerecorderlistener" classname="com.nokia.helium.logger.ant.listener.AntLoggingHandler"/>
</antlib>
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/AntLoggingHandler.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/AntLoggingHandler.java Mon Oct 18 10:23:52 2010 +0100
@@ -19,198 +19,303 @@
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Date;
-import java.util.HashMap;
import java.util.Hashtable;
+import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Vector;
-import java.util.Map.Entry;
+import java.util.regex.Pattern;
-import org.apache.log4j.Logger;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Target;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.types.LogLevel;
+import org.apache.tools.ant.types.DataType;
import com.nokia.helium.core.ant.types.Stage;
-import com.nokia.helium.logger.ant.types.StageLogging;
+import com.nokia.helium.logger.ant.types.StageRecord;
+
/**
* Ant logging class for each Stage.
*
*
*/
-public class AntLoggingHandler implements Handler {
- private static Hashtable<File, RecorderEntry> recorderEntries = new Hashtable<File, RecorderEntry>();
- private static HashMap<File, Boolean> fileCreatedMap = new HashMap<File, Boolean>();
- private static boolean isDefaultStageStarted;
- private Map<String, Stage> stagesMapping;
- private Map<String, StageLogging> stageRecordMap;
- private HashMap<String, Vector<Target>> depStartTargetMap;
- private HashMap<String, Target> stageStartTargetMap;
- private boolean isStageRecordingHappening;
- private boolean loggingStarted;
- private int loglevel = -1;
- private VerbosityLevelChoices antLogLevel;
- private Logger log = Logger.getLogger(AntLoggingHandler.class);
- private String currentStageName;
- private Project project;
+public class AntLoggingHandler extends DataType implements BuildEventHandler, TargetEventHandler, SubBuildEventHandler, CommonListenerRegister {
+ private Map<String, RecorderEntry> recorderEntries = new Hashtable<String, RecorderEntry>();
+ private Map<String, Stage> stageStartTargets = new Hashtable<String, Stage>();
+ private Map<String, Stage> stageEndTargets = new Hashtable<String, Stage>();
+ private RecorderEntry defaultRecorderEntry;
+ private RecorderEntry currentRecorderEntry;
+ private Stage currentStage;
+ private CommonListener commonListener;
+ private boolean record;
+ private List<Project> recordExclusions = new ArrayList<Project>();
+
+ @SuppressWarnings("unchecked")
+ public void register(CommonListener commonListener) {
+ this.commonListener = commonListener;
+ Map<String, Object> references = (Map<String, Object>)commonListener.getProject().getReferences();
+ for (Map.Entry<String, Object> entry : references.entrySet()) {
+ if (entry.getValue() instanceof StageRecord) {
+ StageRecord stageRecord = (StageRecord)entry.getValue();
+ if (stageRecord.getDefaultOutput() != null) {
+ if (defaultRecorderEntry == null) {
+ RecorderEntry recorderEntry = new RecorderEntry(stageRecord.getDefaultOutput());
+ recorderEntry.setMessageOutputLevel(stageRecord.getLogLevel());
+ recorderEntry.setEmacsMode(false);
+ recorderEntry.setRecordState(false);
+ defaultRecorderEntry = recorderEntry;
+ } else {
+ log("There must be only one default stagerecord datatype.");
+ }
+ } else if (stageRecord.getStageRefID() != null) {
+ if (references.containsKey(stageRecord.getStageRefID())) {
+ if (references.get(stageRecord.getStageRefID()) instanceof Stage) {
+ // Check the stage
+ Stage stage = (Stage)references.get(stageRecord.getStageRefID());
+ validateStageInformation(stageRecord.getStageRefID(), stage);
+ log("Found stage [" + stageRecord.getStageRefID() + "] for recording", Project.MSG_DEBUG);
+ // check the stage logging.
+ validateStageRecorder(entry.getKey(), stageRecord);
+ String startTarget = stage.getStartTarget();
+ if (getProject().getTargets().containsKey(stage.getStartTarget())) {
+ Vector<Target> targets = getProject().topoSort(stage.getStartTarget(), getProject().getTargets(), false);
+ if (targets.size() != 0) {
+ startTarget = targets.firstElement().getName();
+ }
+ }
- /**
- * AntLoggingHandler constructor.
- *
- * @param proj
- */
- public AntLoggingHandler(Project proj) {
- project = proj;
- antLogLevel = new VerbosityLevelChoices();
- stagesMapping = new HashMap<String, Stage>();
- stageRecordMap = new HashMap<String, StageLogging>();
- depStartTargetMap = new HashMap<String, Vector<Target>>();
- stageStartTargetMap = new HashMap<String, Target>();
- initialize(project);
+ if (stageRecord.getOutput().exists()) {
+ long timestamp = System.currentTimeMillis();
+ log("Backing up of " + stageRecord.getOutput() + " into " + stageRecord.getOutput() + "."
+ + timestamp);
+ stageRecord.getOutput().renameTo(new File(stageRecord.getOutput().getAbsoluteFile() + "." + timestamp));
+ }
+
+ RecorderEntry recorderEntry = new RecorderEntry(stageRecord.getOutput());
+ recorderEntry.setMessageOutputLevel(stageRecord.getLogLevel());
+ recorderEntry.setEmacsMode(false);
+ recorderEntry.setRecordState(false);
+
+ // Make sure we cleanup the file now if needed.
+ if (stageRecord.getOutput().exists()) {
+ recorderEntry.openFile(stageRecord.getAppend());
+ recorderEntry.closeFile();
+ }
+
+ // Then add everything to the internal configuration
+ stageStartTargets.put(startTarget, stage);
+ stageEndTargets.put(stage.getEndTarget(), stage);
+ recorderEntries.put(stageRecord.getStageRefID(), recorderEntry);
+ } else {
+ throw new BuildException("Invalid stagerecord stageRefId attribute value, " +
+ "the '" + stageRecord.getStageRefID() + "' id doesn't refer to a stage type at " +
+ stageRecord.getLocation().toString());
+
+ }
+ } else {
+ throw new BuildException("Invalid stagerecord stageRefId attribute value, " +
+ "the '" + stageRecord.getStageRefID() + "' id doesn't exist at " +
+ stageRecord.getLocation().toString());
+ }
+ } else {
+ throw new BuildException("Invalid stagerecord configuration, " +
+ "the stageRefId attribute is not defined at " +
+ stageRecord.getLocation().toString());
+ }
+ }
+ }
+ if (defaultRecorderEntry != null) {
+ log("Registering the logging framework.", Project.MSG_DEBUG);
+ currentRecorderEntry = defaultRecorderEntry;
+ commonListener.register(this);
+ } else {
+ log("There must be one default stagerecord datatype. Logging framework will be disabled.");
+ }
+ }
+
+ private void validateStageInformation(String stageKey, Stage stage) {
+ if (stage.getStartTarget() == null) {
+ throw new BuildException("'starttarget' for stage '" + stageKey
+ + "' should not be null.");
+ }
+ if (stage.getEndTarget() == null) {
+ throw new BuildException("'endtarget' for stage '" + stageKey + "' should not be null.");
+ }
}
/**
- * Return the project associated to this Handler.
+ * To validate each stagelogging data type.
*
- * @return a project instance
+ * @param stagerefid
+ * @param stageLogging
+ */
+ private void validateStageRecorder(String stagerefid, StageRecord stageRecorder) {
+ if (stageRecorder.getOutput() == null) {
+ throw new BuildException("'output' attribute for stagelogging '" + stagerefid
+ + "' should not be null.");
+ }
+ }
+
+ /**
+ * A new stage is starting. Stop current log, then start stage specific log recording.
+ * @param target
+ * @param stage
*/
- public Project getProject() {
- return project;
+ protected void startStage(Target target, Stage stage) {
+ if (record && currentRecorderEntry != null) {
+ currentRecorderEntry.addLogMessage("Stop logging into " + currentRecorderEntry.getFilename() + " at " + getDateTime());
+ currentRecorderEntry.setRecordState(false);
+ currentRecorderEntry.closeFile();
+ commonListener.unRegister(currentRecorderEntry);
+ }
+ currentRecorderEntry = recorderEntries.get(stage.getStageName());
+ if (currentRecorderEntry == null) {
+ currentRecorderEntry = this.defaultRecorderEntry;
+ }
+ if (record) {
+ defaultRecorderEntry.reopenFile();
+ defaultRecorderEntry.addLogMessage("Start logging stage " + stage.getStageName() + " into " + currentRecorderEntry.getFilename() + " at " + getDateTime());
+ defaultRecorderEntry.closeFile();
+
+ currentRecorderEntry.reopenFile();
+ currentRecorderEntry.setRecordState(true);
+ currentRecorderEntry.addLogMessage("Start logging into " + currentRecorderEntry.getFilename() + " at " + getDateTime());
+ commonListener.register(currentRecorderEntry);
+ }
}
-
+
+ /**
+ * Current stage is ending. Stop recording current stage, and then switch to
+ * default log.
+ * @param target
+ * @param stage
+ */
+ protected void endStage(Target target, Stage stage) {
+ if (record && currentRecorderEntry != null) {
+ currentRecorderEntry.addLogMessage("Stop logging into " + currentRecorderEntry.getFilename() + " at " + getDateTime());
+ currentRecorderEntry.setRecordState(false);
+ currentRecorderEntry.closeFile();
+ commonListener.unRegister(currentRecorderEntry);
+ }
+ currentRecorderEntry = defaultRecorderEntry;
+ if (record) {
+ currentRecorderEntry.reopenFile();
+ currentRecorderEntry.setRecordState(true);
+ currentRecorderEntry.addLogMessage("Start logging into " + currentRecorderEntry.getFilename() + " at " + getDateTime());
+ commonListener.register(currentRecorderEntry);
+ }
+ }
+
/**
* {@inheritDoc}
*/
- public void handleTargetFinished(BuildEvent event) {
- // log.debug("Finished target [" + event.getTarget().getName() + "]");
- if (isEndTarget(event.getTarget().getName()) && getIsStageRecordingHappening()
- && (getLoggingStarted())) {
- log.debug("Stopping stage logging for [" + currentStageName + "] for target ["
- + event.getTarget().getName() + "]");
- stopLog(currentStageName, "default");
- if (!isDefaultStageStarted) {
- startLog("default");
- isDefaultStageStarted = true;
+ @Override
+ public synchronized void targetStarted(BuildEvent event) {
+ if (stageStartTargets.containsKey(event.getTarget().getName())) {
+ if (this.currentStage != null) {
+ endStage(event.getTarget(), currentStage);
}
- currentStageName = null;
+ currentStage = stageStartTargets.get(event.getTarget().getName());
+ startStage(event.getTarget(), currentStage);
}
}
/**
* {@inheritDoc}
*/
- public void handleTargetStarted(BuildEvent event) {
-
- // log.debug("Started target [" + event.getTarget().getName() + "]");
-
- if (getLoggingStarted() && !isDefaultStageStarted) {
- startLog("default");
- isDefaultStageStarted = true;
- }
-
- if (currentStageName == null && !getIsStageRecordingHappening() && getLoggingStarted()) {
- String stageName = isStageValid(event.getTarget(), event.getProject());
- if (stageName != null) {
- log.debug("Started stage logging for [" + stageName + "] for target ["
- + event.getTarget().getName() + "]");
-
- if (isDefaultStageStarted) {
- stopLog("default", stageName);
- isDefaultStageStarted = false;
- }
- startLog(stageName);
- currentStageName = stageName;
- }
+ @Override
+ public synchronized void targetFinished(BuildEvent event) {
+ if (currentStage != null && currentStage.getEndTarget().equals(event.getTarget().getName())) {
+ endStage(event.getTarget(), currentStage);
+ currentStage = null;
}
}
/**
* {@inheritDoc}
*/
- public void handleBuildStarted(BuildEvent event) {
- // Nothing to do
+ @Override
+ public void buildStarted(BuildEvent event) {
}
/**
* {@inheritDoc}
*/
- public void handleBuildFinished(BuildEvent event) {
-
- /*
- * If any stage logging is happening stop logging into stage log file and switch to
- * main/default ant log file.
- */
- if (getLoggingStarted() && getIsStageRecordingHappening()) {
- stopLog(currentStageName, "default");
- if (!isDefaultStageStarted) {
- startLog("default");
- isDefaultStageStarted = true;
- }
- currentStageName = null;
+ @Override
+ public synchronized void buildFinished(BuildEvent event) {
+ if (currentRecorderEntry != defaultRecorderEntry) {
+ currentRecorderEntry.addLogMessage("Stop logging into " + currentRecorderEntry.getFilename() + " at " + getDateTime());
+ currentRecorderEntry.setRecordState(false);
+ currentRecorderEntry.closeFile();
+ commonListener.unRegister(currentRecorderEntry);
+ currentRecorderEntry = defaultRecorderEntry;
}
-
- /*
- * If default stage logging happening stop logging into default ant log file.
- */
- if (isDefaultStageStarted && getLoggingStarted()) {
- stopLog("default", null, event);
- isDefaultStageStarted = false;
- }
- this.cleanup();
+ defaultRecorderEntry.reopenFile();
+ defaultRecorderEntry.setRecordState(true);
+ defaultRecorderEntry.addLogMessage("Start logging into " + defaultRecorderEntry.getFilename() + " at " + getDateTime());
+ defaultRecorderEntry.buildFinished(event);
+ defaultRecorderEntry.setRecordState(false);
+ defaultRecorderEntry.closeFile();
+ record = false;
}
/**
- * Returns recorder entry for logging current build process.
- *
- * @param name
- * @param proj
- * @return
+ * Define if the stage logging should be recording of not.
+ * @param record
*/
- protected RecorderEntry getRecorder(File name) {
- RecorderEntry entry = recorderEntries.get(name);
- if (entry == null) {
- // create a recorder entry
- entry = new RecorderEntry(name);
- recorderEntries.put(name, entry);
+ public synchronized void setRecordState(boolean record) {
+ this.record = record;
+ if (record) {
+ currentRecorderEntry.reopenFile();
+ currentRecorderEntry.setRecordState(true);
+ this.commonListener.register(this.currentRecorderEntry);
+ } else {
+ currentRecorderEntry.setRecordState(false);
+ this.commonListener.unRegister(this.currentRecorderEntry);
+ currentRecorderEntry.closeFile();
}
- return entry;
+ }
+
+ /**
+ * Adding a regular expression
+ * @param pattern
+ */
+ public void addRegexp(Pattern pattern) {
+ if (pattern != null) {
+ for (Entry<String, RecorderEntry> entry : recorderEntries.entrySet()) {
+ RecorderEntry recorderEntry = entry.getValue();
+ recorderEntry.addRegexp(pattern);
+ }
+ }
}
/**
- * Sets the level to which this recorder entry should log to.
- *
- * @param level the level to set.
- * @see VerbosityLevelChoices
+ * Prunning a project/subproject from stage logger recording scope.
+ * @param project
*/
- public void setLoglevel(VerbosityLevelChoices level) {
- loglevel = level.getLevel();
+ public synchronized void addRecordExclusion(Project project) {
+ if (!recordExclusions.contains(project)) {
+ recordExclusions.add(project);
+ if (currentRecorderEntry != null) {
+ currentRecorderEntry.setExcludedProject(recordExclusions);
+ }
+ }
}
/**
- * A list of possible values for the <code>setLoglevel()</code> method. Possible values include:
- * error, warn, info, verbose, debug.
- */
- public static class VerbosityLevelChoices extends LogLevel {
- }
-
- /**
- * To clean recorder entries.
+ * Allow an external task to add again a project into recording scope.
+ * @param project
*/
- private void cleanup() {
- log.debug("Cleaning up recorder entries of stagerecord");
- recorderEntries.clear();
- fileCreatedMap.clear();
-
+ public synchronized void removeRecordExclusion(Project project) {
+ recordExclusions.remove(project);
}
-
+
/**
- * To get current date and time.
- *
- * @return
+ * Get formated date and time
*/
private String getDateTime() {
DateFormat dateFormat = new SimpleDateFormat("EE yyyy/MM/dd HH:mm:ss:SS aaa");
@@ -219,446 +324,17 @@
}
/**
- * To get the current stage running.
- *
- * @return
- */
- public String getCurrentStageName() {
- return this.currentStageName;
- }
-
- /**
- * To do the logging actions depending on hlm:record actions.
- *
- * @param stageName
- * @param action
- * @param message
- * @param task
- */
- public void doLoggingAction(String stageName, boolean action, String message, Task task,
- Target target) {
- String time = getDateTime();
- File fileName;
- if (stageName.equalsIgnoreCase("default")) {
- if (stageRecordMap.get("default") == null) {
- throw new BuildException("stageRecordMap.get('default') is null");
- }
- fileName = stageRecordMap.get("default").getDefaultOutput();
- } else {
- fileName = stageRecordMap.get(stageName).getOutput();
- }
-
- if (fileName.exists()) {
- for (Map.Entry<File, RecorderEntry> entry : recorderEntries.entrySet()) {
- if (fileName.equals(entry.getKey()) && (getRecorderEntry(fileName) != null)
- && (fileCreatedMap.get(fileName))) {
- RecorderEntry recorderEntry = getRecorderEntry(fileName);
- recorderEntry.addLogMessage(message + " logging into " + fileName + " from "
- + task.getTaskName() + " task at " + time);
- log.debug(message + " logging into " + fileName + " from " + task.getTaskName()
- + " task at " + time);
- recorderEntry.setRecordState(action);
- break;
- }
- }
- }
- }
-
- /**
- * Called by LogReplace task to find and replace any property values which are not updated.
- *
- * @param regExp
- */
- public void addRegExp(String regExp) {
- if (!regExp.equals("")) {
- for (Map.Entry<File, RecorderEntry> entry : recorderEntries.entrySet()) {
- RecorderEntry recorderEntry = entry.getValue();
- recorderEntry.addRegexp(regExp);
- }
- }
- }
-
- /**
- * Initializing stage logging data.
- * Gathering all stagerecord.
- *
- * @param project
+ * {@inheritDoc}
*/
- @SuppressWarnings("unchecked")
- private void initialize(Project project) {
- Map<String, Object> references = (Hashtable<String, Object>)project.getReferences();
- //matchStageName(references, stageKey);
- for (Entry<String, Object> entry : references.entrySet()) {
- if (entry.getValue() instanceof StageLogging) {
- StageLogging tempStageLogging = (StageLogging)entry.getValue();
- // Is the stagerecord having a defaultoutput attribute,
- // if yes, it is the default recorder.
- if (tempStageLogging.getDefaultOutput() != null) {
- stageRecordMap.put("default", tempStageLogging);
- registerRecorderEntry(tempStageLogging.getDefaultOutput(), tempStageLogging, StatusAndLogListener.getStatusAndLogListener().getProject());
- } else if (tempStageLogging.getStageRefID() != null) {
- if (references.containsKey(tempStageLogging.getStageRefID())) {
- if (references.get(tempStageLogging.getStageRefID()) instanceof Stage) {
- // Check the stage
- Stage stage = (Stage)references.get(tempStageLogging.getStageRefID());
- validateStageInformation(tempStageLogging.getStageRefID(), stage);
- log.debug("Found stage [" + tempStageLogging.getStageRefID() + "] for recording");
- stagesMapping.put(tempStageLogging.getStageRefID(), stage);
- // check the stage logging.
- validateStageLogging(entry.getKey(), tempStageLogging);
- stageRecordMap.put(tempStageLogging.getStageRefID(), tempStageLogging);
- } else {
- throw new BuildException("Invalid stagerecord stageRefId attribute value, " +
- "the '" + tempStageLogging.getStageRefID() + "' id doesn't refer to a stage type at " +
- tempStageLogging.getLocation().toString());
-
- }
- } else {
- throw new BuildException("Invalid stagerecord stageRefId attribute value, " +
- "the '" + tempStageLogging.getStageRefID() + "' id doesn't exist at " +
- tempStageLogging.getLocation().toString());
- }
- } else {
- throw new BuildException("Invalid stagerecord configuration, " +
- "the stageRefId attribute is not defined at " +
- tempStageLogging.getLocation().toString());
- }
- }
- }
- if (!stageRecordMap.containsKey("default")) {
- throw new BuildException("There must be one default stagerecord datatype.");
- }
- }
-
- /**
- * To start logging for respective stage.
- *
- * @param stageName
- */
- private void startLog(String stageName) {
- File fileName;
- String message;
- String time = getDateTime();
- StageLogging stageLogging = null;
- log.debug("Starting logging for [" + stageName + "]");
- if (stageName.equals("default")) {
- fileName = stageRecordMap.get("default").getDefaultOutput();
- stageLogging = stageRecordMap.get("default");
- message = "Starting logging into " + fileName + " at " + time;
- }
- else {
- fileName = stageRecordMap.get(stageName).getOutput();
- stageLogging = stageRecordMap.get(stageName);
- this.isStageRecordingHappening = true;
- message = "Starting logging for " + stageName + " into " + fileName + " at " + time;
- }
- if (getRecorderEntry(fileName) != null) {
- RecorderEntry recorderEntry = getRecorderEntry(fileName);
- if (isFilePresent(recorderEntry, fileName, stageLogging)) {
- recorderEntry.setRecordState(true);
- recorderEntry.addLogMessage(message);
- }
- }
- }
-
- /**
- * To check is the file created.
- *
- * @param recorderEntry
- * @param fileName
- * @param stageLogging
- * @return
- */
- private boolean isFilePresent(RecorderEntry recorderEntry, File fileName,
- StageLogging stageLogging) {
- log.debug("isFilePresent? " + fileName);
- if (!fileCreatedMap.get(fileName)) {
- if (!fileName.getParentFile().exists()) {
- log.debug("Creating dir: " + fileName.getParentFile());
- fileName.getParentFile().mkdirs();
- }
- if (fileName.exists()) {
- long timestamp = System.currentTimeMillis();
- getProject().log("Backing up of " + fileName + " into " + fileName + "."
- + timestamp);
- fileName.renameTo(new File(fileName.getAbsoluteFile() + "." + timestamp));
- }
- recorderEntry.openFile(stageLogging.getAppend());
- fileCreatedMap.put(fileName, true);
- return true;
- }
- else {
- return true;
- }
-
- }
-
- /**
- * To stop logging for respective stage.
- *
- * @param stopStageName
- * @param startStageName
- */
- private void stopLog(String stopStageName, String startStageName) {
- stopLog(stopStageName, startStageName, null);
+ @Override
+ public void subBuildFinished(BuildEvent event) {
+ removeRecordExclusion(event.getProject());
}
/**
- * To stop logging for respective stage.
- *
- * @param stopStageName
- * @param startStageName
- * @param event
- */
- private void stopLog(String stopStageName, String startStageName, BuildEvent event) {
- File fileName;
- String message;
- String time = getDateTime();
- log.debug("Stopping logging for [" + stopStageName + "]");
- if (stopStageName.equals("default")) {
- fileName = stageRecordMap.get("default").getDefaultOutput();
- message = "Stopping logging into " + fileName + " at " + time;
- if (startStageName != null) {
- message = message + "\nStarting logging into "
- + stageRecordMap.get(startStageName).getOutput();
- }
- }
- else {
- fileName = stageRecordMap.get(stopStageName).getOutput();
- this.isStageRecordingHappening = false;
- message = "Stopping logging for " + stopStageName + " into " + fileName + " at " + time;
- if (startStageName != null) {
- message = message + "\nResuming logging into "
- + stageRecordMap.get("default").getDefaultOutput();
- }
- }
- if (getRecorderEntry(fileName) != null) {
- RecorderEntry recorderEntry = getRecorderEntry(fileName);
- if (event != null) {
- recorderEntry.handleBuildFinished(event);
- } else {
- recorderEntry.addLogMessage(message);
- recorderEntry.setRecordState(false);
- }
- }
- }
-
- /**
- * To register into recorder entry.
- *
- * @param fileName
- * @param stageLogging
- * @param proj
+ * {@inheritDoc}
*/
- private void registerRecorderEntry(File fileName, StageLogging stageLogging, Project proj) {
- log.debug("Registering recorderentry for log file [" + fileName + "]");
- RecorderEntry recorderEntry = getRecorder(fileName);
- antLogLevel.setValue(stageLogging.getLogLevel());
- this.setLoglevel(antLogLevel);
- recorderEntry.setMessageOutputLevel(loglevel);
- recorderEntry.setEmacsMode(false);
- recorderEntry.setRecordState(false);
- if (fileCreatedMap.get(fileName) == null) {
- fileCreatedMap.put(fileName, false);
- }
- }
-
- /**
- * To check is the stage valid for given start and end targets.
- *
- * @param target
- * @param proj
- * @return
- */
- private String isStageValid(Target target, Project proj) {
- // if
- // (!proj.getName().equals(StatusAndLogListener.getStatusAndLogListener().getProject().getName())
- // && (StatusAndLogListener.getStatusAndLogListener().getProject().getName() != null)) {
- initSubProjectDependentTarget(proj);
- // }
- for (Map.Entry<String, Stage> entry : stagesMapping.entrySet()) {
- Stage stage = entry.getValue();
- if (stage.getStartTarget().equals(target.getName())
- && validateStageTargets(proj, stage.getStartTarget(), stage.getEndTarget())) {
- log.debug("Found stage [" + entry.getKey() + "] for target [" + target.getName()
- + "]");
- return entry.getKey();
- }
- if (stageStartTargetMap.get(entry.getKey()) != null) {
- if (stageStartTargetMap.get(entry.getKey()).getName().equals(target.getName())) {
- log.debug("Found stage [" + entry.getKey() + "] for dependent target ["
- + target.getName() + "]");
- return entry.getKey();
- }
- }
- else if (isDependentTarget(target, entry.getKey())) {
- log.debug("Found stage [" + entry.getKey() + "] for dependent target ["
- + target.getName() + "]");
- return entry.getKey();
- }
- }
- return null;
- }
-
- /**
- * To check, is the given target is end target for any stages.
- *
- * @param targetName
- * @return
- */
-
- private boolean isEndTarget(String targetName) {
- if (stagesMapping.get(currentStageName) != null) {
- return stagesMapping.get(currentStageName).getEndTarget().equals(targetName);
- }
- return false;
- }
-
- /**
- * To validate is the endtarget and starttarget are present in the current project.
- *
- * @param proj
- * @param startTarget
- * @param endTarget
- * @return
- */
-
- @SuppressWarnings("unchecked")
- private boolean validateStageTargets(Project proj, String startTarget, String endTarget) {
-
- Hashtable<String, String> antTargets = proj.getTargets();
- return antTargets.containsKey(startTarget) && antTargets.containsKey(endTarget);
+ @Override
+ public void subBuildStarted(BuildEvent event) {
}
-
- /**
- * To check is recording is happening for any stages.
- *
- * @return
- */
- private boolean getIsStageRecordingHappening() {
- return this.isStageRecordingHappening;
- }
-
- /**
- * Is the given target is dependent target to start the stage.
- *
- * @param target
- * @param stageName
- * @return
- */
- private boolean isDependentTarget(Target target, String stageName) {
-
- if (depStartTargetMap.get(stageName) != null) {
- for (Target depTarget : depStartTargetMap.get(stageName)) {
- if (depTarget.getName().equals(target.getName())) {
- depStartTargetMap.remove(stageName);
- stageStartTargetMap.put(stageName, depTarget);
- return true;
- }
- }
- }
-
- return false;
- }
-
- /**
- * To initialize the dependent target and stages mapping.
- *
- * @param proj
- * @param stageKey
- * @param startTarget
- * @param endTarget
- */
- @SuppressWarnings("unchecked")
- private void initDependentTargetMap(Project proj, String stageKey, String startTarget,
- String endTarget) {
- Vector<Target> arrayList = null;
- if (validateStageTargets(proj, startTarget, endTarget)) {
- arrayList = proj.topoSort(startTarget, proj.getTargets(), false);
- log.debug("Target dependency for " + startTarget);
- for (Target target : arrayList) {
- log.debug(" Start Target : " + target.getName());
- }
- if (arrayList != null && arrayList.size() > 1) {
- depStartTargetMap.put(stageKey, arrayList);
- }
- }
-
- }
-
- /**
- * To init dependent targets for subproject.
- *
- * @param proj
- */
- private void initSubProjectDependentTarget(Project proj) {
-
- for (Map.Entry<String, Stage> entry : stagesMapping.entrySet()) {
- if (depStartTargetMap.get(entry.getKey()) == null) {
- initDependentTargetMap(proj, entry.getKey(), entry.getValue().getStartTarget(), entry.getValue().getEndTarget());
- }
- }
- }
-
- /**
- * To validate stage information.
- *
- * @param stageKey
- * @param stage
- */
- private void validateStageInformation(String stageKey, Stage stage) {
-
- if (stage.getStartTarget() == null) {
- throw new BuildException("'starttarget' for stage '" + stageKey
- + "' should not be null.");
- }
-
- if (stage.getEndTarget() == null) {
- throw new BuildException("'endtarget' for stage '" + stageKey + "' should not be null.");
- }
- }
-
- /**
- * To validate each stagelogging data type.
- *
- * @param stagerefid
- * @param stageLogging
- */
- private void validateStageLogging(String stagerefid, StageLogging stageLogging) {
-
- if (stageLogging.getOutput() == null) {
- throw new BuildException("'output' attribute for stagelogging '" + stagerefid
- + "' should not be null.");
- }
- registerRecorderEntry(stageLogging.getOutput(), stageLogging, StatusAndLogListener.getStatusAndLogListener().getProject());
- }
-
- /**
- * To retrun recorderEntry of respective file.
- *
- * @param filename
- * @return
- */
- private RecorderEntry getRecorderEntry(File filename) {
- return recorderEntries.get(filename);
- }
-
- /**
- * Is recording started.
- *
- * @return
- */
- public boolean getLoggingStarted() {
- return loggingStarted;
- }
-
- /**
- * Set to recording started.
- *
- * @param loggingStarted
- */
- public void setLoggingStarted(boolean loggingStarted) {
- this.loggingStarted = loggingStarted;
- }
-
-}
+}
\ No newline at end of file
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/BuildEventHandler.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/BuildEventHandler.java Mon Oct 18 10:23:52 2010 +0100
@@ -31,13 +31,13 @@
*
* @param event is the build event to be handled.
*/
- void handleBuildStarted( BuildEvent event );
+ void buildStarted( BuildEvent event );
/**
* Method to handle build finish events.
*
* @param event is the build event to be handled.
*/
- void handleBuildFinished( BuildEvent event );
+ void buildFinished( BuildEvent event );
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/CommonListener.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.logger.ant.listener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.SubBuildListener;
+
+/**
+ * <code>CommonListener</code> implements {@link BuildListener} and listens to build events in
+ * particularly for activities such as ant logging and displaying build stage summary at the end of
+ * build process.
+ *
+ */
+public class CommonListener implements BuildListener, SubBuildListener {
+ private static CommonListener self;
+ private boolean initialized;
+
+ private List<BuildEventHandler> buildHandlers = new ArrayList<BuildEventHandler>();
+ private List<TargetEventHandler> targetHandlers = new ArrayList<TargetEventHandler>();
+ private List<TaskEventHandler> taskHandlers = new ArrayList<TaskEventHandler>();
+ private List<MessageEventHandler> messageHandlers = new ArrayList<MessageEventHandler>();
+ private List<SubBuildEventHandler> subBuildHandlers = new ArrayList<SubBuildEventHandler>();
+ private Project project;
+
+ /**
+ * Default constructor
+ */
+ public CommonListener() {
+ // Declaring ourself globally.
+ self = this;
+ }
+
+ /**
+ * Signals that the last target has finished. This event will still be fired if an error
+ * occurred during the build.
+ *
+ * @param event An event with any relevant extra information. Must not be <code>null</code>.
+ *
+ * @see BuildEvent#getException()
+ */
+ public synchronized void buildStarted(BuildEvent event) {
+ project = event.getProject();
+ for (BuildEventHandler handler : buildHandlers) {
+ handler.buildStarted(event);
+ }
+ }
+
+ /**
+ * Signals that a build has started. This event is fired before any targets have started.
+ *
+ * @param event An event with any relevant extra information. Must not be <code>null</code>.
+ */
+ public synchronized void buildFinished(BuildEvent event) {
+ for (BuildEventHandler handler : buildHandlers) {
+ handler.buildFinished(event);
+ }
+ }
+
+ /**
+ * Signals that a target is starting.
+ *
+ * @param event An event with any relevant extra information. Must not be <code>null</code>.
+ *
+ * @see BuildEvent#getTarget()
+ */
+ public synchronized void targetStarted(BuildEvent event) {
+ if (!initialized) {
+ // Let's introspect current project for registarable objects
+ for (Object entry : getProject().getReferences().values()) {
+ if (entry instanceof CommonListenerRegister) {
+ ((CommonListenerRegister) entry).register(this);
+ if (entry instanceof BuildEventHandler) {
+ ((BuildEventHandler)entry).buildStarted(new BuildEvent(getProject()));
+ }
+ }
+ }
+ initialized = true;
+ }
+ for (TargetEventHandler handler : targetHandlers) {
+ handler.targetStarted(event);
+ }
+ }
+
+ /**
+ * Signals that a target has finished. This event will still be fired if an error occurred
+ * during the build.
+ *
+ * @param event An event with any relevant extra information. Must not be <code>null</code>.
+ *
+ * @see BuildEvent#getException()
+ */
+ public synchronized void targetFinished(BuildEvent event) {
+ for (TargetEventHandler handler : targetHandlers) {
+ handler.targetFinished(event);
+ }
+ }
+
+ /**
+ * Signals that a task is starting.
+ *
+ * @param event An event with any relevant extra information. Must not be <code>null</code>.
+ *
+ * @see BuildEvent#getTask()
+ */
+ public synchronized void taskStarted(BuildEvent event) {
+ for (TaskEventHandler handler : taskHandlers) {
+ handler.taskStarted(event);
+ }
+ }
+
+ /**
+ * Signals that a task has finished. This event will still be fired if an error occurred during
+ * the build.
+ *
+ * @param event An event with any relevant extra information. Must not be <code>null</code>.
+ *
+ * @see BuildEvent#getException()
+ */
+ public synchronized void taskFinished(BuildEvent event) {
+ for (TaskEventHandler handler : taskHandlers) {
+ handler.taskFinished(event);
+ }
+ }
+
+ /**
+ * Signals that a subbuild has started. This event is fired before any targets have started.
+ *
+ * @param event
+ */
+ public synchronized void subBuildStarted(BuildEvent event) {
+ for (SubBuildEventHandler handler : subBuildHandlers) {
+ handler.subBuildStarted(event);
+ }
+ }
+
+ /**
+ * Signals that the last target has finished. This event will still be fired if an error
+ * occurred during the build.
+ *
+ * @param event
+ */
+
+ public synchronized void subBuildFinished(BuildEvent event) {
+ for (SubBuildEventHandler handler : subBuildHandlers) {
+ handler.subBuildStarted(event);
+ }
+ }
+
+ /**
+ * Signals a message logging event.
+ *
+ * @param event An event with any relevant extra information. Must not be <code>null</code>.
+ *
+ * @see BuildEvent#getMessage()
+ * @see BuildEvent#getException()
+ * @see BuildEvent#getPriority()
+ */
+ public synchronized void messageLogged(BuildEvent event) {
+ for (MessageEventHandler handler : messageHandlers) {
+ handler.messageLogged(event);
+ }
+ }
+
+ /**
+ * Register the given handler.
+ *
+ * @param handler is the handler to register
+ */
+ public synchronized void register(Object handler) {
+ if (handler instanceof BuildEventHandler) {
+ // The duplication of the list prevents concurrent modification exception.
+ List<BuildEventHandler> temp = new ArrayList<BuildEventHandler>(buildHandlers);
+ temp.add((BuildEventHandler)handler);
+ buildHandlers = temp;
+ }
+ if (handler instanceof TargetEventHandler) {
+ List<TargetEventHandler> temp = new ArrayList<TargetEventHandler>(targetHandlers);
+ temp.add((TargetEventHandler)handler);
+ targetHandlers = temp;
+ }
+ if (handler instanceof TaskEventHandler) {
+ List<TaskEventHandler> temp = new ArrayList<TaskEventHandler>(taskHandlers);
+ temp.add((TaskEventHandler)handler);
+ taskHandlers = temp;
+ }
+ if (handler instanceof MessageEventHandler) {
+ List<MessageEventHandler> temp = new ArrayList<MessageEventHandler>(messageHandlers);
+ temp.add((MessageEventHandler)handler);
+ messageHandlers = temp;
+ }
+ }
+
+ /**
+ * Register the given handler.
+ *
+ * @param handler is the handler to register
+ */
+ public synchronized void unRegister(Object handler) {
+ if (handler instanceof BuildEventHandler) {
+ List<BuildEventHandler> temp = new ArrayList<BuildEventHandler>(buildHandlers);
+ temp.remove((BuildEventHandler)handler);
+ buildHandlers = temp;
+ }
+ if (handler instanceof TargetEventHandler) {
+ List<TargetEventHandler> temp = new ArrayList<TargetEventHandler>(targetHandlers);
+ temp.remove((TargetEventHandler)handler);
+ targetHandlers = temp;
+ }
+ if (handler instanceof TaskEventHandler) {
+ List<TaskEventHandler> temp = new ArrayList<TaskEventHandler>(taskHandlers);
+ temp.remove((TaskEventHandler)handler);
+ taskHandlers = temp;
+ }
+ if (handler instanceof MessageEventHandler) {
+ List<MessageEventHandler> temp = new ArrayList<MessageEventHandler>(messageHandlers);
+ temp.remove((MessageEventHandler)handler);
+ messageHandlers = temp;
+ }
+ }
+
+ /**
+ * Return root project.
+ *
+ * @return
+ */
+ public Project getProject() {
+ return project;
+ }
+
+ /**
+ * Get the main StatusAndLogListener.
+ *
+ * @return
+ */
+ public static CommonListener getCommonListener() {
+ return self;
+ }
+
+ /**
+ * Check and return required type handler.
+ *
+ * @param handlerType
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ public synchronized <T> T getHandler(Class<T> handlerType) {
+ for (BuildEventHandler handler : buildHandlers) {
+ if (handlerType.isInstance(handler)) {
+ return (T)handler;
+ }
+ }
+ for (TargetEventHandler handler : targetHandlers) {
+ if (handlerType.isInstance(handler)) {
+ return (T)handler;
+ }
+ }
+ for (TaskEventHandler handler : taskHandlers) {
+ if (handlerType.isInstance(handler)) {
+ return (T)handler;
+ }
+ }
+ for (MessageEventHandler handler : messageHandlers) {
+ if (handlerType.isInstance(handler)) {
+ return (T)handler;
+ }
+ }
+ for (SubBuildEventHandler handler : subBuildHandlers) {
+ if (handlerType.isInstance(handler)) {
+ return (T)handler;
+ }
+ }
+ return null;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/CommonListenerRegister.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.logger.ant.listener;
+
+/**
+ * This interface defines an Ant type to be
+ * able automatically registered by the CommonListener.
+ *
+ */
+public interface CommonListenerRegister {
+
+ /**
+ * This method is call by the CommonListener while discovering
+ * reference implementing this interface.
+ *
+ * @param commonListener the commonListener to register to.
+ */
+ void register(CommonListener commonListener);
+}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/Handler.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-package com.nokia.helium.logger.ant.listener;
-
-
-/**
- * <code>Handler</code> is an interface which is used to handle the build events
- * which are of importance for ant logging and build stage summary display.
- *
- *
- */
-public interface Handler extends BuildEventHandler, TargetEventHandler {
-
-
-
-}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/MessageEventHandler.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/MessageEventHandler.java Mon Oct 18 10:23:52 2010 +0100
@@ -29,6 +29,6 @@
* Method to handle SubBuild Started events.
* @param event
*/
- void handleMessageLogged( BuildEvent event );
+ void messageLogged(BuildEvent event);
}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/RecorderEntry.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/RecorderEntry.java Mon Oct 18 10:23:52 2010 +0100
@@ -1,30 +1,33 @@
/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Contributors:
- *
- * Description:
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
*
*/
+/* * Portion Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
+
package com.nokia.helium.logger.ant.listener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.apache.log4j.Logger;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DefaultLogger;
@@ -37,7 +40,7 @@
* @since Ant 1.4
*/
public class RecorderEntry implements BuildEventHandler, TargetEventHandler, TaskEventHandler,
- MessageEventHandler {
+ MessageEventHandler, SubBuildEventHandler {
/** The name of the file associated with this recorder entry. */
private File filename;
@@ -52,13 +55,16 @@
/** Strip task banners if true. */
private boolean emacsMode;
- private Pattern pattern;
+ // defines if this recorder entry should notify the stage logger about project to exclude from recording.
+ private boolean excludeSubProject;
+ private List<Project> excludedProjects = new ArrayList<Project>();
+ private List<Project> includedProjects = new ArrayList<Project>();
- private Vector<String> logRegExps = new Vector<String>();
- private Logger log = Logger.getLogger(getClass());
+ private List<Pattern> logRegExps = new ArrayList<Pattern>();
/**
- * @param name The name of this recorder (used as the filename).
+ * Create a RecorderEntry using a filename.
+ * @param name the filename of the log file.
*/
public RecorderEntry(File name) {
targetStartTime = System.currentTimeMillis();
@@ -66,6 +72,20 @@
}
/**
+ * New RecorderEntry using a filename and allow sub project exclusion.
+ * @param name the log filename
+ * @param excludeSubProject If true this recorder entry will notify
+ * the stage logger about projects to exclude
+ * from recording. If false, then only non-excluded
+ * project message will be handled.
+ */
+ public RecorderEntry(File name, boolean excludeSubProject) {
+ targetStartTime = System.currentTimeMillis();
+ filename = name;
+ this.excludeSubProject = true;
+ }
+
+ /**
* @return the name of the file the output is sent to.
*/
public File getFilename() {
@@ -96,8 +116,8 @@
*
* @param regexp
*/
- public void addRegexp(String regexp) {
- logRegExps.add(regexp);
+ public void addRegexp(Pattern pattern) {
+ logRegExps.add(pattern);
}
/**
@@ -111,7 +131,7 @@
* @see org.apache.tools.ant.BuildListener#buildStarted(BuildEvent)
*/
/** {@inheritDoc}. */
- public void handleBuildStarted(BuildEvent event) {
+ public void buildStarted(BuildEvent event) {
log("> BUILD STARTED", Project.MSG_DEBUG);
}
@@ -119,8 +139,8 @@
* @see org.apache.tools.ant.BuildListener#buildFinished(BuildEvent)
*/
/** {@inheritDoc}. */
- public void handleBuildFinished(BuildEvent event) {
- log.debug("< BUILD FINISHED");
+ public void buildFinished(BuildEvent event) {
+ log("< BUILD FINISHED", Project.MSG_DEBUG);
if (record && out != null) {
Throwable error = event.getException();
@@ -144,9 +164,16 @@
*
* @since Ant 1.6.2
*/
- public void handleSubBuildFinished(BuildEvent event) {
+ public void subBuildFinished(BuildEvent event) {
log("< SUBBUILD FINISHED", Project.MSG_DEBUG);
- // let's keep the logging ongoing, even if sub-build finishes.
+ if (excludeSubProject && CommonListener.getCommonListener() != null) {
+ AntLoggingHandler antLogger = CommonListener.getCommonListener().getHandler(AntLoggingHandler.class);
+ if (antLogger != null) {
+ antLogger.removeRecordExclusion(event.getProject());
+ }
+ }
+ excludedProjects.remove(event.getProject());
+ includedProjects.remove(event.getProject());
}
/**
@@ -156,73 +183,102 @@
*
* @since Ant 1.6.2
*/
- public void handleSubBuildStarted(BuildEvent event) {
+ public void subBuildStarted(BuildEvent event) {
log("< SUBBUILD STARTED", Project.MSG_DEBUG);
+ includedProjects.add(event.getProject());
+ if (excludeSubProject && CommonListener.getCommonListener() != null) {
+ AntLoggingHandler antLogger = CommonListener.getCommonListener().getHandler(AntLoggingHandler.class);
+ if (antLogger != null) {
+ antLogger.addRecordExclusion(event.getProject());
+ }
+ }
}
/**
* {@inheritDoc}
*/
- public void handleTargetStarted(BuildEvent event) {
- log(">> TARGET STARTED -- " + event.getTarget(), Project.MSG_DEBUG);
- log(StringUtils.LINE_SEP + event.getTarget().getName() + ":", Project.MSG_INFO);
+ public void targetStarted(BuildEvent event) {
+ if ((!excludeSubProject && !excludedProjects.contains(event.getTarget().getProject())) ||
+ (this.excludeSubProject && this.includedProjects.contains(event.getTarget().getProject()))) {
+ log(">> TARGET STARTED -- " + event.getTarget(), Project.MSG_DEBUG);
+ log(StringUtils.LINE_SEP + event.getTarget().getName() + ":", Project.MSG_INFO);
+ }
targetStartTime = System.currentTimeMillis();
}
/**
* {@inheritDoc}
*/
- public void handleTargetFinished(BuildEvent event) {
- log("<< TARGET FINISHED -- " + event.getTarget(), Project.MSG_DEBUG);
+ public void targetFinished(BuildEvent event) {
+ if ((!excludeSubProject && !excludedProjects.contains(event.getTarget().getProject())) ||
+ (this.excludeSubProject && this.includedProjects.contains(event.getTarget().getProject()))) {
+ log("<< TARGET FINISHED -- " + event.getTarget(), Project.MSG_DEBUG);
- String time = formatTime(System.currentTimeMillis() - targetStartTime);
+ String time = formatTime(System.currentTimeMillis() - targetStartTime);
- log(event.getTarget() + ": duration " + time, Project.MSG_VERBOSE);
- flush();
+ log(event.getTarget() + ": duration " + time, Project.MSG_VERBOSE);
+ flush();
+ }
}
/**
* @see org.apache.tools.ant.BuildListener#taskStarted(BuildEvent)
*/
/** {@inheritDoc}. */
- public void handleTaskStarted(BuildEvent event) {
- log(">>> TASK STARTED -- " + event.getTask(), Project.MSG_DEBUG);
+ public void taskStarted(BuildEvent event) {
+ if ((!excludeSubProject && !excludedProjects.contains(event.getTask().getProject())) ||
+ (this.excludeSubProject && this.includedProjects.contains(event.getTask().getProject()))) {
+ log(">>> TASK STARTED -- " + event.getTask(), Project.MSG_DEBUG);
+ }
}
/**
* @see org.apache.tools.ant.BuildListener#taskFinished(BuildEvent)
*/
/** {@inheritDoc}. */
- public void handleTaskFinished(BuildEvent event) {
- log("<<< TASK FINISHED -- " + event.getTask(), Project.MSG_DEBUG);
- flush();
+ public void taskFinished(BuildEvent event) {
+ if ((!excludeSubProject && !excludedProjects.contains(event.getTask().getProject())) ||
+ (this.excludeSubProject && this.includedProjects.contains(event.getTask().getProject()))) {
+ log("<<< TASK FINISHED -- " + event.getTask(), Project.MSG_DEBUG);
+ flush();
+ }
}
/**
* @see org.apache.tools.ant.BuildListener#messageLogged(BuildEvent)
*/
/** {@inheritDoc}. */
- public void handleMessageLogged(BuildEvent event) {
- log("--- MESSAGE LOGGED", Project.MSG_DEBUG);
+ public void messageLogged(BuildEvent event) {
+ Project project = event.getProject();
+ if (project == null && event.getTask() != null) {
+ project = event.getTask().getProject();
+ }
+ if (project == null && event.getTarget() != null) {
+ project = event.getTarget().getProject();
+ }
+ if ((!excludeSubProject && !excludedProjects.contains(project))
+ || (excludeSubProject && includedProjects.contains(project))) {
+ log("--- MESSAGE LOGGED", Project.MSG_DEBUG);
- StringBuffer buf = new StringBuffer();
-
- if (event.getTask() != null) {
- String name = event.getTask().getTaskName();
+ StringBuilder buf = new StringBuilder();
- if (!emacsMode) {
- String label = "[" + name + "] ";
- int size = DefaultLogger.LEFT_COLUMN_SIZE - label.length();
+ if (event.getTask() != null) {
+ String name = event.getTask().getTaskName();
- for (int i = 0; i < size; i++) {
- buf.append(" ");
+ if (!emacsMode) {
+ String label = "[" + name + "] ";
+ int size = DefaultLogger.LEFT_COLUMN_SIZE - label.length();
+
+ for (int i = 0; i < size; i++) {
+ buf.append(" ");
+ }
+ buf.append(label);
}
- buf.append(label);
}
+ String messgeToUpdate = filterMessage(event.getMessage());
+ buf.append(messgeToUpdate);
+ log(buf.toString(), event.getPriority());
}
- String messgeToUpdate = filterMessage(event.getMessage());
- buf.append(messgeToUpdate);
- log(buf.toString(), event.getPriority());
}
/**
@@ -232,12 +288,9 @@
* @return
*/
private String filterMessage(String message) {
- for (String regExp : logRegExps) {
- pattern = Pattern.compile(regExp);
- if (pattern != null) {
- Matcher match = pattern.matcher(message);
- message = match.replaceAll("********");
- }
+ for (Pattern pattern : logRegExps) {
+ Matcher match = pattern.matcher(message);
+ message = match.replaceAll("********");
}
return message;
}
@@ -311,38 +364,6 @@
}
/**
- * Registering ourselves to the StatusAndLogListener.
- */
- public void register() {
- StatusAndLogListener listener = StatusAndLogListener.getStatusAndLogListener();
- if (listener != null) {
- this.log.debug("register");
- synchronized (listener) {
- listener.register((BuildEventHandler) this);
- listener.register((TargetEventHandler) this);
- listener.register((TaskEventHandler) this);
- listener.register((MessageEventHandler) this);
- }
- }
- }
-
- /**
- * Unregistering ourselves from the StatusAndLogListener.
- */
- public void unregister() {
- StatusAndLogListener listener = StatusAndLogListener.getStatusAndLogListener();
- if (listener != null) {
- this.log.debug("unregister");
- synchronized (listener) {
- listener.remove((MessageEventHandler) this);
- listener.remove((TaskEventHandler) this);
- listener.remove((TargetEventHandler) this);
- listener.remove((BuildEventHandler) this);
- }
- }
- }
-
- /**
* @since 1.6.2
*/
public void cleanup() {
@@ -355,11 +376,9 @@
* @since 1.6.3
*/
public void closeFile() {
- this.log.debug("closeFile.");
if (out != null) {
out.close();
out = null;
- unregister();
}
}
@@ -387,10 +406,11 @@
private void openFileImpl(boolean append) {
if (out == null) {
- this.log.debug("openFileImpl: " + filename);
try {
+ if (!filename.getParentFile().exists()) {
+ filename.getParentFile().mkdirs();
+ }
out = new PrintStream(new FileOutputStream(filename, append));
- register();
}
catch (IOException ioe) {
throw new BuildException("Problems opening file using a " + "recorder entry: "
@@ -405,8 +425,30 @@
* @param message
*/
public void addLogMessage(String message) {
- out.println(StringUtils.LINE_SEP + message);
+ if (out != null) {
+ out.println(StringUtils.LINE_SEP + message);
+ }
+ }
+ /**
+ *
+ * @param excludedProjects
+ */
+ public void setExcludedProject(List<Project> excludedProjects) {
+ this.excludedProjects = new ArrayList<Project>(excludedProjects);
}
+ /**
+ * Defines the root project a recorder entry should record
+ * from. (this one and sub-project). List will be cleared
+ * if the project is null.
+ * @param project
+ */
+ public void setRecorderProject(Project project) {
+ if (project != null) {
+ this.includedProjects.add(project);
+ } else {
+ this.includedProjects.clear();
+ }
+ }
}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/StageSummaryHandler.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/StageSummaryHandler.java Mon Oct 18 10:23:52 2010 +0100
@@ -29,7 +29,6 @@
import java.util.Map;
import java.util.Vector;
-import org.apache.log4j.Logger;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
@@ -37,7 +36,6 @@
import org.apache.tools.ant.util.DateUtils;
import com.nokia.helium.core.ant.types.Stage;
-import com.nokia.helium.logger.ant.types.StageSummary;
import freemarker.cache.FileTemplateLoader;
import freemarker.template.Configuration;
@@ -49,72 +47,60 @@
* build process.
*
*/
-public class StageSummaryHandler implements Handler {
+public class StageSummaryHandler implements BuildEventHandler, TargetEventHandler {
public static final String PASSED = "PASSED";
public static final String FAILED = "FAILED";
- private Logger log = Logger.getLogger(getClass());
- private boolean lookup4Stages;
private boolean summarize;
+ private boolean initialized;
+
- private Map<String, StageWrapper> completedStages;
+ private Map<String, StageWrapper> completedStages = new LinkedHashMap<String, StageWrapper>();;
private StageWrapper currentStage;
private Hashtable<String, Stage> stages;
private File template;
- /**
- * Create an instance of {@link StageSummaryHandler}
- *
- */
- public StageSummaryHandler() {
- completedStages = new LinkedHashMap<String, StageWrapper>();
- log.debug("StageStatusHandler instantiated");
+ public StageSummaryHandler(File template) {
+ this.template = template;
}
/**
* {@inheritDoc}
*/
- public void handleBuildStarted(BuildEvent event) {
+ public void buildStarted(BuildEvent event) {
}
/**
* {@inheritDoc}
*/
- public void handleBuildFinished(BuildEvent event) {
+ public void buildFinished(BuildEvent event) {
if (summarize && currentStage != null) {
endCurrentStage();
}
if (summarize && !completedStages.isEmpty()) {
generateSummary(event.getProject());
- log.debug("Stage Summary generation completed");
+ CommonListener.getCommonListener().getProject().log("Stage Summary generation completed", Project.MSG_DEBUG);
}
}
/**
* {@inheritDoc}
*/
- public void handleTargetStarted(BuildEvent event) {
- Project project = event.getProject();
- if (!summarize) {
- StageSummary stageSummary = getStageSummary(project);
- summarize = stageSummary != null
- && stageSummary.getTemplate() != null;
- lookup4Stages = summarize;
- template = stageSummary.getTemplate();
- log.debug("Is Project configured to display Stage Summary ? "
- + summarize);
+ public void targetStarted(BuildEvent event) {
+ if (!initialized) {
+ if (template != null) {
+ parseStages(event.getProject());
+ CommonListener.getCommonListener().getProject().log("Stage summary enabled...", Project.MSG_DEBUG);
+ summarize = true;
+ } else {
+
+ CommonListener.getCommonListener().getProject().log("Stage summary disabled because template is missing.", Project.MSG_DEBUG);
+ }
+ initialized = true;
}
- if (lookup4Stages) {
- log.debug("Loading stages....");
- parseStages(event.getProject());
- log.debug("Total no of stages loaded = " + stages.size());
- lookup4Stages = false;
- }
-
- log.debug("Handling target - " + event.getTarget().getName());
if (summarize && doRunTarget(event)) {
StageWrapper stage = searchNewStage(event);
if (stage != null) {
@@ -126,7 +112,7 @@
/**
* {@inheritDoc}
*/
- public void handleTargetFinished(BuildEvent event) {
+ public void targetFinished(BuildEvent event) {
if (summarize && isCurrentStageToEnd(event)) {
endCurrentStage();
}
@@ -155,32 +141,6 @@
}
/**
- * Method returns the configured {@link StageSummary}.
- *
- * @param project
- * is the project to lookup for stageSummary.
- * @return the {@link StageSummary}.
- */
- @SuppressWarnings("unchecked")
- private StageSummary getStageSummary(Project project) {
- StageSummary stageSummary = null;
- int count = 0;
- Hashtable<String, Object> references = project.getReferences();
- for (Enumeration<String> en = references.keys(); en.hasMoreElements();) {
- Object object = references.get(en.nextElement());
- if (object instanceof StageSummary) {
- count++;
- if (count > 1) {
- throw new BuildException("Multiple entries of 'hlm:stagesummary' found in "
- + "stages_config.ant.xml.");
- }
- stageSummary = (StageSummary) object;
- }
- }
- return stageSummary;
- }
-
- /**
* Start the given stage as a new build stage.
*
* @param newStage
@@ -194,8 +154,8 @@
}
newStage.setStartTime(currTime);
this.currentStage = newStage;
- log.debug("New stage [" + newStage.stageName + "] started at "
- + getTimestamp(currTime));
+ CommonListener.getCommonListener().getProject().log("New stage [" + newStage.stageName + "] started at "
+ + getTimestamp(currTime), Project.MSG_DEBUG);
}
/**
@@ -214,8 +174,8 @@
currTime));
completedStages.put(currentStage.stageName, currentStage);
}
- log.debug("Stage [" + currentStage.stageName + "] finished at "
- + getTimestamp(currTime));
+ CommonListener.getCommonListener().getProject().log("Stage [" + currentStage.stageName + "] finished at "
+ + getTimestamp(currTime), Project.MSG_DEBUG);
currentStage = null;
}
}
@@ -333,7 +293,7 @@
if (template != null) {
try {
Configuration cfg = new Configuration();
- log.debug("Basedir: " + template.getParentFile());
+ CommonListener.getCommonListener().getProject().log("Basedir: " + template.getParentFile(), Project.MSG_DEBUG);
cfg.setTemplateLoader(new FileTemplateLoader(template
.getParentFile()));
Template templ = cfg.getTemplate(template.getName());
@@ -412,13 +372,13 @@
private void validateStageInformation(String stageKey, Stage stage) {
if (stage.getStartTarget() == null) {
- throw new BuildException("'starttarget' for stage '" + stageKey
- + "' should not be null.");
+ throw new BuildException("'starttarget' attribute for stage '" + stageKey
+ + "' is not defined.");
}
if (stage.getEndTarget() == null) {
- throw new BuildException("'endtarget' for stage '" + stageKey
- + "' should not be null.");
+ throw new BuildException("'endtarget' attribute for stage '" + stageKey
+ + "' is not defined.");
}
}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/StatusAndLogListener.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,342 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-package com.nokia.helium.logger.ant.listener;
-
-import java.util.Vector;
-
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.BuildEvent;
-import org.apache.tools.ant.BuildListener;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.SubBuildListener;
-
-/**
- * <code>StatusAndLogListener</code> implements {@link BuildListener} and listens to build events in
- * particularly for activities such as ant logging and displaying build stage summary at the end of
- * build process.
- *
- */
-public class StatusAndLogListener implements BuildListener, SubBuildListener {
- private static StatusAndLogListener self;
-
- private Vector<BuildEventHandler> buildHandlers = new Vector<BuildEventHandler>();
- private Vector<TargetEventHandler> targetHandlers = new Vector<TargetEventHandler>();
- private Vector<TaskEventHandler> taskHandlers = new Vector<TaskEventHandler>();
- private Vector<MessageEventHandler> messageHandlers = new Vector<MessageEventHandler>();
- private Vector<SubBuildEventHandler> subBuildHandlers = new Vector<SubBuildEventHandler>();
- private Project project;
- private Logger log = Logger.getLogger(getClass());
-
- /**
- * Default constructor
- */
- public StatusAndLogListener() {
- self = this;
- }
-
- /**
- * Signals that the last target has finished. This event will still be fired if an error
- * occurred during the build.
- *
- * @param event An event with any relevant extra information. Must not be <code>null</code>.
- *
- * @see BuildEvent#getException()
- */
- public synchronized void buildStarted(BuildEvent event) {
- project = event.getProject();
- for (BuildEventHandler handler : buildHandlers) {
- handler.handleBuildStarted(event);
- }
-
- }
-
- /**
- * Signals that a build has started. This event is fired before any targets have started.
- *
- * @param event An event with any relevant extra information. Must not be <code>null</code>.
- */
- public synchronized void buildFinished(BuildEvent event) {
- for (BuildEventHandler handler : buildHandlers) {
- handler.handleBuildFinished(event);
- }
- }
-
- /**
- * Signals that a target is starting.
- *
- * @param event An event with any relevant extra information. Must not be <code>null</code>.
- *
- * @see BuildEvent#getTarget()
- */
- public synchronized void targetStarted(BuildEvent event) {
- for (TargetEventHandler handler : targetHandlers) {
- handler.handleTargetStarted(event);
- }
- }
-
- /**
- * Signals that a target has finished. This event will still be fired if an error occurred
- * during the build.
- *
- * @param event An event with any relevant extra information. Must not be <code>null</code>.
- *
- * @see BuildEvent#getException()
- */
- public synchronized void targetFinished(BuildEvent event) {
- for (TargetEventHandler handler : targetHandlers) {
- handler.handleTargetFinished(event);
- }
- }
-
- /**
- * Signals that a task is starting.
- *
- * @param event An event with any relevant extra information. Must not be <code>null</code>.
- *
- * @see BuildEvent#getTask()
- */
- public synchronized void taskStarted(BuildEvent event) {
- for (TaskEventHandler handler : taskHandlers) {
- handler.handleTaskStarted(event);
- }
- }
-
- /**
- * Signals that a task has finished. This event will still be fired if an error occurred during
- * the build.
- *
- * @param event An event with any relevant extra information. Must not be <code>null</code>.
- *
- * @see BuildEvent#getException()
- */
- public synchronized void taskFinished(BuildEvent event) {
- for (TaskEventHandler handler : taskHandlers) {
- handler.handleTaskFinished(event);
- }
- }
-
- /**
- * Signals that a subbuild has started. This event is fired before any targets have started.
- *
- * @param event
- */
- public synchronized void subBuildStarted(BuildEvent event) {
- for (SubBuildEventHandler handler : subBuildHandlers) {
- handler.handleSubBuildStarted(event);
- }
- }
-
- /**
- * Signals that the last target has finished. This event will still be fired if an error
- * occurred during the build.
- *
- * @param event
- */
-
- public synchronized void subBuildFinished(BuildEvent event) {
- for (SubBuildEventHandler handler : subBuildHandlers) {
- handler.handleSubBuildStarted(event);
- }
- }
-
- /**
- * Signals a message logging event.
- *
- * @param event An event with any relevant extra information. Must not be <code>null</code>.
- *
- * @see BuildEvent#getMessage()
- * @see BuildEvent#getException()
- * @see BuildEvent#getPriority()
- */
- public synchronized void messageLogged(BuildEvent event) {
- for (MessageEventHandler handler : messageHandlers) {
- handler.handleMessageLogged(event);
- }
- }
-
- /**
- * Register the given handler.
- *
- * @param handler is the handler to register
- */
- public synchronized void register(Handler handler) {
- Vector<BuildEventHandler> tmpBuildHandlers = new Vector<BuildEventHandler>(buildHandlers);
- tmpBuildHandlers.add(handler);
- buildHandlers = tmpBuildHandlers;
- Vector<TargetEventHandler> tmpTargetHandlers = new Vector<TargetEventHandler>(targetHandlers);
- tmpTargetHandlers.add(handler);
- targetHandlers = tmpTargetHandlers;
- }
-
- /**
- * Register the given handler.
- *
- * @param handler is the handler to register
- */
- public synchronized void remove(Handler handler) {
- Vector<BuildEventHandler> tmpBuildHandlers = new Vector<BuildEventHandler>(buildHandlers);
- tmpBuildHandlers.remove(handler);
- buildHandlers = tmpBuildHandlers;
- Vector<TargetEventHandler> tmpTargetHandlers = new Vector<TargetEventHandler>(targetHandlers);
- tmpTargetHandlers.remove(handler);
- targetHandlers = tmpTargetHandlers;
- }
-
- /**
- * Register the given handler.
- *
- * @param handler is the handler to register
- */
- public synchronized void register(BuildEventHandler handler) {
- Vector<BuildEventHandler> tmp = new Vector<BuildEventHandler>(buildHandlers);
- tmp.add(handler);
- buildHandlers = tmp;
- }
-
- /**
- * Remove the given handler.
- *
- * @param handler is the handler to register
- */
- public synchronized void remove(BuildEventHandler handler) {
- Vector<BuildEventHandler> tmp = new Vector<BuildEventHandler>(buildHandlers);
- tmp.remove(handler);
- buildHandlers = tmp;
- }
-
- /**
- * Register the given handler.
- *
- * @param handler is the handler to register
- */
- public synchronized void register(TargetEventHandler handler) {
- Vector<TargetEventHandler> tmp = new Vector<TargetEventHandler>(targetHandlers);
- tmp.add(handler);
- targetHandlers = tmp;
- }
-
- /**
- * Remove the given handler.
- *
- * @param handler is the handler to register
- */
- public synchronized void remove(TargetEventHandler handler) {
- Vector<TargetEventHandler> tmp = new Vector<TargetEventHandler>(targetHandlers);
- tmp.remove(handler);
- targetHandlers = tmp;
- }
-
- /**
- * Register the given SubBuildEventHandler.
- *
- * @param handler is the handler to register
- */
- public synchronized void register(SubBuildEventHandler handler) {
- Vector<SubBuildEventHandler> tmp = new Vector<SubBuildEventHandler>(subBuildHandlers);
- tmp.add(handler);
- subBuildHandlers = tmp;
- }
-
- /**
- * Remove the given SubBuildEventHandler.
- *
- * @param handler is the handler to register
- */
- public synchronized void remove(SubBuildEventHandler handler) {
- Vector<SubBuildEventHandler> tmp = new Vector<SubBuildEventHandler>(subBuildHandlers);
- tmp.remove(handler);
- subBuildHandlers = tmp;
- }
-
- /**
- * Register the given MessageEventHandler.
- *
- * @param handler is the handler to register
- */
- public synchronized void register(MessageEventHandler handler) {
- Vector<MessageEventHandler> tmp = new Vector<MessageEventHandler>(messageHandlers);
- tmp.add(handler);
- messageHandlers = tmp;
- }
-
- /**
- * Remove the given MessageEventHandler.
- *
- * @param handler is the handler to register
- */
- public synchronized void remove(MessageEventHandler handler) {
- Vector<MessageEventHandler> tmp = new Vector<MessageEventHandler>(messageHandlers);
- tmp.remove(handler);
- messageHandlers = tmp;
- }
-
- /**
- * Register the given TaskEventHandler.
- *
- * @param handler is the handler to register
- */
- public synchronized void register(TaskEventHandler handler) {
- Vector<TaskEventHandler> tmp = new Vector<TaskEventHandler>(taskHandlers);
- tmp.add(handler);
- taskHandlers = tmp;
- }
-
- /**
- * Remove the given TaskEventHandler.
- *
- * @param handler is the handler to register
- */
- public synchronized void remove(TaskEventHandler handler) {
- Vector<TaskEventHandler> tmp = new Vector<TaskEventHandler>(taskHandlers);
- tmp.remove(handler);
- taskHandlers = tmp;
- }
-
- /**
- * Return root project.
- *
- * @return
- */
- public Project getProject() {
- return project;
- }
-
- /**
- * Get the main StatusAndLogListener.
- *
- * @return
- */
- public static StatusAndLogListener getStatusAndLogListener() {
- return self;
- }
-
- /**
- * Check and return required type handler.
- *
- * @param handlerType
- * @return
- */
- public synchronized Handler getHandler(Class<?> handlerType) {
- for (BuildEventHandler handler : buildHandlers) {
- if (handlerType.isInstance(handler)) {
- return (Handler) handler;
- }
- }
- return null;
- }
-
-}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/SubBuildEventHandler.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/SubBuildEventHandler.java Mon Oct 18 10:23:52 2010 +0100
@@ -30,12 +30,12 @@
* Method to handle SubBuild Started events.
* @param event
*/
- void handleSubBuildStarted( BuildEvent event );
+ void subBuildStarted( BuildEvent event );
/**
* Method to handle SubBuild Finished events.
* @param event
*/
- void handleSubBuildFinished( BuildEvent event );
+ void subBuildFinished( BuildEvent event );
}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/TargetEventHandler.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/TargetEventHandler.java Mon Oct 18 10:23:52 2010 +0100
@@ -32,13 +32,13 @@
* @param event
*/
- void handleTargetStarted( BuildEvent event );
+ void targetStarted( BuildEvent event );
/**
* Method to handle target finish events.
*
* @param event is the build event to be handled.
*/
- void handleTargetFinished( BuildEvent event );
+ void targetFinished( BuildEvent event );
}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/TaskEventHandler.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/listener/TaskEventHandler.java Mon Oct 18 10:23:52 2010 +0100
@@ -31,13 +31,13 @@
*
* @param event is the build event to be handled.
*/
- void handleTaskFinished( BuildEvent event );
+ void taskFinished( BuildEvent event );
/**
* Method to handle Task Started( events.
*
* @param event is the build event to be handled.
*/
- void handleTaskStarted( BuildEvent event );
+ void taskStarted( BuildEvent event );
}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/taskdefs/LogRecorderTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/taskdefs/LogRecorderTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -30,13 +30,12 @@
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Recorder.VerbosityLevelChoices;
import org.apache.tools.ant.types.EnumeratedAttribute;
-import org.apache.tools.ant.types.LogLevel;
import com.nokia.helium.logger.ant.listener.AntLoggingHandler;
-import com.nokia.helium.logger.ant.listener.Handler;
import com.nokia.helium.logger.ant.listener.RecorderEntry;
-import com.nokia.helium.logger.ant.listener.StatusAndLogListener;
+import com.nokia.helium.logger.ant.listener.CommonListener;
import com.nokia.helium.logger.ant.types.RecordFilter;
import com.nokia.helium.logger.ant.types.RecordFilterSet;
@@ -51,11 +50,11 @@
*
* </pre>
*
- * @ant.task name="Record" category="Logging".
+ * @ant.task name="Record" category="Logging"
*
*/
-public class LogRecorderTask extends Task implements Handler {
+public class LogRecorderTask extends Task {
private static Hashtable<File, RecorderEntry> recorderEntries = new Hashtable<File, RecorderEntry>();
private File fileName;
@@ -74,18 +73,15 @@
* Run by the task.
*/
public void execute() {
- StatusAndLogListener statusAndLogListener = new StatusAndLogListener();
- AntLoggingHandler antLoggingHandler = new AntLoggingHandler(getProject());
- antLoggingHandler.setLoggingStarted(true);
- statusAndLogListener.register(antLoggingHandler);
+ CommonListener commonListener = CommonListener.getCommonListener();
- /* To validate attributes passed. */
+ // To validate attributes passed.
validateAttributes();
- /* to add regular filters */
+ // to add regular filters
addAllRecordFilters();
- /* Init password/record filter and replace any unset properties */
+ // Init password/record filter and replace any unset properties
initAndReplaceProperties();
//Create the root folder path.
@@ -117,30 +113,25 @@
recorder.setEmacsMode(emacsMode);
if (start != null) {
if (start.booleanValue()) {
- getProject().addBuildListener(statusAndLogListener);
- if (antLoggingHandler != null) {
- if (antLoggingHandler.getCurrentStageName() != null) {
- antLoggingHandler.doLoggingAction(antLoggingHandler.getCurrentStageName(), false, "Stopping", this, getOwningTarget());
- } else {
- antLoggingHandler.doLoggingAction("default", false, "Stopping", this, getOwningTarget());
- }
+ recorder.reopenFile();
+ commonListener.register(recorder);
+ recorder.setRecordState(start.booleanValue());
+ recorder.setRecorderProject(getProject());
+ AntLoggingHandler handler = commonListener.getHandler(AntLoggingHandler.class);
+ if (handler != null) {
+ handler.addRecordExclusion(getProject());
}
- recorder.reopenFile();
- recorder.setRecordState(start.booleanValue());
} else {
recorder.setRecordState(start.booleanValue());
recorder.closeFile();
- getProject().removeBuildListener(statusAndLogListener);
- if (antLoggingHandler != null) {
- if (antLoggingHandler.getCurrentStageName() != null) {
- antLoggingHandler.doLoggingAction(antLoggingHandler.getCurrentStageName(), true, "Starting", this, getOwningTarget());
- } else {
- antLoggingHandler.doLoggingAction("default", true, "Starting", this, getOwningTarget());
- }
+ commonListener.unRegister(recorder);
+ recorder.setRecorderProject(null);
+ AntLoggingHandler handler = commonListener.getHandler(AntLoggingHandler.class);
+ if (handler != null) {
+ handler.removeRecordExclusion(getProject());
}
}
}
-
}
/**
* To Validate is the fileName set for recording.
@@ -281,16 +272,7 @@
return VALUES;
}
}
-
- /**
- * To set the verbosity levels
- *
- *
- */
- public static class VerbosityLevelChoices extends LogLevel {
- }
-
-
+
/**
* To register the recorder entry
*/
@@ -298,11 +280,10 @@
RecorderEntry entry = recorderEntries.get(name);
if (entry == null) {
// create a recorder entry
- entry = new RecorderEntry(name);
+ entry = new RecorderEntry(name, true);
for (String regExp : regExpList) {
if (!regExp.equals("")) {
- String pattern = Pattern.quote(regExp);
- entry.addRegexp(pattern);
+ entry.addRegexp(Pattern.compile(Pattern.quote(regExp)));
}
}
entry.openFile(append);
@@ -320,23 +301,10 @@
}
}
- public void handleBuildFinished(BuildEvent event) {
- // TODO Auto-generated method stub
-
+ public void buildFinished(BuildEvent event) {
}
- public void handleBuildStarted(BuildEvent event) {
- // TODO Auto-generated method stub
-
- }
-
- public void handleTargetFinished(BuildEvent event) {
- // TODO Auto-generated method stub
- }
-
- public void handleTargetStarted(BuildEvent event) {
- // TODO Auto-generated method stub
-
+ public void buildStarted(BuildEvent event) {
}
/**
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/taskdefs/LogReplaceTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/taskdefs/LogReplaceTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -23,7 +23,7 @@
import org.apache.tools.ant.Task;
import com.nokia.helium.logger.ant.listener.AntLoggingHandler;
-import com.nokia.helium.logger.ant.listener.StatusAndLogListener;
+import com.nokia.helium.logger.ant.listener.CommonListener;
/**
* To replace the property values with real values if the properties are not set at the begining of the build.
@@ -32,7 +32,7 @@
* <hlm:logreplace regexp="${property.not.set}"/>
* </pre>
*
- * @ant.task name="logreplace" category="Logging".
+ * @ant.task name="logreplace" category="Logging"
*/
public class LogReplaceTask extends Task {
@@ -43,20 +43,20 @@
*/
public void execute() {
- if (StatusAndLogListener.getStatusAndLogListener() == null) {
- this.log("The StatusAndLogListener is not available.", Project.MSG_WARN);
+ if (regExp == null ) {
+ throw new BuildException("'regexp' attribute should not be null.");
+ }
+
+ if (CommonListener.getCommonListener() == null) {
+ this.log("The common listener is not available.", Project.MSG_WARN);
return;
}
- AntLoggingHandler antLoggingHandler = (AntLoggingHandler)StatusAndLogListener.getStatusAndLogListener().getHandler(AntLoggingHandler.class);
-
- if (regExp == null ) {
- throw new BuildException("'regexp' attribute should not be null.");
- }
-
+ AntLoggingHandler antLoggingHandler = CommonListener.getCommonListener().getHandler(AntLoggingHandler.class);
if (antLoggingHandler != null) {
- String pattern = Pattern.quote(regExp);
- antLoggingHandler.addRegExp(pattern);
+ antLoggingHandler.addRegexp(Pattern.compile(Pattern.quote(regExp)));
+ } else {
+ log("Could not find the logging framework.", Project.MSG_WARN);
}
}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/taskdefs/TriggerLoggerTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/taskdefs/TriggerLoggerTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -16,12 +16,11 @@
*/
package com.nokia.helium.logger.ant.taskdefs;
-import org.apache.log4j.Logger;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import com.nokia.helium.logger.ant.listener.AntLoggingHandler;
-import com.nokia.helium.logger.ant.listener.StatusAndLogListener;
+import com.nokia.helium.logger.ant.listener.CommonListener;
/**
* This task is used to start the helium logging listener.
@@ -29,25 +28,19 @@
*/
public class TriggerLoggerTask extends Task {
- private Logger log = Logger.getLogger(TriggerLoggerTask.class);
public void execute() {
- log.debug("Registering Ant logging to StatusAndLogListener listener");
- if (StatusAndLogListener.getStatusAndLogListener() == null) {
- this.log("The StatusAndLogListener is not available.", Project.MSG_WARN);
+ log("Registering Ant logging to StatusAndLogListener listener", Project.MSG_DEBUG);
+ if (CommonListener.getCommonListener() == null) {
+ this.log("The CommonListener is not available.", Project.MSG_WARN);
return;
}
- AntLoggingHandler antLoggingHandler = new AntLoggingHandler(getProject());
- StatusAndLogListener.getStatusAndLogListener().register(antLoggingHandler);
- if (antLoggingHandler != null ) {
- if (!antLoggingHandler.getLoggingStarted()) {
- log.debug("Starting Logging using 'AntLoggingHandler' first time.");
- antLoggingHandler.setLoggingStarted(true);
- } else {
- log.debug("'AntLoggingHandler' is already started logging.");
- }
+ AntLoggingHandler handler = CommonListener.getCommonListener().getHandler(AntLoggingHandler.class);
+ if (handler != null) {
+ log("Starting logging framework.", Project.MSG_DEBUG);
+ handler.setRecordState(true);
} else {
- log.debug("Could not find the AntLoggingHandler instance.");
+ log("Could not find the logging listener.", Project.MSG_WARN);
}
}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/types/RecordFilter.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/types/RecordFilter.java Mon Oct 18 10:23:52 2010 +0100
@@ -28,7 +28,7 @@
* <hlm:recordfilter category="warn" regexp="^WARN"/>
* </pre>
*
- * @ant.task name="Recordfilter" category="Logging".
+ * @ant.task name="Recordfilter" category="Logging"
*
*/
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/types/RecordFilterSet.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/types/RecordFilterSet.java Mon Oct 18 10:23:52 2010 +0100
@@ -35,7 +35,7 @@
*
* </pre>
*
- * @ant.task name="Recordfilterset" category="Logging".
+ * @ant.task name="Recordfilterset" category="Logging"
*
*/
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/types/StageLogging.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-package com.nokia.helium.logger.ant.types;
-
-import java.io.File;
-
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.types.DataType;
-
-/**
- * A 'StageRecord' is a Data type which stores attributes for stage recording/logging.
- *
- *
- * Usage:
- * <pre>
- * <hlm:stagerecord id="record.default" defaultoutput="${build.log.dir}/${build.id}_main.ant.log" loglevel="info" append="false"/>
- *
- *
- * <hlm:stagerecord id="record.prep"
- * stagerefid="preparation"
- * output="${build.log.dir}/${build.id}_prep.ant.log"
- * loglevel="info"
- * append="false"/>
- *
- * </pre>
- *
- *
- * @ant.task name="stagerecord" category="Logging"
- */
-public class StageLogging extends DataType {
-
- private static boolean isAntLoggerRegistered;
- private String logLevel = "info";
- private File logFile;
- private File defaultLogFile;
- private boolean append = true;
- private String stageRefId;
- private Logger log = Logger.getLogger(getClass());
-
-
- /**
- * Sets output log file name.
- * @param output the file to log into
- * @ant.required
- */
-
- public void setOutput(File output) {
- this.logFile = output;
- }
-
- /**
- * Returns output log file name.
- * @return
- */
-
- public File getOutput() {
- return this.logFile;
- }
-
- /**
- * Sets log level for respective stage.
- * @param logLevel
- * @ant.not-required
- */
-
- public void setLogLevel(String logLevel) {
- this.logLevel = logLevel;
- }
-
- /**
- * Returns log level of respective stage.
- * @return
- */
-
- public String getLogLevel() {
- return this.logLevel;
- }
-
- /**
- * Get the name of this StageRefID.
- *
- * @return name of the Phase.
- */
- public String getStageRefID() {
- return this.stageRefId;
- }
-
- /**
- * Set the name of the StageRefID.
- *
- * @param name
- * is the name to set.
- * @ant.required
- */
- public void setStageRefId(String name) {
- this.stageRefId = name;
- }
-
- /**
- * Return default ant log file name.
- * @return
- */
- public File getDefaultOutput() {
- return this.defaultLogFile;
- }
-
- /**
- * Set the default ant log name.
- * @param name
- * @ant.required
- */
- public void setDefaultOutput(File name) {
- this.defaultLogFile = name;
- }
-
- /**
- * Set append value.
- * @param append
- * @ant.not-required Default is true
- */
- public void setAppend(boolean append) {
- this.append = append;
- }
-
- /**
- * Return the append value.
- * @param append
- * @return
- */
- public boolean getAppend() {
- return this.append;
- }
-
-
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/types/StageRecord.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,147 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.logger.ant.types;
+
+import java.io.File;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.taskdefs.Recorder.VerbosityLevelChoices;
+import org.apache.tools.ant.types.DataType;
+
+/**
+ * A 'StageRecord' is a Data type which stores attributes for stage recording/logging.
+ *
+ *
+ * Usage:
+ * <pre>
+ * <hlm:stagerecord id="record.default" defaultoutput="${build.log.dir}/${build.id}_main.ant.log" loglevel="info" append="false"/>
+ *
+ *
+ * <hlm:stagerecord id="record.prep"
+ * stagerefid="preparation"
+ * output="${build.log.dir}/${build.id}_prep.ant.log"
+ * loglevel="info"
+ * append="false"/>
+ *
+ * </pre>
+ *
+ *
+ * @ant.task name="stagerecord" category="Logging"
+ */
+public class StageRecord extends DataType {
+
+ private int logLevel = Project.MSG_INFO;
+ private File logFile;
+ private File defaultLogFile;
+ private boolean append = true;
+ private String stageRefId;
+
+ /**
+ * Sets output log file name.
+ * @param output the file to log into
+ * @ant.required
+ */
+
+ public void setOutput(File output) {
+ this.logFile = output;
+ }
+
+ /**
+ * Returns output log file name.
+ * @return
+ */
+
+ public File getOutput() {
+ return this.logFile;
+ }
+
+ /**
+ * Sets log level for respective stage.
+ * @param logLevel
+ * @ant.not-required
+ */
+
+ public void setLogLevel(VerbosityLevelChoices logLevel) {
+ this.logLevel = logLevel.getLevel();
+ }
+
+ /**
+ * Returns log level of respective stage.
+ * @return
+ */
+
+ public int getLogLevel() {
+ return this.logLevel;
+ }
+
+ /**
+ * Get the name of this StageRefID.
+ *
+ * @return name of the Phase.
+ */
+ public String getStageRefID() {
+ return this.stageRefId;
+ }
+
+ /**
+ * Set the name of the StageRefID.
+ *
+ * @param name
+ * is the name to set.
+ * @ant.required
+ */
+ public void setStageRefId(String name) {
+ this.stageRefId = name;
+ }
+
+ /**
+ * Return default ant log file name.
+ * @return
+ */
+ public File getDefaultOutput() {
+ return this.defaultLogFile;
+ }
+
+ /**
+ * Set the default ant log name.
+ * @param name
+ * @ant.required
+ */
+ public void setDefaultOutput(File name) {
+ this.defaultLogFile = name;
+ }
+
+ /**
+ * Set append value.
+ * @param append
+ * @ant.not-required Default is true
+ */
+ public void setAppend(boolean append) {
+ this.append = append;
+ }
+
+ /**
+ * Return the append value.
+ * @param append
+ * @return
+ */
+ public boolean getAppend() {
+ return this.append;
+ }
+
+
+}
--- a/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/types/StageSummary.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/src/com/nokia/helium/logger/ant/types/StageSummary.java Mon Oct 18 10:23:52 2010 +0100
@@ -18,12 +18,11 @@
import java.io.File;
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
+import com.nokia.helium.logger.ant.listener.CommonListenerRegister;
import com.nokia.helium.logger.ant.listener.StageSummaryHandler;
-import com.nokia.helium.logger.ant.listener.StatusAndLogListener;
+import com.nokia.helium.logger.ant.listener.CommonListener;
/**
* <code>StageSummary</code> is a Data type when set a build summary is
@@ -38,21 +37,9 @@
* @ant.task name="stagesummary" category="Logging"
*
*/
-public class StageSummary extends DataType {
-
- private static boolean isStageSummaryHandlerRegistered;
- private File template;
- private Logger log = Logger.getLogger(getClass());
+public class StageSummary extends DataType implements CommonListenerRegister {
- public void setProject(Project project)
- {
- super.setProject(project);
- if ( !isStageSummaryHandlerRegistered && StatusAndLogListener.getStatusAndLogListener() != null) {
- log.debug("Registering stage summary to the StatusAndLogListener listener");
- StatusAndLogListener.getStatusAndLogListener().register( new StageSummaryHandler() );
- isStageSummaryHandlerRegistered = true;
- }
- }
+ private File template;
/**
* Get the template used for displaying build stage summary.
@@ -73,4 +60,13 @@
public void setTemplate( File template ) {
this.template = template;
}
+
+ @Override
+ public void register(CommonListener commonListener) {
+ if (commonListener.getHandler(StageSummaryHandler.class) != null) {
+ log("Only one stageSummary configuration element should be used. Ignoring type at " + this.getLocation());
+ } else {
+ commonListener.register(new StageSummaryHandler(getTemplate()));
+ }
+ }
}
--- a/buildframework/helium/sf/java/logging/tests/antunit/run-scenario.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/antunit/run-scenario.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -21,36 +21,36 @@
============================================================================
-->
<project name="run-scenario" xmlns:ac="antlib:net.sf.antcontrib" xmlns:au="antlib:org.apache.ant.antunit">
- <description>Helium Antlib logger macro.</description>
+ <description>Helium Antlib logger macro.</description>
- <target name="setUp">
- <tempfile property="temp.dir" suffix=".dir" />
- <mkdir dir="${temp.dir}" />
- <echo>--------------------------------------------</echo>
- </target>
+ <target name="setUp">
+ <tempfile property="temp.dir" suffix=".dir" />
+ <mkdir dir="${temp.dir}" />
+ <echo>--------------------------------------------</echo>
+ </target>
- <target name="tearDown">
- <echo>--------------------------------------------</echo>
- <delete dir="${temp.dir}" />
- </target>
+ <target name="tearDown">
+ <echo>--------------------------------------------</echo>
+ <delete dir="${temp.dir}" />
+ </target>
- <macrodef name="runScenario">
- <attribute name="scenario" />
- <attribute name="target" />
- <sequential>
- <exec osfamily="windows" executable="cmd" dir="${ant.file.run-scenario}/../../scenarii/@{scenario}" failonerror="true">
- <env key="ANT_ARGS" value="${env.ANT_ARGS} -listener com.nokia.helium.logger.ant.listener.StatusAndLogListener" />
- <arg line="/c ..\build.bat @{target}" />
- <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
- <arg value="-Dtemp.dir=${temp.dir}" />
- </exec>
- <exec osfamily="unix" executable="../bld.sh" dir="${ant.file.run-scenario}/../../scenarii/@{scenario}" failonerror="true">
- <env key="ANT_ARGS" value="${env.ANT_ARGS} -listener com.nokia.helium.logger.ant.listener.StatusAndLogListener" />
- <arg line="@{target}" />
- <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
- <arg value="-Dtemp.dir=${temp.dir}" />
- </exec>
- </sequential>
- </macrodef>
+ <macrodef name="runScenario">
+ <attribute name="scenario" />
+ <attribute name="target" />
+ <sequential>
+ <exec osfamily="windows" executable="cmd" dir="${ant.file.run-scenario}/../../scenarii/@{scenario}" failonerror="true">
+ <env key="ANT_ARGS" value="${env.ANT_ARGS} -listener com.nokia.helium.logger.ant.listener.CommonListener" />
+ <arg line="/c ..\build.bat @{target}" />
+ <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
+ <arg value="-Dtemp.dir=${temp.dir}" />
+ </exec>
+ <exec osfamily="unix" executable="../bld.sh" dir="${ant.file.run-scenario}/../../scenarii/@{scenario}" failonerror="true">
+ <env key="ANT_ARGS" value="${env.ANT_ARGS} -listener com.nokia.helium.logger.ant.listener.CommonListener" />
+ <arg line="@{target}" />
+ <arg value="-Dant.executor.class=com.nokia.helium.core.ant.HeliumExecutor" />
+ <arg value="-Dtemp.dir=${temp.dir}" />
+ </exec>
+ </sequential>
+ </macrodef>
</project>
--- a/buildframework/helium/sf/java/logging/tests/antunit/test_recorder.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/antunit/test_recorder.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -45,4 +45,19 @@
<runScenario scenario="logger" target="test-recorder-filtering" />
</target>
+ <target name="test-mainlog">
+ <runScenario scenario="logger" target="test-mainlog" />
+
+ <loadfile srcfile="${temp.dir}/logs/1_main.ant.log" property="message"/>
+ <au:assertTrue message="test1 missing">
+ <contains string="${message}" substring="test1"/>
+ </au:assertTrue>
+ <au:assertTrue message="BUILD SUCCESSFUL missing">
+ <contains string="${message}" substring="BUILD SUCCESSFUL"/>
+ </au:assertTrue>
+ <au:assertFalse message="Not in mainlog found">
+ <contains string="${message}" substring="Not in mainlog"/>
+ </au:assertFalse>
+ </target>
+
</project>
--- a/buildframework/helium/sf/java/logging/tests/antunit/test_stageslogging.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/antunit/test_stageslogging.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -27,6 +27,10 @@
<target name="test-scenario-valid-build">
<runScenario scenario="valid_build" target="build" />
+ <loadfile property="main.log" srcFile="${temp.dir}/logs/ant-logging-test_main.ant.log" />
+ <au:assertTrue message="Target name are not recorded properly.">
+ <contains string="${main.log}" substring="test-stages:" />
+ </au:assertTrue>
</target>
<target name="test-override-scenario">
--- a/buildframework/helium/sf/java/logging/tests/scenarii/build_failure/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/build_failure/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -28,6 +28,7 @@
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
<hlm:stage id="stage1" starttarget="stage1" endtarget="stage1" />
<hlm:stage id="stage2" starttarget="stage2" endtarget="stage2" />
--- a/buildframework/helium/sf/java/logging/tests/scenarii/build_status/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/build_status/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -28,7 +28,8 @@
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
-
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
+
<hlm:stage id="stage1" starttarget="stage1" endtarget="stage1" />
<hlm:stage id="stage2" starttarget="stage2" endtarget="stage3" />
--- a/buildframework/helium/sf/java/logging/tests/scenarii/inavlid_stage_refid_object/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/inavlid_stage_refid_object/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -28,6 +28,7 @@
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
<hlm:stage id="stage1" starttarget="stage1" endtarget="stage1" />
<hlm:stage id="stage2" starttarget="stage2" endtarget="stage2" />
--- a/buildframework/helium/sf/java/logging/tests/scenarii/invalid_stage_refid/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/invalid_stage_refid/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -28,6 +28,7 @@
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
<hlm:stage id="stage1" starttarget="stage1" endtarget="stage1" />
<hlm:stage id="stage2" starttarget="stage2" endtarget="stage2" />
--- a/buildframework/helium/sf/java/logging/tests/scenarii/logger/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/logger/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -127,5 +127,17 @@
<contains string="${message}" substring="Some sensitive test output ********"/>
</au:assertTrue>
</target>
+
+ <target name="test-mainlog">
+ <hlm:triggerlogger/>
+ <antcall target="print-target"/>
+ </target>
+
+ <target name="print-target">
+ <echo>test1</echo>
+ <hlm:record name="${temp.dir}/record1.log" action="start"/>
+ <echo>Not in mainlog</echo>
+ <hlm:record name="${temp.dir}/record1.log" action="stop"/>
+ </target>
</project>
--- a/buildframework/helium/sf/java/logging/tests/scenarii/missing_default_config/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/missing_default_config/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -28,6 +28,7 @@
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
<hlm:stage id="stage1" starttarget="stage1" endtarget="stage1" />
<hlm:stage id="stage2" starttarget="stage2" endtarget="stage2" />
--- a/buildframework/helium/sf/java/logging/tests/scenarii/missing_stage_refid/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/missing_stage_refid/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -28,6 +28,7 @@
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
<hlm:stage id="stage1" starttarget="stage1" endtarget="stage1" />
<hlm:stage id="stage2" starttarget="stage2" endtarget="stage2" />
--- a/buildframework/helium/sf/java/logging/tests/scenarii/override_scenario/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/override_scenario/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -28,6 +28,7 @@
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
<hlm:stage id="stage1" starttarget="stage1" endtarget="stage1" />
<hlm:stage id="stage2" starttarget="stage2" endtarget="stage2" />
--- a/buildframework/helium/sf/java/logging/tests/scenarii/valid_build/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/valid_build/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -39,8 +39,7 @@
</target>
- <target name="run-stages">
- <antcall target="start-ant-log"/>
+ <target name="run-stages" depends="start-ant-log">
<antcall target="para-test7"/>
<hlm:record name="${build.log.dir}/${build.id}_recorder.log" action="start" loglevel="info" backup="false">
<hlm:recordfilterset refid="recordfilter.config"/>
--- a/buildframework/helium/sf/java/logging/tests/scenarii/valid_build/stages_config.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/scenarii/valid_build/stages_config.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -27,7 +27,8 @@
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
-
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
+
<dirname property="logging.test.project.dir" file="${ant.file.stages-config}" />
<hlm:stagesummary id="stage.summary" template="build_stages_summary.txt.ftl" />
--- a/buildframework/helium/sf/java/logging/tests/stages_config.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/logging/tests/stages_config.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -27,7 +27,8 @@
<taskdef resource="com/nokia/helium/logger/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
-
+ <hlm:stagerecorderlistener id="stage.recorder.listener.id" />
+
<dirname property="logging.test.project.dir" file="${ant.file.stages-config}" />
<hlm:stagesummary id="stage.summary" template="${logging.test.project.dir}\build_stages_summary.txt.ftl" />
@@ -38,6 +39,9 @@
<hlm:stage id="startend" starttarget="start" endtarget="end"/>
<hlm:stage id="paralleltest" starttarget="paratest" endtarget="paratest"/>
+ <property name="build.log.dir" location="${temp.dir}/logs"/>
+ <property name="build.id" value="1"/>
+
<hlm:stagerecord id="record.default" defaultoutput="${build.log.dir}/${build.id}_main.ant.log" loglevel="info" append="false"/>
<hlm:stagerecord id="record.prep" stagerefid="preparation" output="${build.log.dir}/${build.id}_prep.ant.log" loglevel="info" append="false"/>
--- a/buildframework/helium/sf/java/metadata/doc/metadata.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/metadata/doc/metadata.rst Mon Oct 18 10:23:52 2010 +0100
@@ -49,8 +49,8 @@
Overview
--------
-Metadata filters are set of regular expressions used to match the text of the build output and process the errors, categorize it,
-and used to generate the output for diamonds, summary file, email output. Predefined set of ids are defined for each stage of the
+Metadata filters are a set of regular expressions used to match the text of the build output and process the errors, categorize it,
+and used to generate the output for diamonds, summary file, email output. A predefined set of ids are defined for each stage of the
build. For example for raptor compilation filter is defined as below,
The default definition of filterset.sbs is
@@ -71,11 +71,11 @@
</hlm:metadatafilterset>
-The complete list of predefined ids for various stages of the build are defined in this file,
+The complete list of predefined ids for various stages of the build are defined in the file,
helium/config/metadata_filter_config_default.xml
-Each ID can be overridden to provide additional regular expression to control the results of the build for different stages.
+Each ID can be overridden to provide additional regular expressions to control the results of the build for different stages.
Two ways to add the regular expressions
---------------------------------------
@@ -104,9 +104,9 @@
Note
----
-1. The order of metadatafilter / metadatafilterset is important, so the first one takes precedence than the second one.
+1. The order of metadatafilter / metadatafilterset is important, so the first one takes precedence over the second one.
-2. Order is also preserved in the csv file, the expressions which are defined first get precedence than the later one.
+2. Order is also preserved in the csv file, the expressions which are defined first has precedence over the later one.
3. All the regular expressions are JAVA patterns.
@@ -181,14 +181,14 @@
Using the Metadata framework with FMPP
======================================
-The Metadata framework gives an efficient opportunity to record huge amount or data in a fast and reliable way (timewise and memory consumption-wise).
-Thanks to the ORMFMPPLoader database loader it is really simple to access those data and render then in any other format: HTML for easy to read build summary,
-XML to communicated with other tools, text file...
+The Metadata framework gives an efficient opportunity to record huge amounts of data in a fast and reliable way (timewise and memory consumption-wise).
+Thanks to the ORMFMPPLoader database loader it is really simple to access those data and render them in another format: HTML for easy to read build summary,
+XML to communicate with other tools, text file...
Loading a database
------------------
-A database can be load and assigned to a template variable using the pp.loadData functionnality from the FMPP task. The 'com.nokia.helium.metadata.ORMFMPPLoader'
+A database can be loaded and assigned to a template variable using the pp.loadData functionnality from the FMPP task. The 'com.nokia.helium.metadata.ORMFMPPLoader'
accept one argument which is the path to the database.
Example::
@@ -206,7 +206,7 @@
---------------------------------------
The 'jpasingle' is the best way to access results from single values like count of entities. The jpasingle queries must be written in JPQL,
-please check the valid database schema in the previous section (case matter!).
+please check the valid database schema in the previous section (case matters!).
Example of a template that will return the number of log files recorded in the database::
@@ -217,7 +217,7 @@
--------------------------------
The JPA query allows you to perform query and directly use JPA entity object directly inside the template. The jpa queries must be written in JPQL,
-please check the valid database schema in the previous section (case matter!).
+please check the valid database schema in the previous section (case matters!).
In the following example the query loop through the available log files::
--- a/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -26,6 +26,7 @@
<taskdef name="metadatadelete" classname="com.nokia.helium.metadata.ant.taskdefs.MetaDataDeleteTask"/>
<!-- Type definition -->
<typedef name="textmetadatainput" classname="com.nokia.helium.metadata.ant.types.TextLogMetaDataInput"/>
+ <typedef name="coveritymetadatainput" classname="com.nokia.helium.metadata.ant.types.CoverityLogMetaDataInput"/>
<typedef name="antmetadatainput" classname="com.nokia.helium.metadata.ant.types.AntLogMetaDataInput"/>
<typedef name="abldmetadatainput" classname="com.nokia.helium.metadata.ant.types.AbldLogMetaDataInput"/>
<typedef name="sbsmetadatainput" classname="com.nokia.helium.metadata.ant.types.sbs.SBSLogMetaDataInput"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/CoverityLogMetaDataInput.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,103 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+package com.nokia.helium.metadata.ant.types;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import com.nokia.helium.metadata.AutoCommitEntityManager;
+import com.nokia.helium.metadata.MetadataException;
+import com.nokia.helium.metadata.model.metadata.LogFile;
+import com.nokia.helium.metadata.model.metadata.MetadataEntry;
+import com.nokia.helium.metadata.model.metadata.Severity;
+import com.nokia.helium.metadata.model.metadata.SeverityDAO;
+
+/**
+ * This Type is to specify and use the text logparser type to parse and store the data.
+ * This type will not replace any string of format [ababa] with ""
+ * <pre>
+ * <hlm:metadatafilterset id="text_log_metadata_input">
+ * <metadatafilterset filterfile="${project.dir}/../data/common.csv" />
+ * </hlm:metadatafilterset>
+ *
+ * <hlm:coveritymetadatainput>
+ * <fileset dir="${project.dir}/../data/">
+ * <include name="*_fixslashes*.log"/>
+ * </fileset>
+ * <metadatafilterset refid="text_log_metadata_input" />
+ * </hlm:coveritymetadatainput>
+ * </pre>
+ *
+ * @ant.task name="coveritymetadatainput" category="Metadata"
+ */
+public class CoverityLogMetaDataInput extends TextLogMetaDataInput {
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void extract(EntityManagerFactory factory, File file) throws MetadataException {
+ EntityManager em = factory.createEntityManager();
+ AutoCommitEntityManager autoCommitEM = new AutoCommitEntityManager(factory);
+ try {
+ // Get the severities
+ SeverityDAO severityDao = new SeverityDAO();
+ severityDao.setEntityManager(em);
+ Map<String, Severity> priorities = severityDao.getSeverities();
+
+ // Add a logfile entry into the database.
+ LogFile logFile = getLogFile(em, file);
+
+ // Start parsing
+ BufferedReader reader = new BufferedReader(new FileReader(file));
+ String logText = null;
+ int lineNumber = 0;
+ while ((logText = reader.readLine()) != null) {
+ lineNumber++;
+ SeverityEnum.Severity severity = getSeverity(logText);
+ if (severity != SeverityEnum.Severity.NONE) {
+ MetadataEntry entry = new MetadataEntry();
+ entry.setLogFile(autoCommitEM.merge(logFile));
+ entry.setLineNumber(lineNumber);
+ entry.setSeverity(autoCommitEM.merge(priorities.get(severity.toString())));
+ entry.setText(logText);
+ autoCommitEM.persist(entry);
+ }
+ }
+ reader.close();
+ } catch (FileNotFoundException ex) {
+ throw new MetadataException(ex.getMessage(), ex);
+ } catch (IOException ex) {
+ throw new MetadataException(ex.getMessage(), ex);
+ } finally {
+ if (autoCommitEM != null) {
+ autoCommitEM.close();
+ }
+ if (em != null) {
+ em.close();
+ }
+ }
+ }
+
+}
--- a/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/IMakerLogMetaDataInput.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/IMakerLogMetaDataInput.java Mon Oct 18 10:23:52 2010 +0100
@@ -62,7 +62,7 @@
*/
public class IMakerLogMetaDataInput extends AbstractComponentBaseMetadataInput {
public static final String DEFAULT_COMPONENT_NAME = "General";
- private Pattern iMakerFpsxPattern = Pattern.compile("/([^/]*?\\.fpsx)");
+ private Pattern iMakerFpsxPattern = Pattern.compile("/([^/]*?\\.(?:fpsx|bin))");
private EntityManager entityManager;
/**
--- a/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/PolicyLogMetaDataInput.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/PolicyLogMetaDataInput.java Mon Oct 18 10:23:52 2010 +0100
@@ -124,23 +124,32 @@
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("error")) {
- String errorType = attributes.getValue("", "type");
+ String errorType = attributes.getValue("type");
MetadataEntry me = new MetadataEntry();
me.setLogFile(autoCommitEM.merge(logFile));
me.setLineNumber(locator.getLineNumber());
me.setSeverity(severity);
if (errorType.equals("unknownstatus")) {
- me.setText(attributes.getValue("", "message") + attributes.getValue("", "value"));
+ me.setText(attributes.getValue("message") + attributes.getValue("value"));
} else if (errorType.equals("A") || errorType.equals("B")
|| errorType.equals("C") || errorType.equals("D")) {
int flags = Pattern.CASE_INSENSITIVE | Pattern.DOTALL ;
Pattern pattern = Pattern.compile("([\\\\/][^\\\\/]+?)$", flags);
me.setText(pattern.matcher(errorType + "Found incorrect value for "
- + attributes.getValue("", "message")).replaceAll(""));
+ + attributes.getValue("message")).replaceAll(""));
} else if (errorType.equals("missing")) {
- me.setText(attributes.getValue("", "message"));
+ me.setText(attributes.getValue("message"));
} else if (errorType.equals("invalidencoding")) {
- me.setText(attributes.getValue("", "message"));
+ me.setText(attributes.getValue("message"));
+ } else {
+ String message = errorType;
+ if (attributes.getValue("message") != null) {
+ message += " : " + attributes.getValue("message");
+ }
+ if (attributes.getValue("value") != null) {
+ message += ", " + attributes.getValue("value");
+ }
+ me.setText(message);
}
autoCommitEM.persist(me);
}
--- a/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/model/metadata/SysdefCollection.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/model/metadata/SysdefCollection.java Mon Oct 18 10:23:52 2010 +0100
@@ -44,7 +44,7 @@
@Column(name = "ID", nullable = false, unique = true, length = 255)
private String collectionId;
- @Column(name = "NAME", nullable = false, length = 255)
+ @Column(name = "NAME", length = 255)
private String name;
@Column(name = "PACKAGE_ID", insertable = false, updatable = false, nullable = false)
--- a/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/model/metadata/SysdefComponent.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/model/metadata/SysdefComponent.java Mon Oct 18 10:23:52 2010 +0100
@@ -43,7 +43,7 @@
@Column(name = "ID", nullable = false, unique = true, length = 255)
private String componentId;
- @Column(name = "NAME", nullable = false, length = 255)
+ @Column(name = "NAME", length = 255)
private String name;
@Column(name = "COLLECTION_ID", insertable = false, updatable = false, nullable = false)
--- a/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/model/metadata/SysdefPackage.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/model/metadata/SysdefPackage.java Mon Oct 18 10:23:52 2010 +0100
@@ -44,7 +44,7 @@
@Column(name = "ID", nullable = false, unique = true, length = 255)
private String packageId;
- @Column(name = "NAME", nullable = false, length = 255)
+ @Column(name = "NAME", length = 255)
private String name;
@OneToMany
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/model/metadata/SysdefPackage.java.orig Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+package com.nokia.helium.metadata.model.metadata;
+
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+
+/**
+ * This class represent the PACKAGE table in the
+ * database.
+ * Each package name will be unique across the build
+ * that is why it is not link to any specific logFile.
+ */
+@Entity
+public class SysdefPackage {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE)
+ @Column(name = "PACKAGE_ID")
+ private int id;
+
+ @Column(name = "ID", nullable = false, unique = true, length = 255)
+ private String packageId;
+
+ @Column(name = "NAME", nullable = false, length = 255)
+ private String name;
+
+ @Column(name = "LOCATION", nullable = false, length = 4096)
+ private String location;
+
+ @OneToMany(cascade = CascadeType.REMOVE)
+ @JoinColumn(name = "PACKAGE_ID", referencedColumnName = "PACKAGE_ID")
+ private List<Component> components;
+
+ /**
+ * Set the id of the row.
+ * @param id
+ */
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ /**
+ * Get the id of the row.
+ * @return the id
+ */
+ public int getId() {
+ return id;
+ }
+
+ public void setPackageId(String packageId) {
+ this.packageId = packageId;
+ }
+
+ public String getPackageId() {
+ return packageId;
+ }
+}
--- a/buildframework/helium/sf/java/metadata/tests/antunit/test_sysdef_input.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/metadata/tests/antunit/test_sysdef_input.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -94,4 +94,36 @@
</hlm:metadatarecord>
</au:expectfailure>
</target>
+
+ <target name="test-sysdef-metadata-input-without-names">
+ <echo message="test-sysdef-metadata-input-without-names" />
+ <hlm:metadatarecord database="${test.temp.dir}/metadata_1_db">
+ <hlm:sysdefmetadatainput file="../data/sysdef/sysdef3_without_name.xml" epocroot="../" />
+ </hlm:metadatarecord>
+ <fmpp sourceFile="../data/sysdef/sysdef_data.ini.ftl"
+ outputfile="${test.temp.dir}/sysdef_data.ini">
+ <data expandProperties="yes">
+ dbPath: ${test.temp.dir}/metadata_1_db
+ ant: antProperties()
+ </data>
+ </fmpp>
+ <property file="${test.temp.dir}/sysdef_data.ini" />
+ <echo>package.count: ${package.count}</echo>
+ <echo>collection.count: ${collection.count}</echo>
+ <echo>component.count: ${component.count}</echo>
+ <echo>unit.count: ${unit.count}</echo>
+ <au:assertTrue message="Invalid number of packages">
+ <equals arg1="${package.count}" arg2="2" />
+ </au:assertTrue>
+ <au:assertTrue message="Invalid number of collection">
+ <equals arg1="${collection.count}" arg2="2" />
+ </au:assertTrue>
+ <au:assertTrue message="Invalid number of components">
+ <equals arg1="${component.count}" arg2="2" />
+ </au:assertTrue>
+ <au:assertTrue message="Invalid number of units">
+ <equals arg1="${unit.count}" arg2="2" />
+ </au:assertTrue>
+ </target>
+
</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/metadata/tests/data/sysdef/sysdef3_without_name.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : sysdef3.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<SystemDefinition schema="3.0.0" id-namespace="http://www.symbian.org/system-definition" xmlns:qt="http://www.nokia.com/qt">
+<systemModel name="sf_">
+<layer id="app" name="app">
+<package id="helloworldcons" levels="demo">
+<collection id="helloworldcons_apps" level="demo">
+<component id="helloworldcons_app" purpose="development">
+<unit bldFile="sf/app/helloworldcons/group" mrp="sf/app/helloworldcons/" qt:proFile="helloworld.pro" />
+</component>
+</collection>
+</package>
+</layer>
+<layer id="mw" name="mw">
+<package id="helloworldapi" levels="demo">
+<collection id="helloworld_apis" level="demo">
+<component id="helloworld_api" purpose="development">
+<unit bldFile="sf/mw/helloworldapi/group" mrp="sf/mw/helloworldapi/" qt:proFile="helloworldapi.pro" qt:qmakeArgs="-nomoc" />
+</component>
+</collection>
+</package>
+</layer>
+</systemModel>
+</SystemDefinition>
\ No newline at end of file
--- a/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CASummaryTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CASummaryTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -24,10 +24,6 @@
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.SortedSet;
-import java.util.TreeSet;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
@@ -43,6 +39,7 @@
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import org.xml.sax.SAXException;
+import org.apache.tools.ant.BuildException;
/**
@@ -65,10 +62,53 @@
public class CASummaryTask extends Task {
/** String used to look for the tag values in the header xml file **/
- private static String headerExpression = "//issuelist/headerfile/issue/typeid/text()";
+ private static final String HEADER_EXPRESSION = "//issuelist/headerfile/issue/typeid/text()";
/** String used to look for the tag values in the library xml file **/
- private static String libraryExpression = "//issuelist/library/issue/typeid/text()";
+ private static final String LIBRARY_EXPRESSION = "//issuelist/library/issue/typeid/text()";
+
+ /**maximum number of typeIDs available for the library compare file*/
+ private static final int MAX_NUM_TYPE_IDS = 15;
+
+ /** 0 to 14 typeID modes, supplied by Satarupa Pal. Add this i=to the output information to diamonds*/
+ private static final String[] TYPE_MODE = {
+ "unknown",
+ "removed",
+ "added",
+ "moved",
+ "deleted",
+ "inserted",
+ "modified",
+ "added",
+ "modified",
+ "modified",
+ "modified",
+ "modified",
+ "modified",
+ "removed",
+ "not available"};
+
+ /**
+ the BC library output file: xml paths required to retrieve the additional textual information.
+ */
+ private static final String[] SEARCH_PATHS = {
+ "//issuelist/library/issue[typeid = \"0\"]/bc_severity/text()",
+ "//issuelist/library/issue[typeid = \"1\"]/bc_severity/text()",
+ "//issuelist/library/issue[typeid = \"2\"]/bc_severity/text()",
+ "//issuelist/library/issue[typeid = \"3\"]/bc_severity/text()",
+ "//issuelist/library/issue[typeid = \"4\"]/bc_severity/text()",
+ "//issuelist/library/issue[typeid = \"5\"]/bc_severity/text()",
+ "//issuelist/library/issue[typeid = \"6\"]/bc_severity/text()",
+ "//issuelist/library/issue[typeid = \"7\"]/bc_severity/text()",
+ "//issuelist/library/issue[typeid = \"8\"]/typeinfo/text()",
+ "//issuelist/library/issue[typeid = \"9\"]/typeinfo/text()",
+ "//issuelist/library/issue[typeid = \"10\"]/typeinfo/text()",
+ "//issuelist/library/issue[typeid = \"11\"]/typeinfo/text()",
+ "//issuelist/library/issue[typeid = \"12\"]/typeinfo/text()",
+ "//issuelist/library/issue[typeid = \"13\"]/typeinfo/text()",
+ "//issuelist/library/issue[typeid = \"14\"]/typeinfo/text()"};
+
+ private boolean failOnError; //init to default value false
/** The file containing the CA summary data */
private String inputFile;
@@ -172,6 +212,24 @@
return header;
}
+ /**
+ * Defines if the task should fail in case of error.
+ * @param failOnError
+ * @ant.not-required Default true
+ */
+ public void setFailOnError(boolean failOnError) {
+ this.failOnError = failOnError;
+ }
+
+ /**
+ * Shall we fail in case of issue.
+ * @return
+ */
+ public boolean shouldFailOnError() {
+ System.out.println(" failOnError = " + failOnError);
+ return failOnError;
+ }
+
/** the main part of the code - the method that is called */
public void execute() {
log("CASummaryTask execute method with input file : " + inputFile, Project.MSG_ERR);
@@ -189,25 +247,35 @@
log("FileNotFoundException while getting the input file. : " + inputFile + " "
+ exc.getMessage(), Project.MSG_ERR);
inputFileFound = false; // stops an empty output file being created.
+ if (shouldFailOnError()) {
+ throw new BuildException(exc.getMessage(), exc);
+ }
}
+
if (inputFileFound) {
try {
// write the title stuff for the XML diamonds schema
output = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(getoutputFile()), "UTF8"));
- }
- catch (FileNotFoundException exc) {
+ } catch (FileNotFoundException exc) {
log("FileNotFoundException while getting the output file. : " + getoutputFile()
+ " " + exc.getMessage(), Project.MSG_ERR);
- }
- catch (UnsupportedEncodingException exc) {
+ if (shouldFailOnError()) {
+ throw new BuildException(exc.getMessage(), exc);
+ }
+ } catch (UnsupportedEncodingException exc) {
// We are Ignoring the errors as no need to fail the build.
log("UnsupportedEncodingException while creating the output file : "
+ getoutputFile() + " " + exc.getMessage(), Project.MSG_ERR);
- }
- catch (SecurityException exc) {
+ if (shouldFailOnError()) {
+ throw new BuildException(exc.getMessage(), exc);
+ }
+ } catch (SecurityException exc) {
// We are Ignoring the errors as no need to fail the build.
log("SecurityException while creating the output file : " + getoutputFile() + " "
+ exc.getMessage(), Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(exc.getMessage(), exc);
+ }
}
if (output != null) {
@@ -226,11 +294,11 @@
if (tempheader) {
output.write(" <quality aspect=\"compatibility-headers\"> \r\n");
// process each line
- findTextAndOutput(headerExpression); // read input file and write the output
+ findHeaderTextAndOutput(HEADER_EXPRESSION); // read input file and write the output
} else {
output.write(" <quality aspect=\"compatibility-libs\"> \r\n");
// process each line
- findTextAndOutput(libraryExpression); // read input file and write the output
+ findLibTextAndOutput(LIBRARY_EXPRESSION); // read input file and write the output
}
// write the end of file text
@@ -249,17 +317,26 @@
catch (FileNotFoundException exc) {
log("FileNotFoundException while getting the diamonds header file : "
+ getdiamondsHeaderFileName() + " " + exc.getMessage(), Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(exc.getMessage(), exc);
+ }
}
catch (IOException exc) {
// We are Ignoring the errors as no need to fail the build.
log("IOException : " + getdiamondsHeaderFileName() + " output file = "
+ getoutputFile() + " " + exc.getMessage(), Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(exc.getMessage(), exc);
+ }
}
catch (IllegalArgumentException exc) {
// We are Ignoring the errors as no need to fail the build.
log("IllegalArgumentException : " + getdiamondsHeaderFileName()
+ " output file = " + getoutputFile() + " " + exc.getMessage(), Project.MSG_ERR);
- }
+ if (shouldFailOnError()) {
+ throw new BuildException(exc.getMessage(), exc);
+ }
+ }
}
else {
log("Error: no output File available ", Project.MSG_ERR);
@@ -270,17 +347,187 @@
}
}
+ /**
+ class for recording the number of occurances of a typeID for the library comparison output.
+ */
+ private class HeaderInfo {
+ private int typeId;
+ private long numOccurances;
+
+ /**
+ * @param typeId the type ID of the issue
+ * @ant.required
+ */
+ private void settypeId(int typeId) {
+ this.typeId = typeId;
+ }
+
+ /**
+ * @return the typeID
+ */
+ private int gettypeId() {
+ return typeId;
+ }
+
+ /**
+ * @param numOccurances the number of times the type ID appears in the output file
+ * @ant.required
+ */
+ public void setnumOccurances(long numOccurances) {
+ this.numOccurances = numOccurances;
+ }
+
+ /**
+ * @return the number of occurrance of the typeID
+ */
+ public long getnumOccurances() {
+ return numOccurances;
+ }
+ }
+
+
/**
* This is the function that performs the actual file searches and writes the number of occurances
* of each typeID to the output xml file
*/
- private void findTextAndOutput(String expression) {
+ private void findHeaderTextAndOutput(String expression) {
String value;
- Integer count;
+
/** place to store the number of typeids found */
- Hashtable<Integer, Integer> typeIds = new Hashtable<Integer, Integer>();
+ HeaderInfo[] headerinf = new HeaderInfo[MAX_NUM_TYPE_IDS];
int tempKey;
- int tempVal;
+
+ //initialise the array of typeIDs
+ int sizevar = headerinf.length;
+ for (int i = 0; i < MAX_NUM_TYPE_IDS; i++) {
+ headerinf[i] = new HeaderInfo();
+ headerinf[i].typeId = i;
+ headerinf[i].numOccurances = 0;
+ }
+ try {
+ DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = docFactory.newDocumentBuilder();
+ Document doc = builder.parse(getinputFile());
+
+ //creating an XPathFactory:
+ XPathFactory factory = XPathFactory.newInstance();
+ //using this factory to create an XPath object:
+ XPath xpath = factory.newXPath();
+ //XPath object created compiles the XPath expression:
+ XPathExpression expr = xpath.compile(expression);
+
+ //expression is evaluated with respect to a certain context node which is doc.
+ Object result = expr.evaluate(doc, XPathConstants.NODESET);
+ NodeList nodeList = (NodeList) result;
+ //and scan through the list
+ for (int i = 0; i < nodeList.getLength(); i++) {
+ value = nodeList.item(i).getNodeValue(); //get the value as a string from the xml file
+ tempKey = Integer.parseInt(value); //convert it to an integer
+ if (tempKey < MAX_NUM_TYPE_IDS) {
+ headerinf[tempKey].numOccurances++; //increase the number of occurances
+ } else {
+ log("tempKey out of range");
+ }
+ }
+
+ boolean noErrors = true; //so we print something when no data present
+ for (int i = 0; i < MAX_NUM_TYPE_IDS; i++) //typeIDS 1 to 14
+ {
+ if (headerinf[i].numOccurances != 0) {
+ noErrors = false;
+ String headSearchPath = "//issuelist/headerfile/issue[typeid = \"" + i + "\"]/typestring/text()";
+ //XPath object created compiles the XPath expression:
+ XPathExpression typeInfoExpr = xpath.compile(headSearchPath);
+ //expression is evaluated with respect to a certain context node which is doc.
+ Object typeInfoResult = typeInfoExpr.evaluate(doc, XPathConstants.NODESET);
+ NodeList typeInfoNodeList = (NodeList) typeInfoResult;
+ output.write(" <summary message=\"typeID:" + headerinf[i].typeId +
+ ":" + typeInfoNodeList.item(0).getNodeValue() + ":occurs \" value=\"" + headerinf[i].numOccurances + "\"/> \r\n");
+ }
+ }
+ if (noErrors) {
+ output.write(" <summary message=\"number of errors present \" value=\"0\"/> \r\n");
+ }
+ } catch (ParserConfigurationException err) {
+ log("Error: ParserConfigurationException: trying to parse xml file ", Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(err.getMessage(), err);
+ }
+ } catch (SAXException err) {
+ log("Error: SAXException: trying to parse xml file ", Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(err.getMessage(), err);
+ }
+ } catch (XPathExpressionException err) {
+ log("Error: XPathExpressionException: trying to parse xml file ", Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(err.getMessage(), err);
+ }
+ } catch (IOException err) {
+ log("Error: IOException: trying to parse xml file ", Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(err.getMessage(), err);
+ }
+ }
+ }
+
+ /**
+ class for recording the number of occurances of a typeID for the library comparison output.
+ */
+ private class LibraryInfo {
+ private int typeId;
+ private long numOccurances;
+
+ /**
+ * @param typeId the type ID of the issue
+ * @ant.required
+ */
+ private void settypeId(int typeId) {
+ this.typeId = typeId;
+ }
+
+ /**
+ * @return the typeID
+ */
+ private int gettypeId() {
+ return typeId;
+ }
+
+ /**
+ * @param numOccurances the number of times the type ID appears in the output file
+ * @ant.required
+ */
+ public void setnumOccurances(long numOccurances) {
+ this.numOccurances = numOccurances;
+ }
+
+ /**
+ * @return the number of occurrance of the typeID
+ */
+ public long getnumOccurances() {
+ return numOccurances;
+ }
+ }
+
+ /**
+ * This is the function that performs the actual file searches and writes the number of occurances
+ * of each typeID to the output xml file
+ */
+ private void findLibTextAndOutput(String expression) {
+
+ String value;
+
+ /** place to store the number of typeids found */
+ LibraryInfo[] libraryinf = new LibraryInfo[MAX_NUM_TYPE_IDS];
+ int tempKey;
+
+ //initialise the array of typeIDs
+ int sizevar = libraryinf.length;
+ for (int i = 0; i < MAX_NUM_TYPE_IDS; i++) {
+ libraryinf[i] = new LibraryInfo();
+ libraryinf[i].typeId = i;
+ libraryinf[i].numOccurances = 0;
+ }
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
@@ -296,33 +543,55 @@
//expression is evaluated with respect to a certain context node which is doc.
Object result = expr.evaluate(doc, XPathConstants.NODESET);
+ //create a node list
NodeList nodeList = (NodeList) result;
+ //and scan through the list
for (int i = 0; i < nodeList.getLength(); i++) {
- value = nodeList.item(i).getNodeValue(); //get the value as a string from the xml file
- tempKey = Integer.parseInt(value); //convert it to an integer so they can be sorted
- if (!typeIds.containsKey(tempKey)) { //see if the typeID is already present in the hashtable
- typeIds.put(tempKey, 0); //it's not so create it (stops null pointer exceptions)
+ value = nodeList.item(i).getNodeValue(); //get the value as a string from the xml file
+ tempKey = Integer.parseInt(value); //convert it to an integer
+ if (tempKey < MAX_NUM_TYPE_IDS) {
+ libraryinf[tempKey].numOccurances++; //increase the number of occurances
+ } else {
+ log("tempKey out of range");
}
- count = typeIds.get(tempKey); //get the current count of this typeID
- count++; //inc the count
- typeIds.put(tempKey, count); //write it back to the hashtable
}
-
- //now sort and write to xml file
- SortedSet<Integer> sortedset = new TreeSet<Integer>(typeIds.keySet());
- Iterator<Integer> sorted = sortedset.iterator();
- while (sorted.hasNext()) { //go through each one on the file and write to xml output file
- tempVal = sorted.next();
- output.write(" <summary message=\"type ID " + tempVal + " occurs \" value=\"" + typeIds.get(tempVal) + "\"/> \r\n");
+
+ boolean noErrors = true; //so we print something when no data present
+ for (int i = 1; i < MAX_NUM_TYPE_IDS; i++) { //typeIDS 1 to 14
+ if (libraryinf[i].numOccurances != 0) {
+ noErrors = false;
+ //XPath object created compiles the XPath expression:
+ XPathExpression typeInfoExpr = xpath.compile(SEARCH_PATHS[i]);
+ //expression is evaluated with respect to a certain context node which is doc.
+ Object typeInfoResult = typeInfoExpr.evaluate(doc, XPathConstants.NODESET);
+ NodeList typeInfoNodeList = (NodeList) typeInfoResult;
+ output.write(" <summary message=\"typeID:" + libraryinf[i].typeId + ":mode:" + TYPE_MODE[i] +
+ ":" + typeInfoNodeList.item(0).getNodeValue() + ":occurs \" value=\"" + libraryinf[i].numOccurances + "\"/> \r\n");
+ }
+ }
+ if (noErrors) {
+ output.write(" <summary message=\"number of errors present \" value=\"0\"/> \r\n");
+ }
+ } catch (XPathExpressionException err) {
+ log("Error: XPathExpressionException: trying to parse xml file ", Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(err.getMessage(), err);
}
} catch (ParserConfigurationException err) {
log("Error: ParserConfigurationException: trying to parse xml file ", Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(err.getMessage(), err);
+ }
} catch (SAXException err) {
log("Error: SAXException: trying to parse xml file ", Project.MSG_ERR);
- } catch (XPathExpressionException err) {
- log("Error: XPathExpressionException: trying to parse xml file ", Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(err.getMessage(), err);
+ }
} catch (IOException err) {
log("Error: IOException: trying to parse xml file ", Project.MSG_ERR);
+ if (shouldFailOnError()) {
+ throw new BuildException(err.getMessage(), err);
+ }
}
}
--- a/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CMTSummaryTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CMTSummaryTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -304,7 +304,6 @@
lineLen = 0;
}
else {
- log("can't find the '=' at end of line ", Project.MSG_ERR);
lineLen = 0;
}
}
@@ -322,7 +321,6 @@
}
else {
lineLen = 0;
- log("can't find the digits at beg of line ", Project.MSG_ERR);
}
}
else {
--- a/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CMTToolTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CMTToolTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -49,7 +49,7 @@
* fileset: Location of the source files whose complexity is to be measured.
* </pre>
*
- * @ant.task name="cmt" category="Quality".
+ * @ant.task name="cmt" category="Quality"
*/
public class CMTToolTask extends Task {
--- a/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CodeScannerTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CodeScannerTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -21,6 +21,7 @@
import java.util.Vector;
import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.ExecTask;
import org.apache.tools.ant.types.Path;
@@ -57,11 +58,13 @@
public class CodeScannerTask extends Task {
private Vector<Path> paths = new Vector<Path>();
private File configuration;
- private String dest;
+ private File dest;
private String format = "xml,html";
private boolean auto;
private File log;
- private boolean failonerror;
+ private boolean failonerror = true;
+ private String lxrURL;
+ private File sourceDir;
/**
* This defines if the task should fails in case of error while executing codescanner.
@@ -86,7 +89,7 @@
* Get dest attribute.
*
*/
- public String getDest() {
+ public File getDest() {
return this.dest;
}
@@ -96,7 +99,7 @@
* @param dest
* @ant.required
*/
- public void setDest(String dest) {
+ public void setDest(File dest) {
this.dest = dest;
}
@@ -157,17 +160,33 @@
}
/**
+ * Set lxr URL to update the codescanner html output files.
+ * @param lxrURL the lxrURL to set
+ */
+ public void setLxrURL(String lxrURL) {
+ this.lxrURL = lxrURL;
+ }
+
+ /**
+ * Set the source folder path in case lxr URL property is set.
+ * @param sourceDir the sourceDir to set
+ */
+ public void setSourceDir(File sourceDir) {
+ this.sourceDir = sourceDir;
+ }
+
+ /**
* {@inheritDoc}
*/
@Override
public void execute() {
// creating the exec subtask
ExecTask task = new ExecTask();
- task.setProject(getProject());
- task.setTaskName(this.getTaskName());
+ task.bindToOwner(this);
task.setFailonerror(failonerror);
task.setExecutable("codescanner");
task.setDir(new File("."));
+ String commandString = "codescanner";
if (dest == null) {
throw new BuildException("'dest' attribute must be defined");
}
@@ -178,6 +197,7 @@
else {
task.createArg().setValue("-c");
task.createArg().setValue(configuration.getAbsolutePath());
+ commandString += " -c " + configuration.getAbsolutePath();
}
}
else {
@@ -190,7 +210,7 @@
// -t off
task.createArg().setValue("-t");
task.createArg().setValue(auto ? "on" : "off");
-
+ commandString += " -t " + (auto ? "on" : "off");
// -l log
if (log != null) {
this.log("Output log: " + log.getAbsolutePath());
@@ -201,34 +221,66 @@
// -o type
task.createArg().setValue("-o");
task.createArg().setValue(format);
- if (paths.isEmpty()) {
- throw new BuildException("No input directory defined");
- }
- // Getting the list of source dir to scan
- Vector<String> srcs = new Vector<String>();
- for (Path path : paths) {
- if (path.isReference()) {
- path = (Path) path.getRefid().getReferencedObject();
+ commandString += " -o " + format;
+
+ if (this.lxrURL != null ) {
+ if (this.sourceDir == null) {
+ throw new BuildException("'sourceDir' attribute must be defined");
+ }
+ if (!paths.isEmpty() ) {
+ throw new BuildException("Nested path element are not allowed when lxrURL attribute is in use.");
+ }
+ task.createArg().setValue("-x");
+ task.createArg().setValue(this.lxrURL);
+ commandString += " -x " + this.lxrURL;
+ task.createArg().setValue(sourceDir.getAbsolutePath());
+ commandString += " " + sourceDir.getAbsolutePath();
+ } else {
+ if (paths.isEmpty()) {
+ throw new BuildException("No input directory defined");
}
- for (String apath : path.list()) {
- srcs.add(apath);
+
+ // Getting the list of source dir to scan
+ Vector<String> srcs = new Vector<String>();
+ for (Path path : paths) {
+ if (path.isReference()) {
+ path = (Path) path.getRefid().getReferencedObject();
+ }
+ for (String apath : path.list()) {
+ srcs.add(apath);
+ }
+ }
+ for (int i = 0; i < srcs.size(); i++) {
+ if (i != srcs.size() - 1) {
+ task.createArg().setValue("-i");
+ task.createArg().setValue(srcs.elementAt(i));
+ commandString += " -i " + srcs.elementAt(i);
+ }
+ else {
+ task.createArg().setValue(srcs.elementAt(i));
+ commandString += " " + srcs.elementAt(i);
+ }
}
}
- for (int i = 0; i < srcs.size(); i++) {
- if (i != srcs.size() - 1) {
- task.createArg().setValue("-i");
- task.createArg().setValue(srcs.elementAt(i));
- }
- else {
- task.createArg().setValue(srcs.elementAt(i));
- task.createArg().setValue(dest.toString());
+
+ // output path
+ task.createArg().setValue(dest.getAbsolutePath());
+ commandString += " " + dest.getAbsolutePath();
+ this.log("Output dir " + dest.getAbsolutePath());
+
+ // Run codescanner
+ try {
+ log("Running codescanner with arguments '" + commandString + "'");
+ task.execute();
+ } catch (BuildException be) {
+ if (this.failonerror) {
+ throw new BuildException("Errors occured while running 'codescanner'", be);
+ } else {
+ log("Errors occured while running 'codescanner' " + be.getMessage(), Project.MSG_ERR);
}
}
- // output path
- this.log("Output dir " + dest);
-
- // Run codescanner
- task.execute();
+
+
this.log("Successfully executed codescanner");
}
}
--- a/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CoverityTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/src/com/nokia/helium/quality/ant/taskdefs/CoverityTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -23,6 +23,7 @@
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.ExecTask;
+import com.nokia.helium.core.ant.MappedVariable;
import com.nokia.helium.core.ant.types.VariableImpl;
import com.nokia.helium.core.ant.types.VariableSet;
@@ -40,7 +41,7 @@
*
* </pre>
*
- * @ant.task name="coverity" category="Quality".
+ * @ant.task name="coverity" category="Quality"
*
*/
@@ -51,6 +52,7 @@
private boolean execute = true;
private boolean append;
private File error;
+ private File output;
private String dir;
private Vector<VariableSet> coverityOptions = new Vector<VariableSet>();
private Vector<VariableImpl> coverityArgs = new Vector<VariableImpl>();
@@ -81,17 +83,32 @@
task.setTaskName(this.getTaskName());
task.setFailonerror(failOnError);
task.setError(this.error);
+ if (this.output != null) {
+ task.setOutput(this.output);
+ }
task.setAppend(isAppend());
task.setExecutable(command);
task.setDir(new File(this.dir));
for (VariableSet coverityArg : coverityOptions) {
+
+ for (MappedVariable variable : coverityArg.getVariables()) {
+ if (variable.getName().equals("--password") || variable.getName().equals("-pa")) {
+ commandString += " " + variable.getName() + " ********";
+ } else {
+ commandString += " " + variable.getName() + " " + variable.getValue();
+ }
+ }
task.createArg().setLine(coverityArg.getParameter(" "));
- commandString += " " + coverityArg.getParameter(" ");
+
}
for (VariableImpl coverityArg : coverityArgs) {
+ if (coverityArg.getName().equals("--password") || coverityArg.getName().equals("-pa")) {
+ commandString += " " + coverityArg.getName() + " ********";
+ } else {
+ commandString += " " + coverityArg.getName() + " " + coverityArg.getValue();
+ }
task.createArg().setLine(coverityArg.getParameter(" "));
- commandString += " " + coverityArg.getParameter(" ");
}
try {
@@ -183,6 +200,20 @@
}
/**
+ * @param output the output to set
+ */
+ public void setOutput(File output) {
+ this.output = output;
+ }
+
+ /**
+ * @return the output
+ */
+ public File getOutput() {
+ return output;
+ }
+
+ /**
* @param append the append to set
*/
public void setAppend(boolean append) {
--- a/buildframework/helium/sf/java/quality/tests/antunit/test_ca.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/tests/antunit/test_ca.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -32,7 +32,6 @@
<property name="temp.diamonds.footer.xml" location="${ca.output.dir}/ca/diamonds_footer.xml" />
<property name="diamonds.build.output.dir" location="${ca.output.dir}/ca" />
- <property name="bc.config.dir.name" location="" />
<!-- is called prior to the test -->
<target name="setUp">
@@ -57,12 +56,11 @@
<!--
**************************************************************
- ** test CMT for windows
+ ** test CA for windows
**************************************************************
-->
<target name="test-ca-header-with-all-reqd-params-set" >
- <echo> output file is ${diamonds.build.output.dir} </echo>
<hlm:casummary diamondsHeaderFileName="${temp.diamonds.header.xml}" diamondsFooterFileName="${temp.diamonds.footer.xml}"
header="true"
outputFile="${ca.output.dir}/ca/ca_summary_header_ok.xml"
@@ -75,7 +73,7 @@
</filterchain>
</loadfile>
<echo>${header.ok}</echo>
- <au:assertTrue message="type ID 13 occurs ">
+ <au:assertTrue message="typeID:13:has compilation errors:occurs ">
<contains string="${header.ok}"
substring="value=" />
</au:assertTrue>
@@ -95,10 +93,27 @@
</loadfile>
<echo>${header.notypeids}</echo>
<au:assertTrue message="compatibility-headers">
- <not>
- <contains string="${header.notypeids}"
- substring="summary message" />
- </not>
+ <contains string="${header.notypeids}"
+ substring="number of errors present" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-ca-header-no-issues" >
+ <hlm:casummary diamondsHeaderFileName="${temp.diamonds.header.xml}" diamondsFooterFileName="${temp.diamonds.footer.xml}"
+ header="true"
+ outputFile="${ca.output.dir}/ca/ca_summary_header_noissues.xml"
+ inputFile="${test.data.src}/headers_report_noissues.xml" />
+ <au:assertLogContains text="CASummaryTask execute"/>
+ <au:assertFileExists file="${ca.output.dir}\ca\ca_summary_header_noissues.xml"/>
+ <loadfile property="header.no.issues" srcfile="${ca.output.dir}/ca/ca_summary_header_noissues.xml">
+ <filterchain>
+ <replaceregex pattern="\\(:|\\)" replace="\1" flags="g" />
+ </filterchain>
+ </loadfile>
+ <echo>${header.no.issues}</echo>
+ <au:assertTrue message="compatibility-headers">
+ <contains string="${header.no.issues}"
+ substring="number of errors present" />
</au:assertTrue>
</target>
@@ -117,15 +132,37 @@
<echo>${libraries.ok}</echo>
<au:assertTrue message="compatibility-libs">
<contains string="${libraries.ok}"
- substring="type ID 14 occurs" />
+ substring="typeID:6:mode:modified:None:occurs" />
+ </au:assertTrue>
+ <au:assertTrue message="compatibility-libs">
+ <contains string="${libraries.ok}"
+ substring="typeID:2:mode:added:Informative:occurs" />
+ </au:assertTrue>
+ <au:assertTrue message="compatibility-libs">
+ <contains string="${libraries.ok}"
+ substring="typeID:14:mode:not available:Baseline DLL is not available for analysis:occurs" />
</au:assertTrue>
</target>
- <target name="test-ca-library-fail" >
+ <target name="test-ca-library-fail-failOnError-true" >
+ <property name="bc.fail.on.error" value="true" />
+ <au:expectfailure message="not stop the build if failOnError is set to false">
<hlm:casummary diamondsHeaderFileName="${temp.diamonds.header.xml}" diamondsFooterFileName="${temp.diamonds.footer.xml}"
header="false"
outputFile="${ca.output.dir}/ca/ca_summary_library_fail.xml"
- inputFile="${test.data.src}/libraries_report_fail.xml" />
+ inputFile="${test.data.src}/libraries_report_fail.xml"
+ failOnError="${bc.fail.on.error}" />
+ <au:assertFileDoesntExist file="${ca.output.dir}\ca\ca_summary_library_fail.xml" />
+ <au:assertLogContains text="FileNotFoundException while getting the input file" />
+ </au:expectfailure>
+ </target>
+
+ <target name="test-ca-library-fail-failOnError-false" >
+ <hlm:casummary diamondsHeaderFileName="${temp.diamonds.header.xml}" diamondsFooterFileName="${temp.diamonds.footer.xml}"
+ header="false"
+ outputFile="${ca.output.dir}/ca/ca_summary_library_fail.xml"
+ inputFile="${test.data.src}/libraries_report_fail.xml"
+ failOnError="false"/>
<au:assertFileDoesntExist file="${ca.output.dir}\ca\ca_summary_library_fail.xml" />
<au:assertLogContains text="FileNotFoundException while getting the input file" />
</target>
@@ -144,8 +181,53 @@
<echo>${libraries.one.id}</echo>
<au:assertTrue message="compatibility-libs">
<contains string="${libraries.one.id}"
- substring="type ID 7 occurs" />
+ substring="typeID:7:mode:added:Informative:occurs" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-ca-library-no-ids" >
+ <hlm:casummary diamondsHeaderFileName="${temp.diamonds.header.xml}" diamondsFooterFileName="${temp.diamonds.footer.xml}"
+ header="false"
+ outputFile="${ca.output.dir}/ca/ca_summary_library_no_ids.xml"
+ inputFile="${test.data.src}/libraries_report_no_ids.xml" />
+ <au:assertFileExists file="${ca.output.dir}\ca\ca_summary_library_no_ids.xml" />
+ <loadfile property="libraries.no.id" srcfile="${ca.output.dir}/ca/ca_summary_library_no_ids.xml">
+ <filterchain>
+ <replaceregex pattern="\\(:|\\)" replace="\1" flags="g" />
+ </filterchain>
+ </loadfile>
+ <echo>${libraries.no.id}</echo>
+ <au:assertTrue message="compatibility-libs">
+ <contains string="${libraries.no.id}"
+ substring="number of errors present" />
</au:assertTrue>
</target>
+
+ <target name="test-ca-library-no-issues" >
+ <hlm:casummary diamondsHeaderFileName="${temp.diamonds.header.xml}" diamondsFooterFileName="${temp.diamonds.footer.xml}"
+ header="false"
+ outputFile="${ca.output.dir}/ca/ca_summary_library_noissues.xml"
+ inputFile="${test.data.src}/libraries_report_noissues.xml" />
+ <au:assertFileExists file="${ca.output.dir}\ca\ca_summary_library_noissues.xml" />
+ <loadfile property="libraries.no.issues" srcfile="${ca.output.dir}/ca/ca_summary_library_noissues.xml">
+ <filterchain>
+ <replaceregex pattern="\\(:|\\)" replace="\1" flags="g" />
+ </filterchain>
+ </loadfile>
+ <echo>${libraries.no.issues}</echo>
+ <au:assertTrue message="compatibility-libs">
+ <contains string="${libraries.no.issues}"
+ substring="number of errors present" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-ca-library-no-input-file-no-fail" >
+ <hlm:casummary diamondsHeaderFileName="${temp.diamonds.header.xml}" diamondsFooterFileName="${temp.diamonds.footer.xml}"
+ header="false"
+ outputFile="${ca.output.dir}/ca/ca_summary_library_nofile.xml"
+ inputFile="${test.data.src}/libraries_report_nofile.xml"
+ failOnError = "false" />
+ <au:assertFileDoesntExist file="${ca.output.dir}\ca\ca_summary_library_nofile.xml" />
+ </target>
</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/quality/tests/antunit/test_codescanner.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/tests/antunit/test_codescanner.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -62,6 +62,7 @@
configuration="${codescanner.config}">
<path refid="src.path"/>
</hlm:codescanner>
+ <au:assertLogContains text="Running codescanner with arguments 'codescanner -c"/>
<au:assertLogContains text="Successfully executed codescanner"/>
<au:assertLogContains text="Output format: xml,html"/>
<au:assertLogContains text="data\src\exclude.txt"/>
@@ -113,4 +114,41 @@
<au:assertLogContains text="data\src2\exclude.txt"/>
<au:assertFileExists file="${codescanner.output.dir}/problemIndex.xml"/>
</target>
+
+ <target name="test-codescanner-with-lxr-without-source-dir">
+ <au:expectfailure expectedMessage="'sourceDir' attribute must be defined">
+ <hlm:codescanner dest="${codescanner.output.dir}"
+ format="${codescanner.output.type}"
+ configuration="${codescanner.config}"
+ lxrurl="http://codescanner.lxr.server.com/source">
+ <path refid="src.path.two.path"/>
+ </hlm:codescanner>
+ </au:expectfailure>
+ <au:assertFileExists file="${codescanner.output.dir}" message="codescanner task is not able to create dest folder."/>
+ </target>
+
+ <target name="test-codescanner-with-lxr-with-source-dir-and-path">
+ <au:expectfailure expectedMessage="Nested path element are not allowed when lxrURL attribute is in use">
+ <hlm:codescanner dest="${codescanner.output.dir}"
+ format="${codescanner.output.type}"
+ configuration="${codescanner.config}"
+ lxrurl="http://codescanner.lxr.server.com/source"
+ sourcedir="../data">
+ <path refid="src.path.two.path"/>
+ </hlm:codescanner>
+ </au:expectfailure>
+ <au:assertFileExists file="${codescanner.output.dir}" message="codescanner task is not able to create dest folder."/>
+ </target>
+
+ <target name="test-codescanner-with-lxr-without-input-dir" if="do.codescanner.test">
+ <hlm:codescanner dest="${codescanner.output.dir}"
+ format="${codescanner.output.type}"
+ configuration="${codescanner.config}"
+ lxrurl="http://codescanner.lxr.server.com/source"
+ sourcedir="../data/src"/>
+ <au:assertLogContains text="-x http://codescanner.lxr.server.com/source"/>
+ <au:assertFileExists file="${codescanner.output.dir}" message="codescanner task is not able to create dest folder."/>
+ </target>
+
+
</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/quality/tests/data/headers_report_noissues.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="ASCII" standalone="no" ?>
+<?xml-stylesheet type="text/xsl" href="BBCResults.xsl"?>
+<!--
+============================================================================
+Name : headers_report_noissues.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<bbcresults>
+
+ <issuelist>
+ <headerfile>
+ <filename>C:\Symbian\9.2\S60_3rd_FP1_2\epoc32\include\_sdpdefs.h</filename>
+ <api category="Unknown" name="Unknown"/>
+ </headerfile>
+ <headerfile>
+ <filename>C:\Symbian\9.2\S60_3rd_FP1_2\epoc32\include\_sipcodecdefs.h</filename>
+ <api category="Unknown" name="Unknown"/>
+ </headerfile>
+ <headerfile>
+ <filename>C:\Symbian\9.2\S60_3rd_FP1_2\epoc32\include\animationcmd.h</filename>
+ <api category="Unknown" name="Unknown"/>
+ </headerfile>
+ </issuelist>
+</bbcresults>
--- a/buildframework/helium/sf/java/quality/tests/data/headers_report_ok.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/tests/data/headers_report_ok.xml Mon Oct 18 10:23:52 2010 +0100
@@ -31,6 +31,7 @@
<issueid>60</issueid>
<typeid>13</typeid>
<identityid>13</identityid>
+ <typestring>has compilation errors</typestring>
<severity>
<typeid>1</typeid>
<typestring>BBC Break</typestring>
@@ -48,6 +49,22 @@
<issueid>62</issueid>
<typeid>13</typeid>
<identityid>13</identityid>
+ <typestring>has compilation errors</typestring>
+ <identitydescription>File</identitydescription>
+ <severity>
+ <typeid>1</typeid>
+ <typestring>BBC Break</typestring>
+ </severity>
+ <scseverity>
+ <typeid>1</typeid>
+ <typestring>SC Break</typestring>
+ </scseverity>
+ </issue>
+ <issue>
+ <issueid>63</issueid>
+ <typeid>6</typeid>
+ <identityid>13</identityid>
+ <typestring>has changed parameters</typestring>
<identitydescription>File</identitydescription>
<severity>
<typeid>1</typeid>
@@ -66,6 +83,7 @@
<issueid>5</issueid>
<typeid>0</typeid>
<identityid>13</identityid>
+ <typestring>has been removed</typestring>
<severity>
<typeid>1</typeid>
<typestring>BBC Break</typestring>
@@ -75,6 +93,35 @@
<typestring>SC Break</typestring>
</scseverity>
</issue>
+ <issue>
+ <issueid>519</issueid>
+ <typeid>13</typeid>
+ <typestring>has compilation errors</typestring>
+ <cause/>
+ <documentation>Not specified</documentation>
+ <severity>
+ <typeid>1</typeid>
+ <typestring>BBC Break</typestring>
+ </severity>
+ </issue>
+ </headerfile>
+ <headerfile>
+ <filename>c:\symbian\9.2\s60_3rd_fp1_2\epoc32\include\avkon.rh</filename>
+ <comparefilename>j:\epoc32\include\platform\mw\avkon.rh</comparefilename>
+ <api category="Unknown" name="Unknown"/>
+ <issue>
+ <issueid>0</issueid>
+ <typeid>12</typeid>
+ <typestring>has changed its initialisation value</typestring>
+ <cause>avkon_multiselection_list_query_list::flags</cause>
+ <documentation>Not specifiedavkon_multiselection_list_query_list::flags</documentation>
+ <scseverity>
+ <typeid>1</typeid>
+ <typestring>SC Break</typestring>
+ </scseverity>
+ </issue>
+ <checksum>xZxyUIjD0pqjT</checksum>
+ <shortname>platform\mw\avkon.rh</shortname>
</headerfile>
</issuelist>
</bbcresults>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/quality/tests/data/libraries_report_no_ids.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ASCII" standalone="no" ?>
+<?xml-stylesheet type="text/xsl" href="BBCResults.xsl"?>
+<!--
+============================================================================
+Name : libraries_report_no_ids.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<bbcresults>
+ <issuelist>
+ <library>
+ <name>C:\Symbian\9.2\S60_3rd_FP1_2\aknicon.dso</name>
+ <currentplatform>armv5</currentplatform>
+ </library>
+ </issuelist>
+
+</bbcresults>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/quality/tests/data/libraries_report_noissues.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ASCII" standalone="no" ?>
+<?xml-stylesheet type="text/xsl" href="BBCResults.xsl"?>
+<!--
+============================================================================
+Name : libraries_report_noissues.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<bbcresults>
+ <issuelist>
+ <library>
+ <name>C:\Symbian\9.2\S60_3rd_FP1_2\aknicon.dso</name>
+ <currentplatform>armv5</currentplatform>
+ <name>C:\Symbian\9.2\S60_3rd_FP1_2\epoc32\release\armv5\lib\hal.dso</name>
+ <comparefilename>J:\epoc32\release\armv5\lib\hal.dso</comparefilename>
+ <shortname>hal</shortname>
+ <baseplatform>armv5</baseplatform>
+ <currentplatform>armv5</currentplatform>
+ </library>
+ <library>
+ <name>C:\Symbian\9.2\S60_3rd_FP1_2\epoc32\release\armv5\lib\irs.dso</name>
+ <comparefilename>J:\epoc32\release\armv5\lib\irs.dso</comparefilename>
+ <shortname>irs</shortname>
+ <baseplatform>armv5</baseplatform>
+ <currentplatform>armv5</currentplatform>
+ </library>
+ </issuelist>
+
+</bbcresults>
--- a/buildframework/helium/sf/java/quality/tests/data/libraries_report_ok.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/tests/data/libraries_report_ok.xml Mon Oct 18 10:23:52 2010 +0100
@@ -23,7 +23,7 @@
-->
<bbcresults>
<issuelist>
- <library>
+ <library>
<name>C:\Symbian\9.2\S60_3rd_FP1_2\aknicon.dso</name>
<currentplatform>armv5</currentplatform>
<issue>
@@ -36,49 +36,191 @@
<bc_severity>Informative</bc_severity>
<sc_severity>None</sc_severity>
</issue>
- </library>
- <library>
- <name>C:\Symbian\9.2\S60_3rd_FP1_2\aknnotify.dso</name>
+ <name>C:\Symbian\9.2\S60_3rd_FP1_2\epoc32\release\armv5\lib\hal.dso</name>
+ <comparefilename>J:\epoc32\release\armv5\lib\hal.dso</comparefilename>
+ <shortname>hal</shortname>
+ <baseplatform>armv5</baseplatform>
+ <currentplatform>armv5</currentplatform>
+ <issue>
+ <typeid>13</typeid>
+ <typeinfo>DLL is missing in current SDK</typeinfo>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>None</sc_severity>
+ <status>OK</status>
+ </issue>
+ <issue>
+ <typeid>14</typeid>
+ <typeinfo>Baseline DLL is not available for analysis</typeinfo>
+ <bc_severity>Informative</bc_severity>
+ <sc_severity>None</sc_severity>
+ </issue>
+ </library>
+ <library>
+ <name>C:\Symbian\9.2\S60_3rd_FP1_2\epoc32\release\armv5\lib\irs.dso</name>
+ <comparefilename>J:\epoc32\release\armv5\lib\irs.dso</comparefilename>
+ <shortname>irs</shortname>
+ <baseplatform>armv5</baseplatform>
+ <currentplatform>armv5</currentplatform>
+ <issue>
+ <typeid>14</typeid>
+ <typeinfo>Baseline DLL is not available for analysis</typeinfo>
+ <bc_severity>Informative</bc_severity>
+ <sc_severity>None</sc_severity>
+ </issue>
<issue>
- <typeid>6</typeid>
- <bc_severity>Possible BBC Break</bc_severity>
- <sc_severity>SC Break</sc_severity>
+ <typeid>8</typeid>
+ <typeinfo>Target type/UID1 has been changed</typeinfo>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>None</sc_severity>
</issue>
<issue>
- <typeid>7</typeid>
- <bc_severity>Informative</bc_severity>
- <sc_severity>None</sc_severity>
- </issue>
- </library>
- <library>
- <name>C:\Symbian\9.2\S60_3rd_FP1_2\animation.dso</name>
- <issue>
- <typeid>7</typeid>
- <bc_severity>Informative</bc_severity>
+ <typeid>9</typeid>
+ <typeinfo>UID2 has been changed</typeinfo>
+ <bc_severity>BBC Break</bc_severity>
<sc_severity>None</sc_severity>
</issue>
<issue>
- <typeid>14</typeid>
- <bc_severity>Informative</bc_severity>
+ <typeid>10</typeid>
+ <typeinfo>UID3 has been changed</typeinfo>
+ <bc_severity>BBC Break</bc_severity>
<sc_severity>None</sc_severity>
</issue>
- </library>
- <library>
- <name>C:\Symbian\9.2\S60_3rd_FP1_2\animationshared.dso</name>
- <issue>
- <typeid>14</typeid>
- <bc_severity>Informative</bc_severity>
- <sc_severity>None</sc_severity>
- </issue>
+ </library>
+ <library>
+ <name>C:\Symbian\9.2\S60_3rd_FP1_2\epoc32\release\armv5\lib\lmkcommonui.dso</name>
+ <comparefilename/>
+ <shortname>lmkcommonui</shortname>
+ <baseplatform>armv5</baseplatform>
+ <currentplatform/>
+ <issue>
+ <typeid>1</typeid>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>SC Break</sc_severity>
+ </issue>
+ <issue>
+ <typeid>13</typeid>
+ <typeinfo>DLL is missing in current SDK</typeinfo>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>None</sc_severity>
+ </issue>
+ </library>
+ <library>
+ <name/>
+ <comparefilename>J:\epoc32\release\armv5\lib\HelloWorldAPI.dso</comparefilename>
+ <shortname>HelloWorldAPI</shortname>
+ <baseplatform/>
+ <currentplatform>armv5</currentplatform>
+ <issue>
+ <typeid>2</typeid>
+ <bc_severity>Informative</bc_severity>
+ <sc_severity>Informative</sc_severity>
+ </issue>
+ <issue>
+ <typeid>4</typeid>
+ <funcname>vtable for CommsDat::CCDDefaultCDMA2000SettingsRecord</funcname>
+ <funcpos>222</funcpos>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>SC Break</sc_severity>
+ <status>OK</status>
+ <comment>Studied and approved..</comment>
+ </issue>
+ <issue>
+ <typeid>5</typeid>
+ <newfuncname>typeinfo for CommsDat::CCDCprRecord</newfuncname>
+ <newfuncpos>257</newfuncpos>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>None</sc_severity>
+ <status>OK</status>
+ <comment>CCDCprRecord is part of internal technology..</comment>
+ </issue>
+ <issue>
+ <typeid>3</typeid>
+ <funcname>typeinfo for CommsDat::CCDIAPPrioritySelectionPolicyRecord</funcname>
+ <funcpos>257</funcpos>
+ <newfuncpos>289</newfuncpos>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>None</sc_severity>
+ <status>OK</status>
+ <comment>Constructor is part of internal technology..</comment>
+ </issue>
+ <issue>
+ <typeid>5</typeid>
+ <newfuncname>typeinfo for CommsDat::CCDLEAPRecord</newfuncname>
+ <newfuncpos>258</newfuncpos>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>None</sc_severity>
+ </issue>
+ <issue>
+ <typeid>3</typeid>
+ <funcname>vtable for CommsDat::CCDAccessPointRecord</funcname>
+ <funcpos>258</funcpos>
+ <newfuncpos>281</newfuncpos>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>None</sc_severity>
+ <status>OK</status>
+ <comment>Constructor is part of internal technology..</comment>
+ </issue>
+ </library>
+ <library>
+ <name>C:\Symbian\9.2\S60_3rd_FP1_2\epoc32\release\armv5\lib\cone.dso</name>
+ <comparefilename>J:\epoc32\release\armv5\lib\cone.dso</comparefilename>
+ <shortname>cone</shortname>
+ <baseplatform>armv5</baseplatform>
+ <currentplatform>armv5</currentplatform>
+ <issue>
+ <typeid>6</typeid>
+ <funcname>CCoeControl::SetGc(CWindowGc*) const</funcname>
+ <newfuncname>CCoeControl::SetCustomGc(CWindowGc*)</newfuncname>
+ <funcpos>470</funcpos>
+ <bc_severity>None</bc_severity>
+ <sc_severity>SC Break</sc_severity>
+ <status>OK</status>
+ <comment>Function names changed but entry points and arg lists retained. Old names deprecated. an inline trampoline exists for both removed functions. This is OK.</comment>
+ </issue>
+ <issue>
+ <typeid>6</typeid>
+ <funcname>CCoeTextDrawerBase::CCoeTextDrawerBase_Reserved2()</funcname>
+ <newfuncname>CCoeTextDrawerBase::DrawTextVertical(CGraphicsContext&, TCoeTextTypeAdaptor const&, CFont const&, TRect const&, TRect const&, int) const</newfuncname>
+ <funcpos>536</funcpos>
+ <bc_severity>None</bc_severity>
+ <sc_severity>SC Break</sc_severity>
+ <status>OK</status>
+ <comment>Reserved function has been renamed.</comment>
+ </issue>
+ <issue>
+ <typeid>4</typeid>
+ <funcname>CCoePlainTextDrawer::Construct()</funcname>
+ <funcpos>552</funcpos>
+ <bc_severity>BBC Break</bc_severity>
+ <sc_severity>SC Break</sc_severity>
+ <status>OK</status>
+ <comment>Private function, which is not called from any inline functions.</comment>
+ </issue>
+ <issue>
+ <typeid>6</typeid>
+ <funcname>CCoeControl::GetGc() const</funcname>
+ <newfuncname>CCoeControl::CustomGc() const</newfuncname>
+ <funcpos>619</funcpos>
+ <bc_severity>Possible BBC Break</bc_severity>
+ <sc_severity>Possible SC Break</sc_severity>
+ <status>OK</status>
+ <comment>Function name has changed, which is ok.</comment>
+ </issue>
+ <issue>
+ <typeid>7</typeid>
+ <newfuncname>CCoeEnv::ScreenDevice(int) const</newfuncname>
+ <newfuncpos>716</newfuncpos>
+ <bc_severity>Informative</bc_severity>
+ <sc_severity>None</sc_severity>
+ </issue>
+ <issue>
+ <typeid>7</typeid>
+ <newfuncname>CCoeEnv::RootWin(int) const</newfuncname>
+ <newfuncpos>717</newfuncpos>
+ <bc_severity>Informative</bc_severity>
+ <sc_severity>None</sc_severity>
+ </issue>
</library>
- <library>
- <name>C:\Symbian\9.2\S60_3rd_FP1_2\apfile.dso</name>
- <issue>
- <typeid>4</typeid>
- <bc_severity>BBC Break</bc_severity>
- <sc_severity>SC Break</sc_severity>
- </issue>
- </library>
</issuelist>
</bbcresults>
--- a/buildframework/helium/sf/java/quality/tests/data/libraries_report_one_id.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/quality/tests/data/libraries_report_one_id.xml Mon Oct 18 10:23:52 2010 +0100
@@ -31,11 +31,6 @@
<bc_severity>Informative</bc_severity>
<sc_severity>None</sc_severity>
</issue>
- <issue>
- <typeid>7</typeid>
- <bc_severity>Informative</bc_severity>
- <sc_severity>None</sc_severity>
- </issue>
</library>
</issuelist>
--- a/buildframework/helium/sf/java/sbs/doc/sbsctc.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/sbs/doc/sbsctc.rst Mon Oct 18 10:23:52 2010 +0100
@@ -73,4 +73,10 @@
<hlm:argSet id="ctc.build.options">
<arg line="-C OPT_ADD_COMPILE+-DCTC_NO_START_CTCMAN" />
- </hlm:argSet>
\ No newline at end of file
+ </hlm:argSet>
+
+ or
+
+ <hlm:argSet id="ctc.build.options">
+ <arg line='-C "EXCLUDE+*\sf\os\xyz\*,*\tools\xyz\*"'/>
+ </hlm:argSet>
--- a/buildframework/helium/sf/java/scm/tests/antunit/abstract_unittest_scmtask.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/scm/tests/antunit/abstract_unittest_scmtask.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -288,7 +288,7 @@
</hlm:scm>
</target>
- <target name="test-update-basedir-tag" depends="test-checkin">
+ <target name="test-update-basedir-tag">
<echo file="${repo.dir}/test1/not_in_repo.txt">Not in repo</echo>
<hlm:scm verbose="true" scmUrl="scm:${repo.type}:${repo.dir}/test1">
<hlm:add>
--- a/buildframework/helium/sf/java/signaling/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -22,10 +22,6 @@
-->
<project name="helium-signaling">
<description>Helium Antlib signaling.</description>
-
-
- <property name="name" value="signaling"/>
-
<import file="${builder.dir}/java/macros.ant.xml"/>
</project>
--- a/buildframework/helium/sf/java/signaling/signaling.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/signaling.rst Mon Oct 18 10:23:52 2010 +0100
@@ -104,8 +104,6 @@
</hlm:executeTaskNotifier>
</hlm:notifierList>
-Detailed documentation of the notifier interface could be found `here <../../helium-antlib/index.html>`_.
-
Example: configuring compileSignal
----------------------------------
--- a/buildframework/helium/sf/java/signaling/signalingCreateANewSignal.rst Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/signalingCreateANewSignal.rst Mon Oct 18 10:23:52 2010 +0100
@@ -69,7 +69,7 @@
The signalListenerConfig defines which target to listen and raise signal for. The target name is defined through the **target** attribute.
Then the nested **targetCondition** element is used to configure how the signal should be triggered.
-This element accepts any nested `Ant conditions <http://ant.apache.org/manual/CoreTasks/conditions.html>`_.
+This element accepts any nested `Ant conditions <http://ant.apache.org/manual/Tasks/condition.html>`_.
In this case the signal will get raised only if the file is not present after the execution of the **custom-action** target.
The framework then uses the defined signalInput from the signalNotifierInput configuration to know how to behave when the signal is raised. In the previous example it will
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/Notifier.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-
-package com.nokia.helium.signal;
-
-import org.apache.tools.ant.Project;
-
-import com.nokia.helium.signal.ant.types.NotifierInput;
-
-/**
- * This interface describe what method a Notifier needs to implement.
- *
- */
-public interface Notifier {
-
- /**
- * Setting the project.
- *
- * @param project
- */
- void setProject(Project project);
-
- /**
- * Sends the data to the requested sender list with specified notifier
- *
- * @param signalName is the name of the signal that has been raised.
- * @param failStatus indicates whether to fail the build or not
- * @param notifierInput contains signal notifier info
- * @param message is the message from the signal that has been raised.
- */
- void sendData(String signalName, boolean failStatus,
- NotifierInput notifierInput, String message );
-
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/SignalExceptionMessage.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:To print the message on the shell in case of build fails for deffered Signals.
- *
- */
-
-package com.nokia.helium.signal;
-
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.types.DataType;
-
-import com.nokia.helium.core.ant.HlmExceptionHandler;
-
-/**
- * Class to check the signal is present in the deferred and now signal list.
- * Print the message on the shell "Build completed with errors and warnings".
- *
- */
-
-public class SignalExceptionMessage extends DataType implements
- HlmExceptionHandler {
- private Logger log = Logger.getLogger(SignalExceptionMessage.class);
-
- /**
- * Implements the Exception method to print the build completed message.
- *
- * @param project
- * @param module
- * @param e
- */
- public void handleException(Project project, Exception e) {
-
- if (SignalStatusList.getDeferredSignalList().hasSignalInList()) {
- log.info("Build completed with errors and warnings.");
- }
-
- if (SignalStatusList.getNowSignalList().hasSignalInList()) {
- log.info("Build completed with errors and warnings.");
- }
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/SignalNeverFailMessage.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description: To print the message on the shell in case of build has errors
- * is user sets failbuild status to never in signal configuration file.
- *
- */
-
-package com.nokia.helium.signal;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.types.DataType;
-
-import com.nokia.helium.core.ant.PostBuildAction;
-
-/**
- * Class to check the signal is present in the never signal list. Print the
- * message on the shell "Build completed with errors and warnings".
- *
- */
-public class SignalNeverFailMessage extends DataType implements PostBuildAction {
-
- /**
- * Override execute method to print build completed message.
- *
- * @param prj
- * @param module
- * @param targetNames
- */
- public void executeOnPostBuild(Project project, String[] targetNames) {
- if (SignalStatusList.getNeverSignalList().hasSignalInList()) {
- project.log(SignalStatusList.getNeverSignalList().getErrorMsg());
- }
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/SignalStatus.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-
-package com.nokia.helium.signal;
-
-import java.util.Date;
-
-/**
- * Signal data holder;
- */
-public class SignalStatus {
-
- // Signal attributes.
- private String name;
- private String message;
- private String targetName;
- private Date signalTimeStamp;
-
- /**
- * Deferred signal holder.
- *
- * @param signalName
- * name of the signal been raised
- * @param message
- * message for the user
- * @param targetName
- * current target.
- */
- public SignalStatus(String signalName, String message, String targetName, Date signalDateAndTime) {
- this.name = signalName;
- this.message = message;
- this.targetName = targetName;
- this.signalTimeStamp = signalDateAndTime;
-
- }
- /**
- * Returns the signal message.
- * @return
- */
- public String getMessage() {
- return message;
- }
-
- /**
- * Returns signal name.
- * @return
- */
- public String getName() {
- return name;
- }
-
- /**
- * Returns target name.
- * @return
- */
- public String getTargetName() {
- return targetName;
- }
-
- /**
- * Returns signal date and time.
- * @return
- */
- public Date getTimestamp() {
- return signalTimeStamp;
- }
-
- /**
- * Converts signal status object to string.
- */
- public String toString() {
- return name + ": " + message + " : " + targetName;
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/SignalStatusList.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-package com.nokia.helium.signal;
-
-import java.util.Vector;
-
-import org.apache.log4j.Logger;
-
-/**
- * This class implements at storage for SignalStatus object.
- * It cannot be instantiated, it must be used through the typed list:
- * getDeferredSignalList, getNowSignalList, getNeverSignalList
- *
- */
-public final class SignalStatusList {
-
- private static SignalStatusList deferSignalList = new SignalStatusList();
- private static SignalStatusList nowSignalList = new SignalStatusList();
- private static SignalStatusList neverSignalList = new SignalStatusList();
-
- private Vector<SignalStatus> signals = new Vector<SignalStatus>();
-
- private Logger log = Logger.getLogger(this.getClass());
-
-
- private SignalStatusList() { }
-
- /**
- * Get the list of stored SignalStatus object.
- * @return a Vector of SignalStatus instances.
- */
- public Vector<SignalStatus> getSignalStatusList() {
- return new Vector<SignalStatus>(signals);
- }
-
- /**
- * Add a SignalStatus object to the list.
- *
- * @param status
- * a signal
- */
- public void addSignalStatus(SignalStatus status) {
- log.debug("SignalStatusList:addSignalStatus:msg:" + status);
- signals.add(status);
- }
-
- /**
- * Converts the error list into a user readable message.
- *
- * @return the error message.
- */
- public String getErrorMsg() {
- StringBuffer statusBuffer = new StringBuffer();
- for (SignalStatus signalStatus : signals) {
- statusBuffer.append(signalStatus);
- statusBuffer.append("\n");
- }
- log.debug("getErrorMsg:msg:" + statusBuffer.toString());
- return statusBuffer.toString();
- }
-
- /**
- * Check if it has any pending signals stored.
- *
- * @return true if any signal are pending.
- */
- public boolean hasSignalInList() {
- log.debug("asDeferMsgInList:size:"
- + signals.size());
- return signals.size() > 0;
- }
-
- /**
- * Clear all deferred signals.
- */
- public void clearStatusList() {
- log.debug("clearStatusList:size1:"
- + signals.size());
- signals.clear();
- log.debug("clearStatusList:size2:"
- + signals.size());
- }
-
- /*
- * Returns the deferred signal list.
- */
- public static SignalStatusList getDeferredSignalList() {
- return deferSignalList;
- }
-
- /*
- * Returns the now signal list.
- */
- public static SignalStatusList getNowSignalList() {
- return nowSignalList;
- }
-
- /*
- * Returns the never signal list.
- */
- public static SignalStatusList getNeverSignalList() {
- return neverSignalList;
- }
-
-}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/Notifier.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.helium.signal.ant;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.ResourceCollection;
+
+/**
+ * This interface describe what method a Notifier needs to implement.
+ *
+ */
+public interface Notifier {
+
+ /**
+ * Setting the project.
+ *
+ * @param project
+ */
+ void setProject(Project project);
+
+ /**
+ * Sends the data to the requested sender list with specified notifier
+ *
+ * @param signalName is the name of the signal that has been raised.
+ * @param failStatus indicates whether to fail the build or not
+ * @param notifierInput contains signal notifier info, collection of resources.
+ * @param message is the message from the signal that has been raised.
+ */
+ void sendData(String signalName, boolean failStatus,
+ ResourceCollection notifierInput, String message );
+
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/SignalExceptionMessage.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:To print the message on the shell in case of build fails for deffered Signals.
+ *
+ */
+
+package com.nokia.helium.signal.ant;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.ant.HlmExceptionHandler;
+
+/**
+ * Class to check the signal is present in the deferred and now signal list.
+ * Print the message on the shell "Build completed with errors and warnings".
+ *
+ */
+
+public class SignalExceptionMessage extends DataType implements
+ HlmExceptionHandler {
+
+ /**
+ * Implements the Exception method to print the build completed message.
+ *
+ * @param project
+ * @param module
+ * @param e
+ */
+ public void handleException(Project project, Exception e) {
+ if (!Signals.getSignals().getDeferredSignalList().isEmpty()
+ || !Signals.getSignals().getNowSignalList().isEmpty()) {
+ log("Build completed with errors and warnings.", Project.MSG_WARN);
+ }
+ }
+}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/SignalList.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,253 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the License "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html".
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-package com.nokia.helium.signal.ant;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Vector;
-
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Target;
-import org.apache.tools.ant.taskdefs.condition.Condition;
-
-import com.nokia.helium.signal.Notifier;
-import com.nokia.helium.signal.SignalStatus;
-import com.nokia.helium.signal.SignalStatusList;
-import com.nokia.helium.signal.ant.types.NotifierInput;
-import com.nokia.helium.signal.ant.types.SignalInput;
-import com.nokia.helium.signal.ant.types.SignalListenerConfig;
-import com.nokia.helium.signal.ant.types.SignalNotifierInput;
-import com.nokia.helium.signal.ant.types.SignalNotifierList;
-import com.nokia.helium.signal.ant.types.TargetCondition;
-
-/**
- * Helper class to store the list of notifiers.
- */
-public class SignalList {
-
- // default id list name
- public static final String DEFAULT_NOTIFIER_LIST_REFID = "defaultSignalInput";
-
-
- private Hashtable<String, SignalListenerConfig> signalListenerConfigs = new Hashtable<String, SignalListenerConfig>();
-
- private HashMap<String, List<SignalListenerConfig>> targetsMap = new HashMap<String, List<SignalListenerConfig>>();
-
- private Project project;
-
- private Logger log = Logger.getLogger(this.getClass());
-
- /**
- * Constructor
- */
- @SuppressWarnings("unchecked")
- public SignalList(Project project) {
- this.project = project;
- Hashtable<String, Object> references = project.getReferences();
- Enumeration<String> keyEnum = references.keys();
- while (keyEnum.hasMoreElements()) {
- String key = keyEnum.nextElement();
- if (references.get(key) instanceof SignalListenerConfig) {
- log.debug("SignalList: Found reference: " + key);
- SignalListenerConfig config = (SignalListenerConfig) references
- .get(key);
- config.setConfigId(key);
- signalListenerConfigs.put(key, config);
- String targetName = config.getTargetName();
- List<SignalListenerConfig> list;
- if (targetsMap.get(targetName) == null) {
- list = new ArrayList<SignalListenerConfig>();
- } else {
- list = targetsMap.get(targetName);
- }
- list.add(config);
- targetsMap.put(targetName, list);
- }
- }
- }
-
- public Project getProject() {
- return project;
- }
-
- /**
- * Returns the list of SignalListenerConfig discovered.
- * @return a Vector of SignalList objects.
- */
- public Vector<SignalListenerConfig> getSignalListenerConfigList() {
- return new Vector<SignalListenerConfig>(signalListenerConfigs.values());
- }
-
- /**
- * Check if targetName is defined is defined by a targetCondition.
- * @param targetName the target name
- * @return a boolean, true if found, false otherwise.
- */
- public boolean isTargetInSignalList(String targetName) {
- return targetsMap.get(targetName) != null;
- }
-
- /**
- * Return the list of SignalListenerConfig defining a target.
- * @param targetName
- * @return
- */
- public List<SignalListenerConfig> getSignalListenerConfig(String targetName) {
- return targetsMap.get(targetName);
- }
-
- protected void sendNotifications(Vector<Notifier> notifierList, String signalName, String errorMessage ) {
- sendNotifications( notifierList, signalName, false, null, errorMessage );
- }
-
- public void processForSignal(Project prj, SignalNotifierInput signalNotifierInput, String signalName, String targetName,
- String errorMessage, boolean failBuild) {
- SignalInput signalInput = signalNotifierInput.getSignalInput();
- Vector<Notifier> notifierList = signalInput.getSignalNotifierList();
- if (notifierList == null) {
- Object obj = (Object) prj
- .getReference(DEFAULT_NOTIFIER_LIST_REFID);
- if (obj instanceof SignalNotifierList) {
- notifierList = ((SignalNotifierList) obj)
- .getNotifierList();
- }
- }
- NotifierInput notifierInput = signalNotifierInput.getNotifierInput();
- sendNotifications(notifierList, signalName, failBuild,
- notifierInput, errorMessage );
- if (failBuild) {
- String failStatus = "now";
- if (signalInput != null) {
- failStatus = signalInput.getFailBuild();
- } else {
- log.debug("Could not find config for signal: " + signalName);
- }
- if (failStatus == null || failStatus.equals("now")) {
- log.debug("Adding now signal. Signal name is " + signalName);
- SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
- errorMessage, targetName, new Date()));
- throw new BuildException(new SignalStatus(signalName,
- errorMessage, targetName, new Date()).toString());
- } else if (failStatus.equals("defer")) {
- log.debug("Adding deffer signal. Signal " + signalName + " will be deferred.");
- SignalStatusList.getDeferredSignalList().addSignalStatus(new SignalStatus(
- signalName, errorMessage, targetName, new Date()));
- } else if (failStatus.equals("never")) {
- log.debug("Adding never signal. Signal name is " + signalName);
- SignalStatusList.getNeverSignalList().addSignalStatus(new SignalStatus(signalName,
- errorMessage, targetName, new Date()));
- } else if (!failStatus.equals("never")) {
- SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
- errorMessage, targetName, new Date()));
- throw new BuildException(new SignalStatus(signalName,
- errorMessage, targetName, new Date()).toString());
- } else {
- log.info("Signal " + signalName
- + " set to be ignored by the configuration.");
- }
- }
- }
- /**
- * Send notification using the notification list.
- *
- * @param notifierList
- */
- protected void sendNotifications(Vector<Notifier> notifierList, String signalName,
- boolean failStatus, NotifierInput notifierInput, String errorMessage ) {
- if (notifierList == null) {
- return;
- }
- for (Notifier notifier : notifierList) {
- if (notifier != null) {
- notifier.sendData(signalName, failStatus, notifierInput, errorMessage );
- }
- }
- }
-
- public boolean checkAndNotifyFailure(Target target, Project prj) {
- String targetName = target.getName();
- String signalName = "unknown";
- boolean retValue = false;
-
- if (isTargetInSignalList(targetName)) {
- retValue = true;
- for (SignalListenerConfig config : getSignalListenerConfig(targetName))
- {
- TargetCondition targetCondition = config
- .getTargetCondition();
- String errorMessage = null;
- log.debug("targetcondition:" + targetCondition);
- Condition condition = null;
- if (targetCondition != null) {
- condition = getFailureCondition(targetCondition);
- }
- errorMessage = config.getErrorMessage();
- String refid = config.getConfigId();
- log.debug("refid:" + refid);
- Object configCurrent = prj.getReference(refid);
- if (configCurrent != null && configCurrent instanceof SignalListenerConfig) {
- signalName = refid;
- }
- processForSignal(prj, config.getSignalNotifierInput(), signalName,
- targetName, errorMessage, condition != null);
- log.debug("checkAndNotifyFailure: SignalName: " + signalName);
- }
- }
- return retValue;
- }
-
- private Condition getFailureCondition(TargetCondition targetCondition) {
- Condition retCondition = null;
- Vector<Condition> conditionList = targetCondition.getConditions();
- for (Condition condition : conditionList) {
- log.debug("getFailureCondition:" + condition.eval());
- if (condition.eval()) {
- retCondition = condition;
- break;
- }
- }
- return retCondition;
- }
-
-
- /**
- * Handle the signal, either fail now, or defer the failure.
- *
- * @param targetName
- * , target where the failure happened.
- * @param errMsg
- * , the error message
- */
- public void fail(String signalName, String targetName, String errorMessage)
- {
- String failStatus = "now";
- log.debug("Could not find config for signal: " + signalName);
- log.debug("failStatus: " + failStatus);
- log.debug("Adding now signal. Signal name is " + signalName);
- SignalStatusList.getNowSignalList().addSignalStatus(new SignalStatus(signalName,
- errorMessage, targetName, new Date()));
- throw new BuildException(new SignalStatus(signalName,
- errorMessage, targetName, new Date()).toString());
- }
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/SignalListener.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/SignalListener.java Mon Oct 18 10:23:52 2010 +0100
@@ -18,10 +18,18 @@
package com.nokia.helium.signal.ant;
-import org.apache.log4j.Logger;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildListener;
import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Target;
+
+import com.nokia.helium.signal.ant.types.SignalListenerConfig;
/**
* Listener class that can connect to Ant and log information regarding to build
@@ -38,14 +46,13 @@
*
*/
public class SignalListener implements BuildListener {
-
private boolean initialized;
- private SignalList signalList;
-
private Project project;
- private Logger log = Logger.getLogger(this.getClass());
+ private Hashtable<String, SignalListenerConfig> signalListenerConfigs = new Hashtable<String, SignalListenerConfig>();
+
+ private HashMap<String, List<SignalListenerConfig>> targetsMap = new HashMap<String, List<SignalListenerConfig>>();
/**
* Ant call this function when build start.
@@ -57,28 +64,41 @@
/**
* Triggered when a target starts.
*/
+ @SuppressWarnings("unchecked")
public void targetStarted(BuildEvent event) {
if (project == null) {
project = event.getProject();
}
- }
-
- private void initialize() {
- signalList = new SignalList(project);
- //signalList1 = new SignalList(project);
+ if (!initialized) {
+ Hashtable<String, Object> references = (Hashtable<String, Object>)project.getReferences();
+ Enumeration<String> keyEnum = references.keys();
+ while (keyEnum.hasMoreElements()) {
+ String key = keyEnum.nextElement();
+ if (references.get(key) instanceof SignalListenerConfig) {
+ SignalListenerConfig config = (SignalListenerConfig) references
+ .get(key);
+ config.setConfigId(key);
+ signalListenerConfigs.put(key, config);
+ String targetName = config.getTargetName();
+ List<SignalListenerConfig> list;
+ if (targetsMap.get(targetName) == null) {
+ list = new ArrayList<SignalListenerConfig>();
+ } else {
+ list = targetsMap.get(targetName);
+ }
+ list.add(config);
+ targetsMap.put(targetName, list);
+ }
+ }
+ initialized = true;
+ }
}
/**
* Triggered when a target finishes.
*/
public void targetFinished(BuildEvent event) {
- if (!initialized) {
- log.debug("Signaling: Initializing Signaling");
- initialize();
- initialized = true;
- }
- log.debug("Signaling:targetFinished:sendsignal: " + event.getTarget());
- signalList.checkAndNotifyFailure(event.getTarget(), event.getProject());
+ checkAndNotifyFailure(event.getTarget(), event.getProject());
}
/**
@@ -104,4 +124,30 @@
*/
public void messageLogged(BuildEvent event) {
}
+
+ protected boolean checkAndNotifyFailure(Target target, Project prj) {
+ String targetName = target.getName();
+ String signalName = "unknown";
+ boolean retValue = false;
+
+ if (targetsMap.containsKey(targetName)) {
+ retValue = true;
+ for (SignalListenerConfig config : targetsMap.get(targetName))
+ {
+ String refid = config.getConfigId();
+ Object configCurrent = prj.getReference(refid);
+ if (configCurrent != null && configCurrent instanceof SignalListenerConfig) {
+ signalName = refid;
+ }
+ boolean failBuild = false;
+ if (config.getTargetCondition() != null) {
+ failBuild = config.getTargetCondition().getCondition().eval();
+ }
+ Signals.getSignals().processSignal(prj, config.getSignalNotifierInput(), signalName,
+ targetName, config.getErrorMessage(), failBuild);
+ }
+ }
+ return retValue;
+ }
+
}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/SignalNeverFailMessage.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: To print the message on the shell in case of build has errors
+ * is user sets failbuild status to never in signal configuration file.
+ *
+ */
+
+package com.nokia.helium.signal.ant;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.DataType;
+
+import com.nokia.helium.core.ant.PostBuildAction;
+
+/**
+ * Class to check the signal is present in the never signal list. Print the
+ * message on the shell "Build completed with errors and warnings".
+ *
+ */
+public class SignalNeverFailMessage extends DataType implements
+ PostBuildAction {
+
+ /**
+ * Override execute method to print build completed message.
+ *
+ * @param prj
+ * @param module
+ * @param targetNames
+ */
+ public void executeOnPostBuild(Project project, String[] targetNames) {
+ if (!Signals.getSignals().getNeverSignalList().isEmpty()) {
+ log("Build completed with errors and warnings.", Project.MSG_WARN);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/SignalStatus.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,89 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.helium.signal.ant;
+
+import java.util.Date;
+
+/**
+ * Signal data holder;
+ */
+public class SignalStatus {
+
+ // Signal attributes.
+ private String name;
+ private String message;
+ private String targetName;
+ private Date signalTimeStamp;
+
+ /**
+ * Deferred signal holder.
+ *
+ * @param signalName
+ * name of the signal been raised
+ * @param message
+ * message for the user
+ * @param targetName
+ * current target.
+ */
+ public SignalStatus(String signalName, String message, String targetName, Date signalDateAndTime) {
+ this.name = signalName;
+ this.message = message;
+ this.targetName = targetName;
+ this.signalTimeStamp = signalDateAndTime;
+
+ }
+ /**
+ * Returns the signal message.
+ * @return
+ */
+ public String getMessage() {
+ return message;
+ }
+
+ /**
+ * Returns signal name.
+ * @return
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Returns target name.
+ * @return
+ */
+ public String getTargetName() {
+ return targetName;
+ }
+
+ /**
+ * Returns signal date and time.
+ * @return
+ */
+ public Date getTimestamp() {
+ return signalTimeStamp;
+ }
+
+ /**
+ * Converts signal status object to string.
+ */
+ public String toString() {
+ return getName() + ": " + getMessage() + " : " + getTargetName();
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/Signals.java Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: To print the message on the shell in case of build has errors
+ * is user sets failbuild status to never in signal configuration file.
+ *
+ */
+package com.nokia.helium.signal.ant;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.ResourceCollection;
+
+import com.nokia.helium.signal.ant.types.SignalInput;
+import com.nokia.helium.signal.ant.types.SignalNotifierInput;
+
+/**
+ * Signals give access to signals raised during the build.
+ *
+ */
+public class Signals {
+ // Global instance handling signals a the running Ant build
+ private static Signals self;
+
+ private SignalStatusList deferSignalList = new SignalStatusList();
+ private SignalStatusList nowSignalList = new SignalStatusList();
+ private SignalStatusList neverSignalList = new SignalStatusList();
+ private Logger log = Logger.getLogger(this.getClass());
+
+ /**
+ * Get the access to the unique instance of Signals.
+ * @return
+ */
+ public static Signals getSignals() {
+ if (self == null) {
+ self = new Signals();
+ }
+ return self;
+ }
+
+ /**
+ * Returns the deferred signal list.
+ */
+ public List<SignalStatus> getDeferredSignalList() {
+ return deferSignalList;
+ }
+
+ /**
+ * Returns the now signal list.
+ */
+ public List<SignalStatus> getNowSignalList() {
+ return nowSignalList;
+ }
+
+ /**
+ * Returns the never signal list.
+ */
+ public List<SignalStatus> getNeverSignalList() {
+ return neverSignalList;
+ }
+
+ /**
+ *
+ * @param project current Ant project
+ * @param signalNotifierInput can be null, the DEFAULT_NOTIFIER_LIST_REFID will be used for notification,
+ * and failing configuration will be considered as now.
+ * @param signalName the signal name
+ * @param targetName target where the signal has been raised.
+ * @param errorMessage the message
+ * @param failBuild true for a failure, false in case of success.
+ */
+ public void processSignal(Project project, SignalNotifierInput signalNotifierInput, String signalName, String targetName,
+ String errorMessage, boolean failBuild) {
+ Vector<Notifier> notifierList = null;
+ ResourceCollection notifierInput = null;
+ if (signalNotifierInput != null) {
+ SignalInput signalInput = signalNotifierInput.getSignalInput();
+ notifierList = signalInput.getSignalNotifierList();
+ notifierInput = signalNotifierInput.getNotifierInput();
+ }
+ // Print some verbose log information about signal raised.
+ project.log("------------ Signal raised ------------", notifierList != null ? Project.MSG_VERBOSE : Project.MSG_INFO);
+ project.log("Signal: " + signalName, notifierList != null ? Project.MSG_VERBOSE : Project.MSG_INFO);
+ project.log("Target: " + targetName, notifierList != null ? Project.MSG_VERBOSE : Project.MSG_INFO);
+ project.log("Message: " + errorMessage, notifierList != null ? Project.MSG_VERBOSE : Project.MSG_INFO);
+ project.log("Failure: " + (failBuild ? "Yes" : "No"), notifierList != null ? Project.MSG_VERBOSE : Project.MSG_INFO);
+ project.log("---------------------------------------", notifierList != null ? Project.MSG_VERBOSE : Project.MSG_INFO);
+
+ // Only run notification
+ if (notifierList != null) {
+ sendNotifications(notifierList, signalName, failBuild,
+ notifierInput, errorMessage );
+ }
+ if (failBuild) {
+ String failStatus = "now";
+ if (signalNotifierInput != null && signalNotifierInput.getSignalInput() != null) {
+ failStatus = signalNotifierInput.getSignalInput().getFailBuild();
+ } else {
+ log.debug("Could not find config for signal: " + signalName);
+ }
+ if (failStatus == null || failStatus.equals("now")) {
+ log.debug("Adding now signal. Signal name is " + signalName);
+ Signals.getSignals().getNowSignalList().add(new SignalStatus(signalName,
+ errorMessage, targetName, new Date()));
+ throw new BuildException(new SignalStatus(signalName,
+ errorMessage, targetName, new Date()).toString());
+ } else if (failStatus.equals("defer")) {
+ log.debug("Adding deffer signal. Signal " + signalName + " will be deferred.");
+ Signals.getSignals().getDeferredSignalList().add(new SignalStatus(
+ signalName, errorMessage, targetName, new Date()));
+ } else if (failStatus.equals("never")) {
+ log.debug("Adding never signal. Signal name is " + signalName);
+ Signals.getSignals().getNeverSignalList().add(new SignalStatus(signalName,
+ errorMessage, targetName, new Date()));
+ } else if (!failStatus.equals("never")) {
+ Signals.getSignals().getNowSignalList().add(new SignalStatus(signalName,
+ errorMessage, targetName, new Date()));
+ throw new BuildException(new SignalStatus(signalName,
+ errorMessage, targetName, new Date()).toString());
+ } else {
+ log.info("Signal " + signalName
+ + " set to be ignored by the configuration.");
+ }
+ }
+ }
+
+ /**
+ * Send notification using the notification list.
+ *
+ * @param notifierList
+ */
+ protected void sendNotifications(List<Notifier> notifierList, String signalName,
+ boolean failStatus, ResourceCollection notifierInput, String errorMessage ) {
+ if (notifierList == null) {
+ return;
+ }
+ for (Notifier notifier : notifierList) {
+ if (notifier != null) {
+ notifier.sendData(signalName, failStatus, notifierInput, errorMessage);
+ }
+ }
+ }
+
+ protected class SignalStatusList extends ArrayList<SignalStatus> {
+
+ private static final long serialVersionUID = 2159492246599277712L;
+
+ /**
+ * Converts the error list into a user readable message.
+ *
+ * @return the error message.
+ */
+ public String toString() {
+ StringBuffer statusBuffer = new StringBuffer();
+ for (SignalStatus signalStatus : this) {
+ statusBuffer.append(signalStatus);
+ statusBuffer.append("\n");
+ }
+ return statusBuffer.toString();
+ }
+
+ }
+}
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/conditions/DeferredFailureCondition.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/conditions/DeferredFailureCondition.java Mon Oct 18 10:23:52 2010 +0100
@@ -21,8 +21,8 @@
import org.apache.tools.ant.ProjectComponent;
import org.apache.tools.ant.taskdefs.condition.Condition;
-import com.nokia.helium.signal.SignalStatus;
-import com.nokia.helium.signal.SignalStatusList;
+import com.nokia.helium.signal.ant.SignalStatus;
+import com.nokia.helium.signal.ant.Signals;
/**
* The hasDeferredFailure condition allows you to know if any diferred failure are pending,
@@ -65,7 +65,7 @@
public boolean eval() {
if (name != null) {
getProject().log("Has deferred " + name + " failure?");
- for (SignalStatus signal : SignalStatusList.getDeferredSignalList().getSignalStatusList()) {
+ for (SignalStatus signal : Signals.getSignals().getDeferredSignalList()) {
if (signal.getName().equals(name)) {
getProject().log("Failure " + name + " found.");
return true;
@@ -74,9 +74,9 @@
} else {
getProject().log(
"Deferred failure: "
- + ((SignalStatusList.getDeferredSignalList().hasSignalInList()) ? "Yes"
+ + ((!Signals.getSignals().getDeferredSignalList().isEmpty()) ? "Yes"
: "No"));
- return SignalStatusList.getDeferredSignalList().hasSignalInList();
+ return !Signals.getSignals().getDeferredSignalList().isEmpty();
}
return false;
}
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/helium.antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/helium.antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -29,8 +29,8 @@
<typedef name="signalstatusdef" classname="com.nokia.helium.signal.ant.types.SignalStatusDef" uri="http://www.nokia.com/helium"/>
<typedef name="exceptionsignal" classname="com.nokia.helium.signal.ant.types.SignalExceptionConfigHandler" uri="http://www.nokia.com/helium"/>
- <typedef name="buildfailmessage" classname="com.nokia.helium.signal.SignalExceptionMessage" uri="http://www.nokia.com/helium"/>
- <typedef name="buildneverfailmessage" classname="com.nokia.helium.signal.SignalNeverFailMessage" uri="http://www.nokia.com/helium"/>
+ <typedef name="buildfailmessage" classname="com.nokia.helium.signal.ant.SignalExceptionMessage" uri="http://www.nokia.com/helium"/>
+ <typedef name="buildneverfailmessage" classname="com.nokia.helium.signal.ant.SignalNeverFailMessage" uri="http://www.nokia.com/helium"/>
<hlm:deflist id="helium-signaling.list">
<hlm:listenerdef classname="com.nokia.helium.signal.ant.SignalListener" />
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/taskdefs/ClearDeferredFailuresTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/taskdefs/ClearDeferredFailuresTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -20,7 +20,7 @@
import org.apache.tools.ant.Task;
-import com.nokia.helium.signal.SignalStatusList;
+import com.nokia.helium.signal.ant.Signals;
/**
* This class implements a task that clear all pending failure. It is quite
@@ -35,7 +35,7 @@
@Override
public void execute() {
log("Clearing all pending failures.");
- SignalStatusList.getDeferredSignalList().clearStatusList();
+ Signals.getSignals().getDeferredSignalList().clear();
}
}
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/taskdefs/SignalTask.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/taskdefs/SignalTask.java Mon Oct 18 10:23:52 2010 +0100
@@ -20,10 +20,12 @@
import java.util.Vector;
import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
import org.apache.tools.ant.Target;
import org.apache.tools.ant.Task;
-import com.nokia.helium.signal.ant.SignalList;
+import com.nokia.helium.signal.ant.Signals;
+import com.nokia.helium.signal.ant.types.SignalInput;
import com.nokia.helium.signal.ant.types.SignalNotifierInput;
/**
@@ -58,24 +60,29 @@
private Vector<SignalNotifierInput> signalNotifierInputs = new Vector<SignalNotifierInput>();
- public String getMessage() {
- return message;
- }
-
/**
- * Helper function called by ant to create the new signalinput
- */
+ * Create a nested signalNotifierInput element.
+ * @return a SignalNotifierInput instance
+ */
public SignalNotifierInput createSignalNotifierInput() {
SignalNotifierInput input = new SignalNotifierInput();
add(input);
return input;
}
+ /**
+ * Get the nested SignalNotifierInput. Only the first element will be returned.
+ * @return null if the list is empty of the first element.
+ */
public SignalNotifierInput getSignalNotifierInput() {
+ if (signalNotifierInputs.isEmpty()) {
+ return null;
+ }
return (SignalNotifierInput)signalNotifierInputs.elementAt(0);
}
+
/**
- * Helper function to add the created signalinput
+ * Add a SignalNotifierInput kind of element.
* @param filter to be added to the filterset
*/
public void add(SignalNotifierInput input) {
@@ -84,21 +91,16 @@
/**
- * Error message.
- *
- * @ant.not-required
+ * Error message sent to the user.
+ * @ant.not-required Default message will be sent.
*/
public void setMessage(String message) {
this.message = message;
}
-
- public String getName() {
- return name;
- }
-
/**
- * Signal name to emit.
+ * Reference of the signal to emit. The referenced object
+ * must be a signalInput.
*
* @ant.required
*/
@@ -109,69 +111,59 @@
/**
* integer value representing the number of errors.
*
- * @ant.required
+ * @ant.no-required Default is 0.
*/
public void setResult(int result) {
this.result = new Integer(result);
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public void execute() {
- if (name == null) {
+ if (name == null && getSignalNotifierInput() == null) {
throw new BuildException("'name' attribute is not defined.");
}
+ if (name != null && getSignalNotifierInput() != null) {
+ log("The usage of name and nested signalInputNotifier at the same time is deprecated.", Project.MSG_WARN);
+ log("'name' attribute will be ignored.", Project.MSG_WARN);
+ name = null;
+ }
if (result == null) {
result = new Integer(0);
}
+ SignalNotifierInput config = null;
+ String signalName = null;
+ if (name != null) {
+ signalName = name;
+ Object configObject = getProject().getReference(name);
+ if (configObject != null && configObject instanceof SignalInput) {
+ config = new SignalNotifierInput();
+ config.setProject(getProject());
+ config.add((SignalInput)configObject);
+ } else {
+ throw new BuildException("name attribute (" + name + ") is not refering to a signalInput");
+ }
+ } else {
+ config = getSignalNotifierInput();
+ signalName = config.getSignalInput().getName();
+ }
- SignalList signalList = new SignalList(getProject());
- boolean failStatus = result.intValue() != 0;
- if (failStatus) {
- // keep same message as earlier.
- log(name
- + ": "
- + name
- + " signal failed. Expected result was 0, actual result was "
- + result);
-
- if (message == null) {
- message = "Expected result was 0, actual result was " + result;
- }
- }
-
// notify the user
- String targetName = "signalExceptionTarget";
+ String targetName = "unknown";
Target target = this.getOwningTarget();
if (target != null) {
targetName = target.getName();
}
- if (signalNotifierInputs.isEmpty()) {
- Object config = getProject().getReference(name);
- if (config == null) {
- throw new BuildException("Could not find signal config for signal name: " + name);
- }
- signalList.processForSignal(getProject(), this.getSignalNotifierInput(), this.name,
- this.getOwningTarget().getName(), message, result.intValue() != 0);
+ if (message == null) {
+ message = "Expected result was 0, actual result was " + result;
+ }
+ log(signalName + ": " + targetName + ": " + message);
- if (result.intValue() != 0) {
- // keep same message as earlier.
- log(name
- + ": "
- + name
- + " signal failed. Expected result was 0, actual result was "
- + result);
-
- if (message == null) {
- message = "Expected result was 0, actual result was " + result;
- }
- signalList.fail(getName(), this.getOwningTarget().getName(), message);
- }
-
- } else {
- signalList.processForSignal(getProject(), getSignalNotifierInput(), getName(),
- targetName, message, failStatus);
- }
+ Signals.getSignals().processSignal(getProject(), config, signalName,
+ targetName, message, result.intValue() != 0);
}
}
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/EMAILNotifier.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/EMAILNotifier.java Mon Oct 18 10:23:52 2010 +0100
@@ -22,8 +22,10 @@
import com.nokia.helium.core.EmailSendException;
import com.nokia.helium.core.PropertiesSource;
import com.nokia.helium.core.TemplateInputSource;
-import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.signal.ant.Notifier;
import com.nokia.helium.core.TemplateProcessor;
+import com.nokia.helium.core.ant.ResourceCollectionUtils;
+
import java.util.List;
import java.util.Hashtable;
import java.util.ArrayList;
@@ -32,6 +34,8 @@
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.ResourceCollection;
+
import java.io.File;
/**
@@ -53,21 +57,11 @@
private String additionalRecipients;
/**
- * Rendering the template, and sending the result through email.
- *
- * @param signalName
- * - is the name of the signal that has been raised.
- * @param failStatus
- * - indicates whether to fail the build or not
- * @param notifierInput
- * - contains signal notifier info
- * @param message
- * - is the message from the signal that has been raised.
+ * {@inheritDoc}
*/
-
@SuppressWarnings("unchecked")
public void sendData(String signalName, boolean failStatus,
- NotifierInput notifierInput, String message) {
+ ResourceCollection notifierInput, String message) {
if (notifyWhen != null
&& (notifyWhen.equals("always")
|| (notifyWhen.equals("fail") && failStatus) || (notifyWhen
@@ -96,7 +90,7 @@
File fileToSend = null;
if (notifierInput != null) {
- fileToSend = notifierInput.getFile(".*.html");
+ fileToSend = ResourceCollectionUtils.getFile(notifierInput, ".*.html");
}
if (fileToSend == null) {
if (defaultTemplate != null && defaultTemplate.exists()) {
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/ExecuteTaskNotifier.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/ExecuteTaskNotifier.java Mon Oct 18 10:23:52 2010 +0100
@@ -20,10 +20,10 @@
import java.io.File;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.Vector;
-import org.apache.log4j.Logger;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildListener;
import org.apache.tools.ant.MagicNames;
@@ -32,8 +32,10 @@
import org.apache.tools.ant.Task;
import org.apache.tools.ant.TaskContainer;
import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.ResourceCollection;
-import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.signal.ant.Notifier;
/**
* This notifier allows you to execute a task sequence when a specific signal
@@ -55,11 +57,8 @@
*
* @ant.type name="executeTaskNotifier" category="Signaling"
*/
-@SuppressWarnings("deprecation")
public class ExecuteTaskNotifier extends DataType implements Notifier,
TaskContainer {
-
- private Logger log = Logger.getLogger(ExecuteTaskNotifier.class);
private List<Task> tasks = new ArrayList<Task>();
private boolean failOnError;
@@ -74,7 +73,7 @@
*/
@SuppressWarnings("unchecked")
public void sendData(String signalName, boolean failStatus,
- NotifierInput notifierInput, String message ) {
+ ResourceCollection notifierInput, String message ) {
try {
// Configure the project
Project prj = getProject().createSubProject();
@@ -96,12 +95,18 @@
prj.setProperty("signal.message", message );
// Converting the list of inputs into a string.
String inputs = "";
- if (notifierInput != null && notifierInput.getFile() != null) {
- inputs += notifierInput.getFile().toString();
+ if (notifierInput != null) {
+ Iterator<Resource> ri = notifierInput.iterator();
+ while (ri.hasNext()) {
+ inputs += ri.next().toString();
+ if (ri.hasNext()) {
+ inputs += File.pathSeparator;
+ }
+ }
}
prj.setProperty("signal.notifier.inputs", inputs);
for (Task task : tasks) {
- log.debug("Executing task: " + task.getTaskName());
+ log("Executing task: " + task.getTaskName(), Project.MSG_DEBUG);
task.setProject(prj);
task.perform();
}
@@ -115,9 +120,10 @@
}
}
- @Override
+ /**
+ * {@inheritDoc}
+ */
public void addTask(Task task) {
- log.debug("Adding task: " + task.getTaskName());
tasks.add(task);
}
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/InfoNotifier.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/InfoNotifier.java Mon Oct 18 10:23:52 2010 +0100
@@ -19,10 +19,12 @@
import java.io.File;
-import org.apache.log4j.Logger;
+import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.ResourceCollection;
-import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.core.ant.ResourceCollectionUtils;
+import com.nokia.helium.signal.ant.Notifier;
/**
* The InfoNotifier provides you an easy way to inform the
@@ -30,24 +32,15 @@
* @ant.type name="infoNotifier" category="Signaling"
*/
public class InfoNotifier extends DataType implements Notifier {
-
- private Logger log = Logger.getLogger(InfoNotifier.class);
/**
- * Rendering the template, and sending the result through email.
- *
- * @param signalName - is the name of the signal that has been raised.
- * @param failStatus - indicates whether to fail the build or not
- * @param notifierInput - contains signal notifier info
- * @param message - is the message from the signal that has been raised.
+ * {@inheritDoc}
*/
-
- @SuppressWarnings("unchecked")
public void sendData(String signalName, boolean failStatus,
- NotifierInput notifierInput, String message ) {
- if (notifierInput != null) {
- File logFile = notifierInput.getFile(".*.log");
- log.error("Error in log file: " + logFile);
+ ResourceCollection notifierInput, String message ) {
+ if (notifierInput != null) {
+ File logFile = ResourceCollectionUtils.getFile(notifierInput, ".*.log");
+ log("Error in log file: " + logFile, Project.MSG_ERR);
}
}
}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/NotifierInput.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/NotifierInput.java Mon Oct 18 10:23:52 2010 +0100
@@ -20,110 +20,30 @@
import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-import org.apache.log4j.Logger;
-import org.apache.tools.ant.DirectoryScanner;
-import org.apache.tools.ant.types.DataType;
-import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.Path;
/**
- * Helper class to store the signal notifier info.
+ * This Ant type allows you to provide a list of files, for
+ * example logs to a notifier. The usage of this type is
+ * deprecated, please consider using any kind of Ant
+ * ResourceCollection like paths or filesets.
+ *
+ * @ant.type name="NotifierInput" category="Signaling"
*/
-public class NotifierInput extends DataType
-{
-
- private File file;
-
- //Different notifier could choose specific file
- private String pattern = ".html";
-
- private Vector<FileSet> fileSetList = new Vector<FileSet>();
-
- private Logger log = Logger.getLogger(this.getClass());
-
- /**
- * Adds the fileset (list of input log files to be processed).
- * @param fileSet fileset to be added
- *
- */
- public void add(FileSet fileSet) {
- fileSetList.add(fileSet);
- }
+public class NotifierInput extends Path {
- public File getFile() {
- return getFile(pattern);
- }
-
- /**
- * Return a file from the input fileset.
- * @param pattern pattern to match from the input fileset
- * @return the matched files including the base dir.
- */
- public File getFile(String pattern) {
- File fileToReturn = null;
- if (file != null) {
- if (file.toString().matches(pattern)) {
- fileToReturn = file;
- }
- return fileToReturn;
- }
- for (FileSet fs : fileSetList) {
- DirectoryScanner ds = fs.getDirectoryScanner(getProject());
- String[] includedFiles = ds.getIncludedFiles();
- for ( String filePath : includedFiles ) {
- if (filePath.matches(pattern)) {
- fileToReturn = new File(ds.getBasedir(), filePath);
- log.debug("matched file for pattern: " + pattern + ":" + fileToReturn);
- break;
- }
- }
- }
- return fileToReturn;
- }
-
- /**
- * Returns the list of filelist from the input fileset.
- * @param pattern pattern to match from the input fileset
- * @return the matched files including the base dir.
- */
- public List<File> getFileList(String pattern) {
- List<File> fileList = new ArrayList<File>();
- for (FileSet fs : fileSetList) {
- DirectoryScanner ds = fs.getDirectoryScanner(getProject());
- String[] includedFiles = ds.getIncludedFiles();
- for ( String filePath : includedFiles ) {
- if (filePath.matches(pattern)) {
- fileList.add(new File(ds.getBasedir(), filePath));
- }
- }
- }
- return fileList;
+ public NotifierInput(Project project) {
+ super(project);
}
/**
* Helper function called by ant to set the input file.
* @param inputFile input file for notifier
- */
- public void setFile(File inputFile) {
- file = inputFile;
- }
-
- /**
- * Helper function called by ant to get the file
- * @return the input file for notifier.
+ * @ant.not-required
*/
- public String getPattern() {
- return pattern ;
- }
-
- /**
- * Helper function called by ant to get the file
- * @return the input file for notifier.
- */
- public void setPattern(String ptn) {
- pattern = ptn;
+ public void setFile(File file) {
+ this.createPathElement().setLocation(file);
}
}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SMSNotifier.java Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-*
-*/
-
-
-package com.nokia.helium.signal.ant.types;
-
-
-import org.apache.tools.ant.types.DataType;
-
-import com.nokia.helium.signal.Notifier;
-
-/**
- * Defines a signal notification via SMS.
- */
-public class SMSNotifier extends DataType implements Notifier {
-
- /**
- * Sends the data to the requested sender list with specified notifier
- *
- * @param signalName is the name of the signal that has been raised.
- * @param failStatus indicates whether to fail the build or not
- * @param notifierInput contains signal notifier info
- * @param message is the message from the signal that has been raised.
- */
- public void sendData(String signalName, boolean failStatus,
- NotifierInput notifierInput, String message ) {
- }
-
-}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalExceptionConfig.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalExceptionConfig.java Mon Oct 18 10:23:52 2010 +0100
@@ -25,7 +25,7 @@
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
-import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.signal.ant.Notifier;
/**
* The signalExceptionConfig type will allow you to configure post-build
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalInput.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalInput.java Mon Oct 18 10:23:52 2010 +0100
@@ -19,14 +19,14 @@
package com.nokia.helium.signal.ant.types;
+import java.util.List;
import java.util.Vector;
-import org.apache.log4j.Logger;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
import com.nokia.helium.core.ant.types.ReferenceType;
-import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.signal.ant.Notifier;
/**
* SignalInput class which is a type to store input for signals
@@ -47,15 +47,11 @@
*/
public class SignalInput extends DataType
{
- private Vector<ReferenceType> notifierListRef = new Vector<ReferenceType>();
-
- private Vector<NotifierInput> notifierInputList = new Vector<NotifierInput>();
+ private List<ReferenceType<SignalNotifierList>> notifierListRef = new Vector<ReferenceType<SignalNotifierList>>();
// By default it is configured to fail the build.
private String failBuild = "now";
- private Logger log = Logger.getLogger(SignalInput.class);
-
/**
* Defines how the signal framework should handle the error, either
@@ -73,27 +69,10 @@
* @param failBuild type of failure for this input.
*/
public String getFailBuild() {
- return failBuild;
- }
-
- /**
- * Helper function called by ant to create a new notifier for
- * this input.
- * @return ReferenceType created ReferenceType.
- */
- public NotifierInput createNotifierInput() {
- NotifierInput notifierInput = new NotifierInput();
- add(notifierInput);
- return notifierInput;
- }
-
- /**
- * Adds the created notifier to the list
- * @param ReferenceType notifier to be added to the list.
- */
- public void add(NotifierInput notifierInput) {
- if (notifierInput != null) {
- notifierInputList.add(notifierInput);
+ if (this.isReference()) {
+ return getReferencedObject().getFailBuild();
+ } else {
+ return failBuild;
}
}
@@ -102,8 +81,8 @@
* this input.
* @return ReferenceType created ReferenceType.
*/
- public ReferenceType createNotifierListRef() {
- ReferenceType notifierRef = new ReferenceType();
+ public ReferenceType<SignalNotifierList> createNotifierListRef() {
+ ReferenceType<SignalNotifierList> notifierRef = new ReferenceType<SignalNotifierList>();
add(notifierRef);
return notifierRef;
}
@@ -112,34 +91,49 @@
* Adds the created notifier to the list
* @param ReferenceType notifier to be added to the list.
*/
- public void add(ReferenceType notifier) {
+ public void add(ReferenceType<SignalNotifierList> notifier) {
if (notifier != null) {
notifierListRef.add(notifier);
}
}
-
- public Vector<NotifierInput> getNotifierInput() {
- return notifierInputList;
- }
-
+
/**
* Gets the NotifierList associated with this input. If the
* notifier list reference is empty then it throws exception.
* @return List of notifier associated with this input.
*/
public Vector<Notifier> getSignalNotifierList() {
- Vector<Notifier> notifierList = null;
- if (notifierListRef != null) {
- log.debug("getSignalNotifierList:list.size:" + notifierListRef.size());
- for (ReferenceType notifierRef : notifierListRef) {
- Object obj = notifierRef.getReferencedObject();
- if (obj instanceof SignalNotifierList) {
- notifierList = ((SignalNotifierList)obj).getNotifierList();
- break;
+ if (this.isReference()) {
+ return getReferencedObject().getSignalNotifierList();
+ } else {
+ Vector<Notifier> notifierList = null;
+ if (notifierListRef != null) {
+ for (ReferenceType<SignalNotifierList> notifierRef : notifierListRef) {
+ notifierList = notifierRef.getReferencedObject().getNotifierList();
}
+ return notifierList;
}
- return notifierList;
+ throw new BuildException("No signal notifierlist reference defined.");
}
- throw new BuildException("No signal notifierlist reference defined.");
- }
+ }
+
+ /**
+ * Get the signal name. If the object is a reference then its id is used.
+ * 'unknownSignalName' is returned otherwise.
+ * @return the signal name.
+ */
+ public String getName() {
+ if (this.isReference()) {
+ return this.getRefid().getRefId();
+ }
+ return "unknownSignalName";
+ }
+
+ protected SignalInput getReferencedObject() {
+ Object obj = this.getRefid().getReferencedObject();
+ if (obj instanceof SignalInput) {
+ return (SignalInput)obj;
+ }
+ throw new BuildException("SignalInput reference " + this.getRefid().getRefId() + " does not exist.");
+ }
}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalListenerConfig.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalListenerConfig.java Mon Oct 18 10:23:52 2010 +0100
@@ -20,6 +20,7 @@
import java.util.Vector;
+import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
/**
@@ -50,7 +51,7 @@
private String errMsg;
- private Vector<TargetCondition> targetConditions = new Vector<TargetCondition>();
+ private TargetCondition targetCondition;
private String configID;
@@ -85,27 +86,24 @@
*/
public SignalNotifierInput createSignalNotifierInput() {
SignalNotifierInput input = new SignalNotifierInput();
- add(input);
+ signalNotifierInputs.add(input);
+ if (this.signalNotifierInputs.size() > 1) {
+ throw new BuildException(this.getDataTypeName() + " only accept one nested signalNotifierInput at " + this.getLocation());
+ }
return input;
}
/**
- * Helper function to add the created signalinput
- * @param filter to be added to the filterset
- */
- public void add(SignalNotifierInput input) {
- signalNotifierInputs.add(input);
- }
-
-
- /**
* Creates type target condition of type TargetCondition.
* @return ReferenceType which is created and stored by the config.
*/
public TargetCondition createTargetCondition() {
+ if (this.targetCondition != null) {
+ throw new BuildException(this.getDataTypeName() + " only accept one nested targetCondition at " + this.getLocation());
+ }
TargetCondition condition = new TargetCondition();
- add(condition);
- return condition;
+ this.targetCondition = condition;
+ return this.targetCondition;
}
/**
@@ -125,24 +123,12 @@
}
/**
- * Adds the TargetCondition reference to the container.
- * @param TargetCondition to be added to the container, to be processed during signaling.
- */
- public void add(TargetCondition condition) {
- if (condition != null) {
- targetConditions.add(condition);
- }
- }
-
- /**
* Helper function to return the Targetcondition matching the target name.
- * @param String name of the target for which the targetcondition is returned,
+ * @param String name of the target for which the targetcondition is returned, can be null in case of
+ * informative signal, in that case build should not be failing.
*/
public TargetCondition getTargetCondition() {
- if (targetConditions.isEmpty()) {
- return null;
- }
- return targetConditions.get(0);
+ return this.targetCondition;
}
/**
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierInput.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierInput.java Mon Oct 18 10:23:52 2010 +0100
@@ -23,6 +23,7 @@
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.ResourceCollection;
/**
@@ -33,43 +34,41 @@
* </targetCondition>
*
*/
-public class SignalNotifierInput extends DataType
-{
+public class SignalNotifierInput extends DataType {
+
private Vector<SignalInput> signalInputs = new Vector<SignalInput>();
- private Vector<NotifierInput> notifierInputList = new Vector<NotifierInput>();
+ private Vector<ResourceCollection> notifierInputList = new Vector<ResourceCollection>();
/**
- * Helper function called by ant to create a new notifier for
- * this input.
- * @return ReferenceType created ReferenceType.
+ * Create a nested notifierInput element.
+ * @return a new NotifierInput instance.
*/
public NotifierInput createNotifierInput() {
- NotifierInput notifierInput = new NotifierInput();
+ NotifierInput notifierInput = new NotifierInput(getProject());
add(notifierInput);
return notifierInput;
}
/**
- * Adds the created notifier to the list
- * @param ReferenceType notifier to be added to the list.
+ * Adds any kind of ResourceCollection Ant type like
+ * paths or filesets.
+ * @param notifierInput notifier to be added to the list.
*/
- public void add(NotifierInput notifierInput) {
- if (notifierInput != null) {
- notifierInputList.add(notifierInput);
- }
+ public void add(ResourceCollection notifierInput) {
+ notifierInputList.add(notifierInput);
}
/**
- * Helper function to add the created signalinput
- * @param filter to be added to the filterset
+ * Add a nested signalInput.
+ * @param signalInput the signalInput to be added
*/
- public void add(SignalInput input) {
- signalInputs.add(input);
+ public void add(SignalInput signalInput) {
+ signalInputs.add(signalInput);
}
/**
- * Helper function called by ant to create the new signalinput
+ * Create a nested signalInput.
*/
public SignalInput createSignalInput() {
SignalInput input = new SignalInput();
@@ -77,8 +76,12 @@
return input;
}
- public NotifierInput getNotifierInput() {
- NotifierInput input = null;
+ /**
+ * Returns the notifierInput associated to the current object.
+ * @return a ResourceCollection representing the notifier inputs.
+ */
+ public ResourceCollection getNotifierInput() {
+ ResourceCollection input = null;
if (notifierInputList.size() > 1) {
throw new BuildException("One and only signal input can be defined");
}
@@ -94,18 +97,11 @@
*/
public SignalInput getSignalInput() {
if (signalInputs.isEmpty()) {
- throw new BuildException("No signal input in signal config, failed: ");
+ throw new BuildException("One nested signalInput is required at " + this.getLocation());
}
if (signalInputs.size() > 1) {
- throw new BuildException("One and only signal input can be defined");
+ throw new BuildException("One and only signalInput can be defined at " + this.getLocation());
}
-
- Object refObject = signalInputs.elementAt(0).getRefid().getReferencedObject();
- if (refObject == null) {
- throw new BuildException("Signal Input Reference not exists");
- }
-
- SignalInput signalInput = (SignalInput)refObject;
- return signalInput;
+ return signalInputs.elementAt(0);
}
}
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierList.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalNotifierList.java Mon Oct 18 10:23:52 2010 +0100
@@ -22,7 +22,7 @@
import org.apache.tools.ant.types.DataType;
-import com.nokia.helium.signal.Notifier;
+import com.nokia.helium.signal.ant.Notifier;
/**
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalStatusDef.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/SignalStatusDef.java Mon Oct 18 10:23:52 2010 +0100
@@ -22,7 +22,7 @@
import org.apache.tools.ant.types.DataType;
import com.nokia.helium.core.ant.PostBuildAction;
-import com.nokia.helium.signal.SignalStatusList;
+import com.nokia.helium.signal.ant.Signals;
/**
* Class to store the status of the signal of a particular target.
@@ -35,8 +35,8 @@
* @throws BuildException
*/
public void executeOnPostBuild(Project project, String[] targetNames) {
- if (SignalStatusList.getDeferredSignalList().hasSignalInList()) {
- throw new BuildException(SignalStatusList.getDeferredSignalList().getErrorMsg());
+ if (!Signals.getSignals().getDeferredSignalList().isEmpty()) {
+ throw new BuildException(Signals.getSignals().getDeferredSignalList().toString());
}
}
}
--- a/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/TargetCondition.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/src/com/nokia/helium/signal/ant/types/TargetCondition.java Mon Oct 18 10:23:52 2010 +0100
@@ -17,8 +17,7 @@
package com.nokia.helium.signal.ant.types;
-import java.util.Vector;
-
+import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.condition.Condition;
import org.apache.tools.ant.types.DataType;
@@ -31,17 +30,17 @@
private String name;
- private String errMsg;
+ private String message;
- private Vector<Condition> conditionList = new Vector<Condition>();
+ private Condition condition;
/**
* Helper function to store the Name of the target for which the signal to be processed.
*
* @param targetName to be stored.
*/
- public void setName(String targetName) {
- name = targetName;
+ public void setName(String name) {
+ this.name = name;
}
/**
@@ -49,8 +48,8 @@
*
* @param errorMessage to be displayed after failure.
*/
- public void setMessage(String errorMessage) {
- errMsg = errorMessage;
+ public void setMessage(String message) {
+ this.message = message;
}
/**
@@ -59,7 +58,10 @@
* @param condition variable to add
*/
public void add(Condition condition) {
- conditionList.add(condition);
+ if (this.condition != null) {
+ throw new BuildException(this.getDataTypeName() + " type can only accept one condition at " + this.getLocation().toString());
+ }
+ this.condition = condition;
}
/**
@@ -67,8 +69,11 @@
*
* @return conditions variable for this configuration.
*/
- public Vector<Condition> getConditions() {
- return conditionList;
+ public Condition getCondition() {
+ if (this.condition == null) {
+ throw new BuildException(this.getDataTypeName() + " must have one nested condition defined at " + this.getLocation().toString());
+ }
+ return condition;
}
/**
@@ -88,6 +93,6 @@
* @deprecated
*/
public String getMessage() {
- return errMsg;
+ return message;
}
}
--- a/buildframework/helium/sf/java/signaling/src/templates/email.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-<#--
-============================================================================
-Name : email.html.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
- <title>
- Build result e-mail from ${ant["env.COMPUTERNAME"]}.
- </title>
- <style type="text/css">
- body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
- h1{
- font-size:14pt;
- color:#000;
- padding: 20px 15px;
- margin:0;
- }
- h2{font-size:12pt;}
- h5{
- font-size:10pt;
- background-color:#8495BA;
- color:#fff;
- heigth:20pt;
- padding: 5px 15px;
- border-left:2px solid #5A6FA0;
- border-bottom:2px solid #5A6FA0;
- border-top:2px solid #98A6C6;
- border-right:2px solid #98A6C6;
- margin:0;
- }
-
-
- p {
- font-size:10pt;
- padding: 0em 1em 1em 1em;
- margin: 0 1em 0.5em 1em;
- border-right:1px solid #5A6FA0;
- border-top:0;
- border-bottom:1px solid #98A6C6;
- border-left:1px solid #98A6C6;
- background-color:#CDE4EB;
- white-space:normal;
- }
-
- .data{color:#00F;}
- .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
- .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
-
- span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
-
- span.bold{font-weight:bold; display:block; padding: 1em 0;}
- p.maintext{padding-top: 1em;}
- p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
- p.distrib{font-weight:bold;}
-
-
- a:link,a:visited{color:#00E;}
-
- </style>
- </head>
- <body>
- <!-- The title -->
- <div id="buildname">
- <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
- </div>
-
- <!-- section -->
- <#macro create_section title type>
- <div id="foldername">
- <h5>${title}</h5>
- <p class="maintext">
- <!-- content span -->
- <span class="${type}"><#nested></span>
- </p>
- </div>
- </#macro>
-
-<#list doc.logSummary.log as lognode>
- <#if (lognode.build[".//message[@priority='error']"]?size > 0)>
- <span class="errormessage">
- <#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...FAIL<br/></#if>
- <ul>
- <#list lognode.build[".//message[@priority='error']"] as message>
- ${message}<br/>
- </#list>
- </ul>
- </span>
- <#else>
- <span class="okmessage"><#if (lognode.@filename[0])?exists>${lognode.@filename[0]}...OK<br/></#if></span>
- </#if>
-</#list>
-</body>
-</html>
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/templates/email_default.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-<#--
-============================================================================
-Name : email.html.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
- <title>
- Build result e-mail from ${ant["env.COMPUTERNAME"]}.
- </title>
- <style type="text/css">
- body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
- h1{
- font-size:14pt;
- color:#000;
- padding: 20px 15px;
- margin:0;
- }
- h2{font-size:12pt;}
- h5{
- font-size:10pt;
- background-color:#8495BA;
- color:#fff;
- heigth:20pt;
- padding: 5px 15px;
- border-left:2px solid #5A6FA0;
- border-bottom:2px solid #5A6FA0;
- border-top:2px solid #98A6C6;
- border-right:2px solid #98A6C6;
- margin:0;
- }
-
-
- p {
- font-size:10pt;
- padding: 0em 1em 1em 1em;
- margin: 0 1em 0.5em 1em;
- border-right:1px solid #5A6FA0;
- border-top:0;
- border-bottom:1px solid #98A6C6;
- border-left:1px solid #98A6C6;
- background-color:#CDE4EB;
- white-space:normal;
- }
-
- .data{color:#00F;}
- .okmessage{color:#24A22D;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
- .errormessage{color:#F00;font-weight:bold; display:block; margin-bottom: 1em;padding-top: 1em;}
-
- span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
-
- span.bold{font-weight:bold; display:block; padding: 1em 0;}
- p.maintext{padding-top: 1em;}
- p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
- p.distrib{font-weight:bold;}
-
-
- a:link,a:visited{color:#00E;}
-
- </style>
- </head>
- <body>
- <!-- The title -->
- <div id="buildname">
- <h1>This is an e-mail notification that a build has been completed on ${ant["env.COMPUTERNAME"]}</h1>
- </div>
- <span class="okmessage">${signaling['signal.name']} is finished.</span>
- </body>
-</html>
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/src/templates/email_subject.txt.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-<#--
-============================================================================
-Name : email_subject.txt.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-${ant["build.id"]}:${ant["env.COMPUTERNAME"]}: ${signalname} alert
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/tests/antunit/signaling_test.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,272 +0,0 @@
-<?xml version="1.0"?>
-<!--
-============================================================================
-Name : test_signaling.ant.xml
-Part of : Helium AntLib
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<project name="test-signaling" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
- <description>
- Test all the helium signals
- </description>
-
- <dirname property="project.dir.signaling" file="${ant.file.test-signaling}" />
-
- <taskdef resource="com/nokia/helium/core/ant/antlib.xml" uri="http://www.nokia.com/helium" />
- <import file="test_signaling_config.ant.xml" />
-
- <property name="build.summary.file" location="${project.dir.signaling}/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
-
- <target name="target-valid-config1">
- <echo message="valid configuration1" />
- </target>
-
- <target name="target-valid-config2">
- <echo message="valid configuration2" />
- </target>
-
- <target name="target-valid-config3">
- <echo message="valid configuration3" />
- </target>
-
- <target name="target-valid-config4">
- <echo message="valid configuration4" />
- </target>
-
- <target name="target-valid-config5">
- <echo message="valid configuration5" />
- </target>
-
- <target name="target-invalid-config1">
- <echo message="invalid configuration1" />
- </target>
-
- <target name="target-invalid-config2">
- <echo message="invalid configuration2" />
- </target>
-
- <target name="target-invalid-config3">
- <echo message="invalid configuration3" />
- </target>
-
- <target name="target-invalid-config4">
- <echo message="invalid configuration4" />
- </target>
-
- <target name="target-empty-notifier-list-config5">
- <echo message="Empty signal list is a valid configuration5" />
- </target>
-
- <target name="target-valid-config6">
- <echo message="Empty signal list is a valid configuration6" />
- </target>
-
- <target name="target-valid-config7">
- <echo message="Empty signal list is a valid configuration7" />
- </target>
-
- <target name="target-valid-config8">
- <echo message="Empty signal list is a valid configuration8" />
- </target>
-
- <target name="target-invalid-config9">
- <echo message="invalid configuration9" />
- </target>
-
- <target name="test-case1">
- <echo message="testing config without signal input" />
- <antcall target="target-valid-config1" inheritRefs="true"/>
- </target>
-
- <target name="test-case2">
- <echo message="testing config without signal input" />
- <antcall target="target-valid-config2" inheritRefs="true" />
- </target>
-
- <target name="test-case3">
- <echo message="testing config without signal input" />
- <antcall target="target-valid-config3" inheritRefs="true" />
- </target>
-
- <target name="test-case4">
- <echo message="testing config without signal input" />
- <antcall target="target-valid-config4" inheritRefs="true" />
- </target>
-
- <target name="test-case5">
- <echo message="testing config without signal input" />
- <antcall target="target-valid-config5" inheritRefs="true" />
- </target>
-
- <target name="test-case6">
- <echo message="testing config without signal input" />
- <au:expectfailure>
- <antcall target="target-invalid-config1" inheritRefs="true" />
- </au:expectfailure>
- </target>
-
- <target name="test-case7">
- <echo message="testing when the named target is not exists, so signal" />
- <antcall target="target-invalid-config2" inheritRefs="true" />
- </target>
-
- <target name="test-case8">
- <!-- This test case is not valid anymore, now the attribute validation is done
- at Ant parsing level -->
- <!--echo message="testing config without signal input" />
- <au:expectfailure>
- <antcall target="target-invalid-config3" inheritRefs="true" />
- </au:expectfailure-->
- </target>
-
- <target name="test-case9">
- <echo message="testing config without signal input" />
- <au:expectfailure>
- <antcall target="target-invalid-config4" inheritRefs="true" />
- </au:expectfailure>
- </target>
-
- <target name="test-case10">
- <echo message="testing config without signal input" />
- <au:expectfailure>
- <antcall target="target-invalid-config5" inheritRefs="true" />
- </au:expectfailure>
- </target>
-
- <target name="test-case11">
- <echo message="testing config without signal input" />
- <au:expectfailure>
- <antcall target="target-invalid-config6" inheritRefs="true" />
- </au:expectfailure>
- </target>
-
- <target name="test-signal-exception">
- <property name="exceptions.target" value="final-exception-target"/>
- <echo message="signal exception target" />
- <fail message="fail for signal exception" />
- </target>
-
- <target name="final-exception-target">
- <echo message="final-exception-target executed" />
- </target>
-
- <target name="test-case12">
- <echo message="testing config without signal input" />
- <au:expectfailure>
- <antcall target="target-invalid-config7" inheritRefs="true" />
- </au:expectfailure>
- </target>
-
- <target name="test-case13">
- <echo message="testing config without signal input" />
- <au:expectfailure>
- <antcall target="target-invalid-config8" inheritRefs="true" />
- </au:expectfailure>
- </target>
-
- <target name="test-case14">
- <echo message="testing config without signal input" />
- <au:expectfailure>
- <antcall target="target-invalid-config9" inheritRefs="true" />
- </au:expectfailure>
- </target>
-
- <!-- functionality testing -->
- <target name="fail-now-false-condition">
- <echo message="fail-now-false-condition target: configured to fail now - false condition" />
- </target>
-
- <target name="fail-now-true-condition">
- <echo message="fail-now-true-condition target: configured to fail now - true condition" />
- </target>
-
- <target name="fail-no-condition">
- <echo message="fail-now-false-condition target: configured to fail now - true condition" />
- </target>
-
- <target name="fail-defer-false-condition">
- <echo message="fail-defer-false-condition target: configured to fail later - false condition" />
- </target>
-
- <target name="fail-defer-true-condition">
- <echo message="${number.of.errors}" />
- <echo message="fail-defer-true-condition target: configured to fail later - true condition" />
- </target>
-
- <target name="fail-never-false-condition">
- <echo message="fail-never-false-condition target: configured to fail never - false condition" />
- </target>
-
- <target name="fail-never-true-condition">
- <echo message="fail-never-true-condition target: configured to fail never - true condition" />
- </target>
-
- <target name="test-fail-now-false-condition">
- <antcall target="fail-now-false-condition" inheritRefs="true" />
- </target>
-
- <target name="compile-signal-test">
- <au:expectfailure>
- <echo message="compile-signal failure test" />
- </au:expectfailure>
- </target>
-
- <target name="test-compile-signal-test">
- <au:expectfailure>
- <antcall target="compile-signal-test" inheritRefs="true" />
- </au:expectfailure>
- </target>
-
- <target name="test-fail-now-true-condition">
- <au:expectfailure>
- <antcall target="fail-now-true-condition" inheritRefs="true" />
- </au:expectfailure>
- </target>
-
- <target name="test-fail-no-condition" >
- <antcall target="fail-no-condition" inheritRefs="true" />
- </target>
-
- <target name="test-fail-defer-false-condition">
- <antcall target="fail-defer-false-condition" inheritRefs="true" />
- </target>
-
- <target name="test-fail-defer-true-condition">
- <antcall target="fail-defer-true-condition" inheritRefs="true"/>
- <au:assertTrue>
- <hlm:hasDeferredFailure name="inputFailDefer"/>
- </au:assertTrue>
- <hlm:clearDeferredFailures/>
- </target>
-
- <target name="test-fail-never-false-condition">
- <antcall target="fail-never-false-condition" inheritRefs="true" />
- </target>
-
- <target name="test-fail-never-true-condition">
- <antcall target="fail-never-true-condition" inheritRefs="true" />
- </target>
-
-
- <target name="test-all" depends="test-fail-all, test-case-all,test-compile-signal-test" />
- <target name="test-fail-all" depends="test-fail-now-false-condition, test-fail-now-true-condition,
- test-fail-no-condition,test-fail-defer-false-condition, test-fail-defer-true-condition,
- test-fail-never-false-condition, fail-never-false-condition, fail-never-true-condition" />
- <target name="test-case-all" depends="test-case1, test-case2, test-case3, test-case4, test-case5, test-case6,
- test-case7,test-case8,test-case9,test-case10,test-case11,test-case12,test-case13,test-case14" />
-</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/tests/antunit/test_defered_failure.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-deferred-failure" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+
+ <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+ <import file="run-scenario.ant.xml" />
+
+ <!-- This scenario is testing the SignalStatusDef is correctly failing the build -->
+ <target name="test-failing-build">
+ <au:expectfailure>
+ <runScenario scenario="test-deferred-failure" target="build" />
+ </au:expectfailure>
+ <au:assertLogContains text="BUILD FAILED" />
+ <au:assertLogContains text="Executing failing-target." />
+ <au:assertLogContains text="Executing build." />
+ </target>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/tests/antunit/test_executetasknotifier.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/tests/antunit/test_executetasknotifier.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -65,20 +65,20 @@
</target>
<target name="test-notifier-is-called">
- <hlm:signal name="testSignal" result="0" message="message">
+ <hlm:signal result="0" message="message">
<signalNotifierInput>
<hlm:signalInput refid="testNeverSignalInput" />
</signalNotifierInput>
</hlm:signal>
- <au:assertLogContains text="Signal: testSignal" />
+ <au:assertLogContains text="Signal: testNeverSignalInput" />
</target>
<target name="test-notifier-with-runtarget-works">
- <hlm:signal name="testSignal" result="0" message="message">
+ <hlm:signal result="0" message="message">
<signalNotifierInput>
<hlm:signalInput refid="testNeverSignalInputRuntarget" />
</signalNotifierInput>
</hlm:signal>
- <au:assertLogContains text="Signal: testSignal" />
+ <au:assertLogContains text="Signal: testNeverSignalInputRuntarget" />
</target>
</project>
--- a/buildframework/helium/sf/java/signaling/tests/antunit/test_hasdeferredfailure.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/tests/antunit/test_hasdeferredfailure.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -77,11 +77,7 @@
<target name="raise-signal">
<!-- This raise a testSignal. -->
- <hlm:signal name="testDeferredSignal" result="1" >
- <signalNotifierInput>
- <hlm:signalInput refid="testDeferredSignalInput" />
- </signalNotifierInput>
- </hlm:signal>
+ <hlm:signal name="testDeferredSignalInput" result="1" />
</target>
<target name="test-pending-failure" depends="raise-signal">
@@ -92,7 +88,7 @@
<target name="test-pending-failure-named" depends="raise-signal">
<au:assertTrue>
- <hlm:hasDeferredFailure name="testDeferredSignal"/>
+ <hlm:hasDeferredFailure name="testDeferredSignalInput"/>
</au:assertTrue>
</target>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/tests/antunit/test_signal_listener.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,55 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-signal-listener" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+
+ <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+ <import file="run-scenario.ant.xml" />
+
+ <!-- This scenario is testing the SignalStatusDef is correctly failing the build -->
+ <target name="test-failing-build-with-deferred-failure">
+ <au:expectfailure>
+ <runScenario scenario="signal-listener-test" target="build-with-deferred-failure" />
+ </au:expectfailure>
+ <au:assertLogContains text="BUILD FAILED" />
+ <au:assertLogContains text="Executing failing-target." />
+ <au:assertLogContains text="Executing build." />
+ <au:assertLogContains text="testDeferredSignal: Errors happened during failing-target : failing-target" />
+ <au:assertLogContains text="Build completed with errors and warnings." />
+ </target>
+
+ <target name="test-failing-build-with-never-failure">
+ <runScenario scenario="signal-listener-test" target="build-with-never-failure" />
+ <au:assertLogContains text="BUILD SUCCESSFUL" />
+ <au:assertLogContains text="Executing never-failing-target." />
+ <au:assertLogContains text="Executing build." />
+ <au:assertLogContains text="Build completed with errors and warnings." />
+ </target>
+
+ <!-- This test check that missing condition on signalListenerConfig only throw non-failing signal -->
+ <target name="test-no-cond-signal">
+ <runScenario scenario="signal-listener-test" target="no-cond-signal" />
+ <au:assertLogContains text="BUILD SUCCESSFUL" />
+ <au:assertLogContains text="Signal: testNoCondSignal" />
+ <au:assertLogContains text="Failure: No" />
+ </target>
+</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/tests/antunit/test_signaling_config.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/tests/antunit/test_signaling_config.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -229,8 +229,8 @@
<signalInput refid="validSignalInput" />
</signalNotifierInput>
- <targetCondition >
- <!-- <xml severity="error" file="./data/helium_minibuild_ido_compile.log.xml" /> -->
+ <targetCondition>
+ <cond:not><equals arg1="0" arg2="0"/></cond:not>
</targetCondition>
</hlm:signalListenerConfig>
@@ -239,7 +239,7 @@
<signalInput refid="validSignalInput" />
</signalNotifierInput>
<targetCondition >
- <!-- <cond:not><equals arg1="0" arg2="${number.of.error}"/></cond:not> -->
+ <cond:not><equals arg1="0" arg2="0"/></cond:not>
</targetCondition>
</hlm:signalListenerConfig>
@@ -248,7 +248,7 @@
<signalInput refid="validSignalInput" />
</signalNotifierInput>
<targetCondition >
- <!--<cond:not><equals arg1="0" arg2="0"/></cond:not> -->
+ <cond:not><equals arg1="0" arg2="0"/></cond:not>
</targetCondition>
</hlm:signalListenerConfig>
@@ -274,12 +274,12 @@
</targetCondition>
</hlm:signalListenerConfig>
- <hlm:signalListenerConfig id="failNow" target="fail-no-condition" message="Errors during testing" >
+ <!-- Not allowed hlm:signalListenerConfig id="failNow" target="fail-no-condition" message="Errors during testing" >
<signalNotifierInput>
<signalInput refid="input-fail-build-never" />
</signalNotifierInput>
<targetCondition />
- </hlm:signalListenerConfig>
+ </hlm:signalListenerConfig-->
<hlm:signalListenerConfig id="failbuildDefer" target="fail-defer-false-condition" message="Errors during testing">
<signalNotifierInput>
@@ -320,7 +320,7 @@
<signalInput refid="input-fail-build-never" />
</signalNotifierInput>
- <targetCondition >
+ <targetCondition>
<cond:not>
<equals arg1="0" arg2="${number.of.errors}" />
</cond:not>
@@ -332,4 +332,39 @@
<hlm:signalInput id="invalid-input1" failbuild="wrong-type" />
</au:expectfailure>
</target>
+
+
+ <target name="test-dual-cond-failure">
+ <au:expectfailure expectedMessage="TargetCondition type can only accept one condition at">
+ <hlm:signalListenerConfig id="dualCondSignal" target="compile-signal-test" message="Errors happened during compilation">
+ <signalNotifierInput>
+ <signalInput refid="compilesignalinput" />
+ </signalNotifierInput>
+ <targetCondition >
+ <cond:not>
+ <equals arg1="0" arg2="${number.of.errors}" />
+ </cond:not>
+ <cond:equals arg1="0" arg2="${number.of.errors}" />
+ </targetCondition>
+ </hlm:signalListenerConfig>
+ </au:expectfailure>
+ </target>
+
+ <target name="test-dual-signal-input-failure">
+ <au:expectfailure expectedMessage="signalListenerConfig only accept one nested signalNotifierInput at">
+ <hlm:signalListenerConfig id="dualSignalNotifierInputSignal" target="compile-signal-test" message="Errors happened during compilation">
+ <signalNotifierInput>
+ <signalInput refid="compilesignalinput" />
+ </signalNotifierInput>
+ <signalNotifierInput>
+ <signalInput refid="compilesignalinput" />
+ </signalNotifierInput>
+ <targetCondition>
+ <cond:not>
+ <equals arg1="0" arg2="${number.of.errors}" />
+ </cond:not>
+ </targetCondition>
+ </hlm:signalListenerConfig>
+ </au:expectfailure>
+ </target>
</project>
--- a/buildframework/helium/sf/java/signaling/tests/antunit/test_signaltask.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/tests/antunit/test_signaltask.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -64,7 +64,12 @@
<target name="raise-deferred-failure">
<!-- This raise a testSignal. -->
- <hlm:signal name="testDeferredSignal" result="1" message="message">
+ <hlm:signal name="testDeferredSignalInput" result="1" message="message" />
+ </target>
+
+ <target name="raise-deferred-failure-nested-signal">
+ <!-- This raise a testSignal. -->
+ <hlm:signal result="1" message="message">
<signalNotifierInput>
<hlm:signalInput refid="testDeferredSignalInput" />
</signalNotifierInput>
@@ -101,13 +106,25 @@
<target name="test-raise-deferred-failure">
<!-- This will not fail the build -->
<antcall target="raise-deferred-failure" />
+ <au:assertTrue>
+ <hlm:hasDeferredFailure name="testDeferredSignalInput"/>
+ </au:assertTrue>
+ </target>
+
+
+ <target name="test-raise-deferred-failure-nested-signal">
+ <!-- This will not fail the build -->
+ <antcall target="raise-deferred-failure-nested-signal" />
+ <au:assertTrue>
+ <hlm:hasDeferredFailure name="testDeferredSignalInput"/>
+ </au:assertTrue>
</target>
<target name="test-raise-deferred-now-failure">
<!-- This will not fail the build -->
<antcall target="raise-deferred-failure" />
<!-- But next one should. -->
- <au:expectfailure expectedMessage="testSignal: message : raise-failure-now">
+ <au:expectfailure expectedMessage="testSignalInput: message : raise-failure-now">
<antcall target="raise-failure-now" />
</au:expectfailure>
</target>
@@ -120,13 +137,14 @@
</target>
<target name="test-name-args-not-existing">
- <au:expectfailure expectedMessage="Could not find signal config for signal name: testNonExistingSignal">
+ <au:expectfailure expectedMessage="name attribute (testNonExistingSignal) is not refering to a signalInput">
<hlm:signal name="testNonExistingSignal" />
</au:expectfailure>
</target>
+ <!-- You can use-->
<target name="test-too-many-nested-element">
- <au:expectfailure expectedMessage="One and only signal input can be defined">
+ <au:expectfailure expectedMessage="One and only signalInput can be defined at">
<hlm:signal name="testNonExistingSignal">
<signalNotifierInput>
<hlm:signalInput refid="testSignalInput" />
@@ -136,4 +154,24 @@
</au:expectfailure>
</target>
+ <!-- Should fail if the signal name is not refering to a signalInput instance -->
+ <fileset id="fileset.id" dir="." />
+ <target name="test-invalid-reference">
+ <au:expectfailure expectedMessage="name attribute (fileset.id) is not refering to a signalInput">
+ <hlm:signal name="fileset.id" />
+ </au:expectfailure>
+ </target>
+
+
+ <target name="test-deprecation-message">
+ <!-- This raise a testSignal. -->
+ <hlm:signal name="testDeferredSignal" result="1" message="message">
+ <signalNotifierInput>
+ <hlm:signalInput refid="testDeferredSignalInput" />
+ </signalNotifierInput>
+ </hlm:signal>
+ <au:assertLogContains text="The usage of name and nested signalInputNotifier at the same time is deprecated." />
+ </target>
+
+
</project>
--- a/buildframework/helium/sf/java/signaling/tests/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/tests/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -24,17 +24,5 @@
<description>Helium Antlib signaling tests.</description>
<import file="${builder.dir}/java/test-macros.ant.xml"/>
- <property environment="env" />
- <dirname property="signaling.test.project.dir" file="${ant.file.helium-antlib-signaling-unittest}" />
- <property name="build.summary.file" location="${signaling.test.project.dir}/test_signal/data/ido_tedo_mcl_devlon52_ec_MCL.52.105_summary.log.xml" />
- <property name="build.id" value="test_new_hlm"/>
-
- <import file="${signaling.test.project.dir}/antunit/signaling_test.ant.xml" />
-
- <target name="unittest" depends="unittest-signaling,test-macros.unittest" />
-
- <target name="unittest-signaling">
- <antcall target="test-all" />
- </target>
</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/tests/scenarii/dual-cond-config-failure/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="failing-build" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+
+ <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+ <hlm:signalExceptionConfig id="signal.exception.config">
+ <hlm:notifierList>
+ <hlm:executeTaskNotifier>
+ <echo>Signal: ${signal.name}</echo>
+ <echo>Message: ${signal.message}</echo>
+ </hlm:executeTaskNotifier>
+ </hlm:notifierList>
+ </hlm:signalExceptionConfig>
+
+
+ <target name="build">
+ <fail message="Failing the build." />
+ </target>
+
+</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/tests/scenarii/signal-listener-test/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,94 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="signal-listener-test" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium" xmlns:cond="antlib:org.apache.tools.ant.types.conditions">
+
+ <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+ <!-- Deferred signal -->
+ <hlm:notifierList id="testSignalNotifiers">
+ <hlm:executeTaskNotifier>
+ <echo>Signal: ${signal.name}</echo>
+ </hlm:executeTaskNotifier>
+ </hlm:notifierList>
+
+ <hlm:signalInput id="testDeferredSignalInput" failBuild="defer">
+ <hlm:notifierListRef refid="testSignalNotifiers" />
+ </hlm:signalInput>
+
+ <hlm:signalListenerConfig id="testDeferredSignal" target="failing-target" message="Errors happened during failing-target">
+ <signalNotifierInput>
+ <signalInput refid="testDeferredSignalInput" />
+ </signalNotifierInput>
+ <targetCondition >
+ <cond:not>
+ <equals arg1="0" arg2="${number.of.errors}" />
+ </cond:not>
+ </targetCondition>
+ </hlm:signalListenerConfig>
+
+ <hlm:signalInput id="testNeverSignalInput" failBuild="never">
+ <hlm:notifierListRef refid="testSignalNotifiers" />
+ </hlm:signalInput>
+
+ <hlm:signalListenerConfig id="testNeverSignal" target="never-failing-target" message="Errors happened during never-failing-target">
+ <signalNotifierInput>
+ <signalInput refid="testNeverSignalInput" />
+ </signalNotifierInput>
+ <targetCondition >
+ <cond:not>
+ <equals arg1="0" arg2="${number.of.errors}" />
+ </cond:not>
+ </targetCondition>
+ </hlm:signalListenerConfig>
+
+ <target name="failing-target">
+ <echo message="Executing failing-target." />
+ <property name="number.of.errors" value="1" />
+ </target>
+
+ <target name="build-with-deferred-failure" depends="failing-target">
+ <echo message="Executing build." />
+ </target>
+
+ <target name="never-failing-target">
+ <echo message="Executing never-failing-target." />
+ <property name="number.of.errors" value="1" />
+ </target>
+
+ <target name="build-with-never-failure" depends="never-failing-target">
+ <echo message="Executing build." />
+ </target>
+
+
+ <!-- -->
+ <hlm:signalInput id="testNoCondSignalInput" failBuild="defer" />
+
+ <hlm:signalListenerConfig id="testNoCondSignal" target="no-cond-signal" message="This signal is emitted without specific condition, except the target being called.">
+ <signalNotifierInput>
+ <signalInput refid="testNoCondSignalInput" />
+ </signalNotifierInput>
+ </hlm:signalListenerConfig>
+
+ <target name="no-cond-signal" />
+
+</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/signaling/tests/scenarii/test-deferred-failure/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-defered-failure" xmlns:au="antlib:org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+
+ <taskdef resource="com/nokia/helium/signal/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+
+ <!-- Deferred signal -->
+ <hlm:notifierList id="testDeferredSignalNotifiers">
+ <hlm:executeTaskNotifier>
+ <echo>Signal: ${signal.name}</echo>
+ </hlm:executeTaskNotifier>
+ </hlm:notifierList>
+
+ <hlm:signalInput id="testDeferredSignalInput" failBuild="defer">
+ <hlm:notifierListRef refid="testDeferredSignalNotifiers" />
+ </hlm:signalInput>
+
+ <target name="failing-target">
+ <echo message="Executing failing-target." />
+ <hlm:signal name="testDeferredSignalInput" result="1" message="Failure under failing-target." />
+ </target>
+
+ <target name="build" depends="failing-target">
+ <echo message="Executing build." />
+ </target>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/sf/java/signaling/tests/src/com/nokia/helium/signaling/tests/TestEmailSender.java Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/signaling/tests/src/com/nokia/helium/signaling/tests/TestEmailSender.java Mon Oct 18 10:23:52 2010 +0100
@@ -51,7 +51,7 @@
en.setTitle("test");
en.setSmtp("test");
en.setLdap("test");
- NotifierInput input = new NotifierInput();
+ NotifierInput input = new NotifierInput(p);
input.setFile(new File(System.getProperty("testdir") + "/tests/data/test.log_status.html"));
en.sendData("test", true, input, "Test Message");
}
@@ -70,7 +70,7 @@
en.setTitle("test");
en.setSmtp("test");
en.setLdap("test");
- NotifierInput input = new NotifierInput();
+ NotifierInput input = new NotifierInput(p);
en.sendData("test", true, input, "Test Message");
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/sysdef/demo/data/sf/os/buildtools/bldsystemtools/sysdeftools/joinsysdef.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+#============================================================================
+#Name : .pl
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#============================================================================
+use FindBin '$Bin';
+system("python $Bin/joinsysdef_mock.py @ARGV");
\ No newline at end of file
--- a/buildframework/helium/sf/java/sysdef/src/com/nokia/helium/sysdef/templates/root_sysdef_model.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/java/sysdef/src/com/nokia/helium/sysdef/templates/root_sysdef_model.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -142,7 +142,7 @@
]>
<SystemDefinition schema="3.0.0" <#if (idnamespace?? && idnamespace!="http://www.symbian.org/system-definition")>xmlns:vendor="${idnamespace}"</#if>>
<systemModel name="<#list roots?keys as root>${root}<#if root_has_next>_</#if></#list>">
-<#list layers?keys as layer>
+<#list layers?keys?sort as layer>
<layer id="${layer}" name="${layer}">
<#list roots?keys as root>
<#if roots[root]?keys?seq_contains(layer)>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="blockspackager">
+ <property name="builder.dir" location="../../builder"/>
+ <import file="${builder.dir}/python/macros.ant.xml"/>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/ivy.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!--
+============================================================================
+Name : ivy.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
+ <info
+ organisation="com.nokia.helium"
+ module="blockspackager"
+ status="integration">
+ </info>
+ <publications>
+ <artifact type="egg"/>
+ </publications>
+ <dependencies>
+ <dependency name="pythoncore" rev="latest.integration" conf="default" />
+ </dependencies>
+</ivy-module>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/blockspackagercpythontests/__init__.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+#============================================================================
+#Name : __init__.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/blockspackagertests/__init__.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,18 @@
+#============================================================================
+#Name : __init__.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/blockspackagertests/test_packager_cli.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,44 @@
+#============================================================================
+#Name : test_packager_cli.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+import unittest
+import unittestadditions
+skipTest = False
+try:
+ import packager.cli
+except ImportError:
+ skipTest = True
+import logging
+
+
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('nokiatest.datasources')
+
+
+class CliTest(unittest.TestCase):
+ """ Verifying the datasource interface. """
+
+ @unittestadditions.skip(skipTest)
+ def test_cli(self):
+ """ Check that --help-datasource works. """
+ app = packager.cli.PackagerApp()
+ ret = app.execute(['--help-datasource'])
+ print ret
+ assert ret == 0, "Return value for help must be 0."
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/blockspackagertests/test_packager_datasources.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,377 @@
+#============================================================================
+#Name : test_packager_datasources.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+import unittest
+from unittestadditions import skip
+skipTest = False
+try:
+ import packager.datasources
+except ImportError:
+ skipTest = True
+import os
+from StringIO import StringIO
+import tempfile
+import xml.sax
+import logging
+import sys
+
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('nokiatest.datasources')
+
+class DataSourceInterfaceTest(unittest.TestCase):
+ """ Verifying the datasource interface. """
+
+ @skip(skipTest)
+ def test_datasource_getComponent(self):
+ """ Check that getComponent is not implemented. """
+ ds = packager.datasources.DataSource('/')
+ self.assertRaises(NotImplementedError, ds.getComponents)
+
+ @skip(skipTest)
+ def test_datasource_getHelp(self):
+ """ Check that no help is defined. """
+ ds = packager.datasources.DataSource('/')
+ self.assertEqual(None, ds.getHelp())
+ self.assertEqual(ds.help, ds.getHelp())
+
+class CMakerDataSourceTest(unittest.TestCase):
+ """ Unit test for CMakerDataSource """
+ @skip(skipTest)
+ def test_whatlog_missing(self):
+ """ getComponent should fail if whatlog is missing. """
+ data = {}
+ ds = packager.datasources.CMakerDataSource('/', data)
+ self.assertRaises(packager.datasources.MissingProperty, ds.getComponents)
+
+ @skip(skipTest)
+ def test_configdir_missing(self):
+ """ getComponent should fail if configdir is missing. """
+ data = {'whatlog': 'somevalue'}
+ ds = packager.datasources.CMakerDataSource('/', data)
+ self.assertRaises(packager.datasources.MissingProperty, ds.getComponents)
+
+ @skip(skipTest)
+ def test_invalid_whatlog_invalid_configdir(self):
+ """ getComponent should fail because whatlog doesn't exists. """
+ data = {'whatlog': 'somevalue', 'configdir': 'somevalue'}
+ ds = packager.datasources.CMakerDataSource('/', data)
+ self.assertRaises(Exception, ds.getComponents)
+
+ @skip(skipTest)
+ def test_valid_whatlog_invalid_configdir(self):
+ """ getComponent should fail because configdir doesn't exists. """
+ data = {'whatlog': __file__, 'configdir': 'somevalue'}
+ ds = packager.datasources.CMakerDataSource('/', data)
+ self.assertRaises(Exception, ds.getComponents)
+
+ @skip(skipTest)
+ def test_install_log_parsing(self):
+ """ Test the parsing of a regular cmaker install log. """
+ log = r"""C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/env.mk),q(/epoc32/tools/cmaker/env.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/functions.mk),q(/epoc32/tools/cmaker/functions.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/include_template.mk),q(/epoc32/tools/cmaker/include_template.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/settings.mk),q(/epoc32/tools/cmaker/settings.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/tools.mk),q(/epoc32/tools/cmaker/tools.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/utils.mk),q(/epoc32/tools/cmaker/utils.mk))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(bin/mingw_make.exe),q(/epoc32/tools/rom/mingw_make.exe))'
+C:\APPS\actperl\bin\perl.exe -e 'use File::Copy; copy(q(src/cmaker.cmd),q(/epoc32/tools/cmaker.cmd))'
+"""
+ (handle, filename) = tempfile.mkstemp()
+ os.write(handle, log)
+ os.close(handle)
+
+ data = {'whatlog': filename, 'configdir': os.path.dirname(__file__)}
+ ds = packager.datasources.CMakerDataSource('/', data)
+ components = ds.getComponents()
+ assert len(components) == 1
+ assert len(components[0].getTargetFiles()) == 8
+ assert 'epoc32/tools/rom/mingw_make.exe' in components[0].getTargetFiles()
+
+ os.remove(filename)
+
+
+ @skip(skipTest)
+ def test_what_log_parsing_windows(self):
+ """ Test the parsing of a regular cmaker what log (windows). """
+ if sys.platform == 'win32':
+ log = r"""\epoc32\tools\rom\image.txt
+\CreateImage.cmd
+cd \config\overlay && xcopy *.* \ /F /R /Y /S
+0 File(s) copied
+cd \tools\toolsmodTB92 && xcopy *.* \ /F /R /Y /S
+Y:\tools\toolsmodTB92\epoc32\tools\abld.pl -> Y:\epoc32\tools\abld.pl
+Y:\tools\toolsmodTB92\epoc32\tools\bldmake.pl -> Y:\epoc32\tools\bldmake.pl
+"""
+ (handle, filename) = tempfile.mkstemp()
+ os.write(handle, log)
+ os.close(handle)
+
+ data = {'whatlog': filename, 'configdir': os.path.dirname(__file__)}
+ ds = packager.datasources.CMakerDataSource('/', data)
+ components = ds.getComponents()
+ assert len(components) == 1
+ assert len(components[0].getTargetFiles()) == 2
+ print components[0].getTargetFiles()
+ assert 'CreateImage.cmd' in components[0].getTargetFiles()
+ assert 'epoc32/tools/rom/image.txt' in components[0].getTargetFiles()
+ assert 'epoc32/tools/abld.pl' not in components[0].getTargetFiles()
+ assert 'epoc32/tools/bldmake.pl' not in components[0].getTargetFiles()
+
+ os.remove(filename)
+
+ @skip(skipTest)
+ def test_what_log_parsing_linux(self):
+ """ Test the parsing of a regular cmaker what log (linux). """
+ if sys.platform != 'win32':
+ log = r"""/epoc32/tools/rom/image.txt
/CreateImage.cmd
+"""
+ (handle, filename) = tempfile.mkstemp()
+ os.write(handle, log)
+ os.close(handle)
+
+ data = {'whatlog': filename, 'configdir': os.path.dirname(__file__)}
+ ds = packager.datasources.CMakerDataSource('/', data)
+ components = ds.getComponents()
+ assert len(components) == 1
+ assert len(components[0].getTargetFiles()) == 2
+ print components[0].getTargetFiles()
+ assert 'CreateImage.cmd' in components[0].getTargetFiles()
+ assert 'epoc32/tools/rom/image.txt' in components[0].getTargetFiles()
+
+ os.remove(filename)
+
+
+ @skip(skipTest)
+ def test_getHelp(self):
+ """ Check that help is defined for CMakerDataSource. """
+ ds = packager.datasources.CMakerDataSource('/', {})
+ self.assertNotEqual(None, ds.getHelp())
+ self.assertEqual(ds.help, ds.getHelp())
+
+
+class SBSDataSourceTest(unittest.TestCase):
+ """ Unit test case for SBSDataSource """
+ @skip(skipTest)
+ def test_getHelp(self):
+ """ Check that help is defined for SBSDataSource. """
+ ds = packager.datasources.SBSDataSource('/', {})
+ self.assertNotEqual(None, ds.getHelp())
+ self.assertEqual(ds.help, ds.getHelp())
+
+
+class SysdefComponentListTest(unittest.TestCase):
+ """ Unit test case for packager.datasources.sbs.SysdefComponentList """
+ sysdef = None
+
+ def setUp(self):
+ self.sysdef = StringIO("""<?xml version=\"1.0\" encoding=\"UTF-8\"?>
+<SystemDefinition name="main" schema="1.4.0">
+ <systemModel>
+ <layer name="layer1">
+ <module name="module1">
+ <component name="cmp1">
+ <unit unitID="unit1" name="unit1.name" mrp="" filter="" bldFile="path/to/component1"/>
+ </component>
+ </module>
+ </layer>
+ <layer name="layer2">
+ <module name="module2">
+ <component name="cmp2">
+ <unit unitID="unit2" name="unit2.name" mrp="" filter="" bldFile="path\\to\\Component2"/>
+ </component>
+ </module>
+ </layer>
+ </systemModel>
+</SystemDefinition>
+""")
+
+ @skip(skipTest)
+ def test_unit_parsing(self):
+ """ SysdefComponentList extract correctly the units... """
+ cl = packager.datasources.sbs.SysdefComponentList('/')
+ p = xml.sax.make_parser()
+ p.setContentHandler(cl)
+ p.parse(self.sysdef)
+ assert len(cl) == 2
+ assert cl['unit1_name']['path'] == os.path.normpath('/path/to/component1')
+ assert cl['unit2_name']['path'] == os.path.normpath('/path/to/Component2')
+ assert cl['unit2_name']['name'] == 'unit2_name'
+
+ @skip(skipTest)
+ def test_get_component_name_by_path(self):
+ """ Check if get_component_name_by_path is case unsensitive. """
+ cl = packager.datasources.sbs.SysdefComponentList('/')
+ p = xml.sax.make_parser()
+ p.setContentHandler(cl)
+ p.parse(self.sysdef)
+
+ # reading path should be case independent.
+ assert cl.get_component_name_by_path(os.path.normpath('/path/to/Component2')) == 'unit2_name'
+ assert cl.get_component_name_by_path(os.path.normpath('/path/to/component2')) == 'unit2_name'
+
+ @skip(skipTest)
+ def test_get_component_name_by_path_invalid(self):
+ """ Check that get_component_name_by_path is raising an exception if """
+ cl = packager.datasources.sbs.SysdefComponentList('/')
+ p = xml.sax.make_parser()
+ p.setContentHandler(cl)
+ p.parse(self.sysdef)
+
+ # reading path should be case independent.
+ try:
+ cl.get_component_name_by_path(os.path.normpath('/path/to/invalid'))
+ except packager.datasources.sbs.ComponentNotFound:
+ pass
+ else:
+ self.fail("Expected get_component_name_by_path to raise an exception in case of non-existing component definition.")
+
+
+class SysdefComponentListSysdef3ParsingTest(unittest.TestCase):
+ """ Unit test case for packager.datasources.sbs.SysdefComponentList """
+ sysdef = None
+
+ def setUp(self):
+ self.sysdef = StringIO("""<?xml version="1.0" encoding="UTF-8"?>
+<SystemDefinition schema="3.0.0" id-namespace="http://www.symbian.org/system-definition">
+<systemModel name="sf_">
+<layer id="app" name="app">
+<package id="helloworldcons" name="helloworldcons" levels="demo">
+<collection id="helloworldcons_apps" name="helloworldcons_apps" level="demo">
+<component id="helloworldcons_app" name="helloworldcons app" purpose="development">
+<unit bldFile="/sf/app/helloworldcons/group" mrp="/sf/app/helloworldcons/"/>
+</component>
+</collection>
+</package>
+</layer>
+<layer id="mw" name="mw">
+<package id="helloworldapi" name="helloworldapi" levels="demo">
+<collection id="helloworld_apis" name="helloworlds APIs" level="demo">
+<component id="helloworld_api" name="Hello World API" purpose="development">
+<unit bldFile="/sf/mw/helloworldapi/group" mrp="/sf/mw/helloworldapi/"/>
+</component>
+</collection>
+</package>
+</layer>
+</systemModel>
+</SystemDefinition>
+""")
+
+ @skip(skipTest)
+ def test_unit_parsing(self):
+ """ SysdefComponentList extract correctly the units... """
+ cl = packager.datasources.sbs.SysdefComponentList('/')
+ p = xml.sax.make_parser()
+ p.setContentHandler(cl)
+ p.parse(self.sysdef)
+ assert len(cl) == 2
+ print cl
+ assert cl['helloworldcons_app_sf_app_helloworldcons_group']['path'] == os.path.normpath('/sf/app/helloworldcons/group')
+ assert cl['helloworld_api_sf_mw_helloworldapi_group']['path'] == os.path.normpath('/sf/mw/helloworldapi/group')
+ assert cl['helloworld_api_sf_mw_helloworldapi_group']['name'] == 'helloworld_api'
+
+ @skip(skipTest)
+ def test_get_component_name_by_path(self):
+ """ Check if get_component_name_by_path is case unsensitive. """
+ cl = packager.datasources.sbs.SysdefComponentList('/')
+ p = xml.sax.make_parser()
+ p.setContentHandler(cl)
+ p.parse(self.sysdef)
+
+ # reading path should be case independent.
+ assert cl.get_component_name_by_path(os.path.normpath('/sf/app/helloworldcons/group')) == 'helloworldcons_app_sf_app_helloworldcons_group'
+ assert cl.get_component_name_by_path(os.path.normpath('/sf/mw/helloworldapi/group')) == 'helloworld_api_sf_mw_helloworldapi_group'
+
+ @skip(skipTest)
+ def test_get_component_name_by_path_invalid(self):
+ """ Check that get_component_name_by_path is raising an exception if """
+ cl = packager.datasources.sbs.SysdefComponentList('/')
+ p = xml.sax.make_parser()
+ p.setContentHandler(cl)
+ p.parse(self.sysdef)
+
+ # reading path should be case independent.
+ try:
+ cl.get_component_name_by_path(os.path.normpath('/path/to/invalid'))
+ except packager.datasources.sbs.ComponentNotFound:
+ pass
+ else:
+ self.fail("Expected get_component_name_by_path to raise an exception in case of non-existing component definition.")
+
+
+class ObyParserTest(unittest.TestCase):
+ """ Unit test case for packager.datasources.imaker.ObyParser """
+ oby = None
+
+ def setUp(self):
+ (hld, filename) = tempfile.mkstemp(".oby", "datasource_test")
+ os.write(hld, """
+rofssize=0x10000000
+# file=\\epoc32\\release\\ARMV5\\urel\\COMMENT.DLL "Sys\\Bin\\EDISP.DLL"
+file=\\epoc32\\release\\ARMV5\\urel\\edisp.dll "Sys\\Bin\\EDISP.DLL"
+data=\\epoc32\\data\\Z\\Private\\10202BE9\\20000585.txt "Private\\10202BE9\\20000585.txt"
+extension[0x09080004]=\\epoc32\\release\ARMV5\urel\power_resources.dll "Sys\\Bin\\power_resources.dll"
+variant[0x09080004]=\\epoc32\\release\\ARMV5\\urel\\ecust.b23b7726cf4b5801b0dc14102b245fb8.dll "Sys\\Bin\\ecust.dll"
+# file="\\epoc32\\release\\ARMV5\\urel\\edisp.dll" "Sys\\Bin\\EDISP.DLL"
+data="/output/release_flash_images/langpack_01/rofs2/variant/private/10202be9/10281872.txt" "private\10202be9\10281872.txt"
+""")
+ os.close(hld)
+ self.oby = filename
+
+ def tearDown(self):
+ os.remove(self.oby)
+
+ @skip(skipTest)
+ def test_oby(self):
+ """ Testing the extraction of source files from an processed Oby file. """
+ print self.oby
+ p = packager.datasources.imaker.ObyParser('/', self.oby)
+ files = p.getSourceFiles()
+ print files
+ assert len(files) == 5
+ assert os.path.normpath(r'\epoc32\release\ARMV5\urel\edisp.dll'.replace('\\', os.sep).replace('/', os.sep)) in files
+ assert os.path.normpath(r'\epoc32\data\Z\Private\10202BE9\20000585.txt'.replace('\\', os.sep).replace('/', os.sep)) in files
+ assert os.path.normpath(r'\epoc32\release\ARMV5\urel\power_resources.dll'.replace('\\', os.sep).replace('/', os.sep)) in files
+ assert os.path.normpath(r'\epoc32\release\ARMV5\urel\ecust.b23b7726cf4b5801b0dc14102b245fb8.dll'.replace('\\', os.sep).replace('/', os.sep)) in files
+ assert os.path.normpath(r'/output/release_flash_images/langpack_01/rofs2/variant/private/10202be9/10281872.txt'.replace('\\', os.sep).replace('/', os.sep)) in files
+
+
+class ConEDataSourceTest(unittest.TestCase):
+ """ ConfToolDataSource unittest. """
+
+ @skip(skipTest)
+ def test_cone_input(self):
+ """ Testing ConE output log parsing. """
+ log = """ Generating file '\\epoc32\\release\\winscw\\urel\\z\\private\\10202BE9\\10208dd7.txt'...
+DEBUG : cone.crml(assets/symbianos/implml/usbmanager_10285c46.crml)
+ Generating file '\\epoc32\\release\\winscw\\urel\\z\\private\\10202BE9\\10285c46.txt'...
+DEBUG : cone.crml(assets/symbianos/implml/usbmanager_10286a43.crml)
+ Generating file '\\epoc32\\release\\winscw\\urel\\z\\private\\10202BE9\\10286a43.txt'...
+INFO : cone
+ Adding impl CrmlImpl(ref='assets/symbianos/implml/apputils_100048aa.crml', type='crml', index=0)
+INFO : cone
+"""
+ (handle, filename) = tempfile.mkstemp()
+ os.write(handle, log)
+ os.close(handle)
+ data = {'filename': filename, 'name': 'cone', 'version': '1.0'}
+ ds = packager.datasources.ConEDataSource('/', data)
+ components = ds.getComponents()
+ assert len(components) == 1
+ print components[0].getTargetFiles()
+ assert len(components[0].getTargetFiles()) == 3
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/blockspackagertests/test_packager_io.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,113 @@
+#============================================================================
+#Name : test_packager_io.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+# pylint: disable=E0602
+import unittest
+import logging
+from unittestadditions import skip
+skipTest = False
+try:
+ import packager.io
+ from Blocks.Packaging.BuildData import *
+except ImportError:
+ skipTest = True
+
+#logging.basicConfig(level=logging.DEBUG)
+logger = logging.getLogger('nokiatest.datasources')
+
+class BuildDataSerializerTest(unittest.TestCase):
+ """ Check the de/serialisation of PlainBuildData objects. """
+
+ @skip(skipTest)
+ def test_serialization_deserialization(self):
+ """ Check if a serialized PlainBuildData can be deserialized correctly. """
+ bd = PlainBuildData()
+ bd.setComponentName("foobar")
+ bd.setComponentVersion("99")
+ bd.setSourceRoot('/src')
+ bd.setTargetRoot('/epoc32')
+ bd.addSourceFiles(['src.txt', 'cmp/src.txt'])
+ bd.addTargetFiles(['release/armv5/urel/target.dll', 'release/armv5/lib/target.lib'])
+ data_xml = packager.io.BuildDataSerializer(bd).toXml()
+ bdx = packager.io.BuildDataSerializer().fromXml(data_xml)
+ self.assertEquals(bd.getComponentName(), bdx.getComponentName())
+ self.assertEquals(bd.getComponentVersion(), bdx.getComponentVersion())
+ self.assertEquals(bd.getSourceRoot(), bdx.getSourceRoot())
+ self.assertEquals(bd.getTargetRoot(), bdx.getTargetRoot())
+ self.assertEquals(bd.getSourceFiles(), bdx.getSourceFiles())
+ self.assertEquals(bd.getTargetFiles(), bdx.getTargetFiles())
+ self.assertEquals(len(bdx.getSourceFiles()), 2)
+ self.assertEquals(len(bdx.getTargetFiles()), 2)
+ assert 'release/armv5/urel/target.dll' in bdx.getTargetFiles()
+ assert 'release/armv5/lib/target.lib' in bdx.getTargetFiles()
+ assert 'src.txt' in bdx.getSourceFiles()
+ assert 'cmp/src.txt' in bdx.getSourceFiles()
+
+class BdFileSerializerTest(unittest.TestCase):
+ """ Verifying the datasource interface. """
+
+ @skip(skipTest)
+ def test_serialization_deserialization(self):
+ """ Check if a serialized BdFile can be deserialized correctly. """
+ bd = BdFile("epoc32/release/armv5/urel/target.dll")
+ bd.getVariantPlatform()
+ bd.addSourceDependency("/src/src.txt")
+ bd.addOwnerDependency("/epoc32/release/armv5/urel/target.dll")
+ data_xml = packager.io.BdFileSerializer(bd).toXml()
+ bdx = packager.io.BdFileSerializer().fromXml(data_xml)
+ self.assertEquals(bd.getPath(), bdx.getPath())
+ self.assertEquals(bd.getVariantPlatform(), bdx.getVariantPlatform())
+ self.assertEquals(bd.getVariantType(), bdx.getVariantType())
+ self.assertEquals(bd.getSourceDependencies(), bdx.getSourceDependencies())
+ self.assertEquals(bd.getOwnerDependencies(), bdx.getOwnerDependencies())
+
+ assert len(bd.getSourceDependencies()) == 1
+ assert len(bd.getOwnerDependencies()) == 1
+
+ assert "/src/src.txt" in bd.getSourceDependencies()
+ assert '/epoc32/release/armv5/urel/target.dll' in bd.getOwnerDependencies()
+
+
+class BuildDataMergerTest(unittest.TestCase):
+ """ Unit test case for packager.io.BuildDataMerger """
+ @skip(skipTest)
+ def test_merge(self):
+ """ Testing a simple merge. """
+ bd = PlainBuildData()
+ bd.setComponentName("foobar")
+ bd.setComponentVersion("99")
+ bd.setSourceRoot('/src')
+ bd.setTargetRoot('/epoc32')
+ bd.addSourceFiles(['src.txt', 'cmp/src.txt'])
+ bd.addTargetFiles(['release/armv5/urel/target.dll', 'release/armv5/lib/target.lib'])
+
+ bd2 = PlainBuildData()
+ bd2.setComponentName("foobar")
+ bd2.setComponentVersion("99")
+ bd2.setSourceRoot('/src')
+ bd2.setTargetRoot('/epoc32')
+ bd2.addSourceFiles(['src.txt', 'cmp/src.txt', 'cmp2/src.txt'])
+ bd2.addTargetFiles(['release/armv5/urel/target2.dll'])
+
+ m = packager.io.BuildDataMerger(bd)
+ m.merge(bd2)
+
+ assert len(bd.getSourceFiles()) == 3
+ assert len(bd.getTargetFiles()) == 3
+
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/packager/__init__.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,18 @@
+#============================================================================
+#Name : __init__.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/packager/cli.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,199 @@
+#============================================================================
+#Name : cli.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+import sys
+import re
+import os
+import xml.dom.minidom
+from optparse import OptionParser
+import Blocks
+from packager.io import BuildDataSerializer, BuildDataMerger
+from Blocks.Packaging.DependencyProcessors.DefaultProcessors import BuildDataDependencyProcessor
+import packager.datasources
+import logging
+logging.basicConfig(level=logging.INFO)
+
+
+
+
+class PackagerApp:
+ """ The packager CLI implementation. """
+ def __init__(self):
+ self.logger = logging.getLogger("packager")
+ self.cli = OptionParser(usage="%prog [options]")
+ self.cli.add_option("--epocroot", metavar="DIR", help="Epocroot location (must be an absolute path)")
+ self.cli.add_option("--config", metavar="DIR")
+ self.cli.add_option("--outputdir", metavar="DIR")
+ self.cli.add_option("--datasource", metavar="NAME")
+ self.cli.add_option("--metadatadir", metavar="DIR")
+ self.cli.add_option("--updateData", action="store_true", dest="action_update", default=False)
+ self.cli.add_option("--createBundles", action="store_true", dest="action_bundle", default=False)
+ self.cli.add_option("--help-datasource", action="store_true", dest="action_help_datasource", default=False)
+ self.cli.add_option("--workers", type="int", dest="workers", default=4)
+ self.cli.add_option("--writer", dest="writer", default='deb')
+ self.cli.add_option("--sourceRules", dest="sourceRules")
+ self.cli.add_option("--targetRules", dest="targetRules")
+ self.cli.add_option("--pkgDirectives", dest="pkgDirectives")
+ self.cli.add_option("--debug", action="store_true", default=False)
+ self.cli.add_option("--interdeps", choices=['true', 'false'], dest="interdeps", default='false')
+ self.__workers = 4
+ self.__writer = "deb"
+ self.__config = None
+ self.__epocroot = None
+ self.__datasource = None
+ self.__update = False
+ self.__bundle = False
+ self.__help_datasource = False
+ self.__outputdir = None
+ self.__source_rules = None
+ self.__target_rules = None
+ self.__directives = None
+ self.__metadatadir = None
+ self.__interdeps = None
+ self.__writerOptions = None
+ self.__data = {}
+
+ def __readoptions(self, argv=sys.argv):
+ # removing -Dxxx=xxx
+ args = []
+ for arg in argv:
+ res = re.match("-D(.+)=(.*)", arg)
+ if res is not None:
+ self.logger.debug("property: %s=%s" % (res.group(1), res.group(2)))
+ self.__data[res.group(1)] = res.group(2)
+ else:
+ args.append(arg)
+
+ opts, dummy_args = self.cli.parse_args(args)
+ self.__config = opts.config
+ self.__epocroot = opts.epocroot
+ self.__outputdir = opts.outputdir
+ self.__update = opts.action_update
+ self.__bundle = opts.action_bundle
+ self.__help_datasource = opts.action_help_datasource
+ self.__datasource = opts.datasource
+ self.__workers = opts.workers
+ self.__writer = opts.writer
+ self.__source_rules = opts.sourceRules
+ self.__target_rules = opts.targetRules
+ self.__directives = opts.pkgDirectives
+ self.__metadatadir = opts.metadatadir
+ self.__interdeps = opts.interdeps
+ if opts.debug:
+ logging.getLogger().setLevel(logging.DEBUG)
+
+ def __update_data(self):
+ if self.__config is None:
+ raise Exception("--config argument is missing.")
+ if self.__epocroot is None:
+ raise Exception("--epocroot argument is missing.")
+ if not os.path.exists(self.__config) or not os.path.isdir(self.__config):
+ raise Exception("Could not find directory: %s." % self.__config)
+ if not os.path.exists(self.__epocroot) or not os.path.isdir(self.__epocroot) or not os.path.isabs(self.__epocroot):
+ raise Exception("Could not find directory: %s." % self.__epocroot)
+ if self.__datasource is None:
+ raise Exception("--datasource argument is missing.")
+
+ self.logger.info("Retrieving components information...")
+ datasource = packager.datasources.getDataSource(self.__datasource, self.__epocroot, self.__data)
+ for component in datasource.getComponents():
+ outfilename = os.path.join(self.__config, component.getComponentName() + ".blocks_component.xml")
+ if os.path.exists(outfilename):
+ bd = BuildDataSerializer().fromXml(open(outfilename).read())
+ self.logger.info("Merging with previous data...")
+ component = BuildDataMerger(bd).merge(component)
+ serializer = BuildDataSerializer(component)
+ self.logger.info("Writing %s" % outfilename)
+ output = open(outfilename , 'wb')
+ output.write(xml.dom.minidom.parseString(serializer.toXml()).toprettyxml())
+ output.close()
+
+ def __create_bundles(self):
+ if self.__config is None:
+ raise Exception("--config argument is missing.")
+ if self.__epocroot is None:
+ raise Exception("--epocroot argument is missing.")
+ if self.__metadatadir is None:
+ raise Exception("--metadatadir argument is missing.")
+ if not os.path.exists(self.__config) or not os.path.isdir(self.__config):
+ raise Exception("Could not find directory: %s." % self.__config)
+ if not os.path.exists(self.__epocroot) or not os.path.isdir(self.__epocroot) or not os.path.isabs(self.__epocroot):
+ raise Exception("Could not find directory: %s." % self.__epocroot)
+ if self.__outputdir is None:
+ raise Exception("--outputdir argument is missing.")
+ if not os.path.exists(self.__outputdir) or not os.path.isdir(self.__outputdir):
+ raise Exception("Could not find directory: %s." % self.__epocroot)
+ if not os.path.exists(self.__metadatadir) or not os.path.isdir(self.__metadatadir):
+ raise Exception("Could not find directory: %s." % self.__metadatadir)
+
+ if self.__interdeps == 'false':
+ self.__writerOptions = {'STRONG_DEP_MAPPING': None}
+
+ # Creating the packager.
+ storage = Blocks.Packaging.OneoffStorage(self.__metadatadir)
+ packager_obj = Blocks.Packaging.Packager(storage,
+ self.__outputdir,
+ maxWorkers = self.__workers,
+ writer = self.__writer,
+ targetRules = self.__target_rules,
+ sourceRules = self.__source_rules,
+ directives = self.__directives,
+ writerOptions = self.__writerOptions
+ #startNow=False
+ )
+ # Adding processors
+ packager_obj.addProcessor(BuildDataDependencyProcessor)
+ try:
+ from Blocks.Packaging.DependencyProcessors.RaptorDependencyProcessor import DotDeeDependencyProcessor
+ packager_obj.addProcessor(DotDeeDependencyProcessor)
+ except ImportError:
+ logging.warning("Could not load DotDeeDependencyProcessor.")
+
+ for filename in os.listdir(self.__config):
+ filename = os.path.normpath(os.path.join(self.__config, filename))
+ if not filename.endswith('.blocks_component.xml'):
+ continue
+ self.logger.info("Loading %s" % filename)
+ packager_obj.addComponent(BuildDataSerializer().fromXml(open(filename, 'r').read()))
+
+ packager_obj.wait()
+
+ def execute(self, argv=sys.argv):
+ """ Run the CLI. """
+ try:
+ self.__readoptions(argv)
+ if self.__help_datasource:
+ print packager.datasources.getDataSourceHelp()
+ elif self.__update:
+ self.__update_data()
+ elif self.__bundle:
+ self.__create_bundles()
+ else:
+ self.cli.print_help()
+ except IOError, exc:
+ if self.logger.getEffectiveLevel() == logging.DEBUG:
+ self.logger.exception(exc)
+ self.logger.error(str(exc))
+ return -1
+ return 0
+
+
+if __name__ == "__main__":
+ app = PackagerApp()
+ sys.exit(app.execute())
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/packager/datasources/__init__.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+#============================================================================
+#Name : __init__.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+"""
+Definitions of the datasource.
+"""
+from packager.datasources.api import *
+from packager.datasources.cmaker import CMakerDataSource
+from packager.datasources.imaker import IMakerDataSource
+from packager.datasources.sbs import SBSDataSource
+from packager.datasources.cone import ConEDataSource
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/packager/datasources/api.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,73 @@
+#============================================================================
+#Name : api.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import logging
+logger = logging.getLogger("datasources.api")
+
+class MissingProperty(Exception):
+ """ An exception to indicate about a missing property """
+ pass
+
+class DataSource(object):
+ """ This abstract class defines a DataSource for the packager application. """
+ def __init__(self, epocroot, data=None):
+ self.epocroot = epocroot
+ self._data = data
+ if data is None:
+ self._data = {}
+
+ def getComponents(self):
+ """ The getComponents method must return a list of BuildData object (one per component).
+ In case of error (e.g incomplete configuration) the method will raise an Exception.
+ """
+ raise NotImplementedError
+
+ def getHelp(self):
+ return None
+
+ help = property(lambda self: self.getHelp())
+
+
+DATASOURCES = {}
+
+def getDataSource(name, epocroot, data):
+ if name in DATASOURCES:
+ logger.debug("Creating datasource for %s." % name)
+ return DATASOURCES[name](epocroot, data)
+ else:
+ logger.info("Loading %s." % name)
+ def class_import(name):
+ try:
+ components = name.split('.')
+ klassname = components.pop()
+ mod = __import__('.'.join(components), globals(), locals(), [klassname])
+ return getattr(mod, klassname)
+ except:
+ raise Exception("Could not load %s" % name)
+ return class_import(name)(epocroot, data)
+
+
+def getDataSourceHelp():
+ doc = ""
+ for name in DATASOURCES:
+ dshelp = DATASOURCES[name](None, None).help
+ if dshelp is not None:
+ doc = doc + "--- %s -----------------------------------\n" % name + dshelp +\
+ "\n------------------------------------------\n"
+ return doc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/packager/datasources/cmaker.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,106 @@
+#============================================================================
+#Name : cmaker.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import os
+import re
+from packager.datasources.api import DataSource, MissingProperty, DATASOURCES
+from Blocks.Packaging.BuildData import PlainBuildData
+import logging
+
+logger = logging.getLogger('packager.datasources.cmaker')
+
+class CMakerDataSource(DataSource):
+ """ Extract information from cMaker logs """
+ def __init__(self, epocroot, data):
+ DataSource.__init__(self, epocroot, data)
+
+ def getComponents(self):
+ if 'whatlog' not in self._data:
+ raise MissingProperty("The whatlog property has not be defined.")
+ if 'configdir' not in self._data:
+ raise MissingProperty("The configdir property has not be defined.")
+ component_name = "cmaker"
+ if 'name' in self._data:
+ component_name = self._data['name']
+ version = "1"
+ if 'version' in self._data:
+ version = self._data['version']
+
+ # validating the inputs
+ if not os.path.exists(self._data['whatlog']) or not os.path.isfile(self._data['whatlog']):
+ raise Exception("Could not find %s file." % self._data['whatlog'])
+ cdir = os.path.abspath(self._data['configdir'])
+ if not os.path.exists(cdir) or not os.path.isdir(cdir):
+ raise Exception("Could not find %s directory." % cdir)
+
+
+ build_data = PlainBuildData()
+ build_data.setComponentName(component_name)
+ build_data.setComponentVersion(version) # need to get it from a the sysdef file
+ build_data.setSourceRoot(self.epocroot)
+ build_data.setTargetRoot(self.epocroot)
+
+ targets = [path[len(self.epocroot):].lstrip(os.sep) for path in self.getExportedFiles()]
+ build_data.addTargetFiles(targets)
+ sources = [path[len(self.epocroot):].lstrip(os.sep) for path in self.getSourceFiles()]
+ build_data.addSourceFiles(sources)
+ return [build_data]
+
+
+ def getExportedFiles(self):
+ """ Get the list of exported file from the log. The parser will recognize cMaker what output and
+ cMaker install log. The usage of xcopy will get warn to the user as its output will not be consider
+ and the target file will get dismissed. """
+ log = open(self._data['whatlog'], 'r')
+ for line in log:
+ line = line.rstrip()
+ rcopy = re.match(r'^.*\s+copy\(q\((.+)\),q\((.*)\)\)\'', line)
+ rxcopy = re.match(r'^(.*)\s+\-\>\s+(.+)$', line)
+ if ':' not in line and line.startswith(os.sep):
+ yield os.path.normpath(os.path.join(self.epocroot, line))
+ elif rcopy is not None:
+ yield os.path.normpath(os.path.join(self.epocroot, rcopy.group(2)))
+ elif rxcopy is not None:
+ logger.warning('This looks like an xcopy output! Make sure you use cmaker correctly: %s' % line)
+
+
+ def getSourceFiles(self):
+ """ Get the list of source file using the call dir and the whatdeps log if available. """
+ cdir = os.path.abspath(self._data['configdir'])
+ for (path, dirpath, namelist) in os.walk(cdir):
+ for name in namelist:
+ yield os.path.join(path, name)
+ if 'whatdepslog' in self._data:
+ log = open(self._data['whatdepslog'], 'r')
+ for line in log:
+ line = line.rstrip()
+ if ':' not in line and line.startswith(os.sep):
+ yield os.path.normpath(os.path.join(self.epocroot, line))
+
+ def getHelp(self):
+ help_ = """This datasource will gather information from the cMaker output logs.
+Plugin property configuration:
+whatlog Defines the location of the whatlog.
+configdir Defines cMaker calling location.
+whatdepslog Defines the location of the cMaker whatdeps log (optional).
+ """
+ return help_
+
+
+DATASOURCES['cmaker'] = CMakerDataSource
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/packager/datasources/cone.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,74 @@
+#============================================================================
+#Name : conftool.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+from packager.datasources.api import DataSource, DATASOURCES
+from Blocks.Packaging.BuildData import PlainBuildData
+import logging
+import re
+import os
+
+logger = logging.getLogger('packager.datasources.conftool')
+
+class ConEDataSource(DataSource):
+ """ Extract information from ConE logs """
+ def __init__(self, epocroot, data=None):
+ DataSource.__init__(self, epocroot, data)
+
+ def getTargetFiles(self):
+ """ Get the generated files from the log output. """
+ result = []
+ txtFile = open(self._data['filename'], 'r')
+ matcher = re.compile(r"^\s*Generating file '(.+)'\.\.\.\s*$")
+ for line in txtFile:
+ res = matcher.match(line)
+ if res:
+ result.append(os.path.normpath(os.path.join(self.epocroot,
+ res.group(1))))
+ txtFile.close()
+ return result
+
+ def getComponents(self):
+ """ Get the components list from the cli input. """
+ if 'name' not in self._data:
+ raise Exception("The name property has not be defined.")
+ if 'version' not in self._data:
+ raise Exception("The version property has not be defined.")
+
+ if 'filename' not in self._data:
+ raise Exception("The input conftool log file is not defined")
+
+ #todo: add the source iby / path for conftool input
+ build_data = PlainBuildData()
+ build_data.setComponentName(self._data['name'])
+ build_data.setComponentVersion(self._data['version'])
+ build_data.setSourceRoot(self.epocroot)
+ build_data.setTargetRoot(self.epocroot)
+ build_data.addTargetFiles([path[len(self.epocroot):].lstrip(os.sep) for path in self.getTargetFiles()])
+ return [build_data]
+
+ def getHelp(self):
+ """ Returns the help. """
+ return """
+name Defines the name of the component
+version Defines the version of the component
+filename Defines the log file name of ctool
+"""
+
+
+DATASOURCES['cone'] = ConEDataSource
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/packager/datasources/imaker.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,117 @@
+#============================================================================
+#Name : imaker.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+from packager.datasources.api import DataSource, MissingProperty, DATASOURCES
+from Blocks.Packaging.BuildData import PlainBuildData, BdFile
+import logging
+import re
+import os
+
+logger = logging.getLogger('packager.datasources.imaker')
+
+class ObyParser:
+ """ Simplistic Oby file parser. """
+ def __init__(self, epocroot, filename):
+ self.epocroot = epocroot
+ self.filename = filename
+
+ def getSourceFiles(self):
+ """ Return the list of source file needed to create the image. """
+ result = []
+ logger.debug("Analyzing %s" % self.filename)
+ oby = open(self.filename, 'r')
+ for line in oby:
+ res = re.match(r'\s*(file|data|variant.+|bootbinary|primary.+|extension.+)\s*=\s*\"?(.+?)\"?\s+\".+\"', line)
+ if res is not None:
+ result.append(os.path.normpath(os.path.join(self.epocroot, res.group(2).strip().replace('\\', os.sep).replace('/', os.sep))))
+ oby.close()
+ return result
+
+
+class IMakerDataSource(DataSource):
+ """ Extract information from iMaker logs - iMaker integrated version """
+ def __init__(self, epocroot, data=None):
+ DataSource.__init__(self, epocroot, data)
+
+ def getComponents(self):
+ if 'name' not in self._data:
+ raise Exception("The name property has not be defined.")
+ if 'version' not in self._data:
+ raise Exception("The version property has not be defined.")
+ obys = [self._data[key] for key in self._data.keys() if key.startswith('oby')]
+ targets = [os.path.normpath(self._data[key]) for key in self._data.keys() if key.startswith('target')]
+ build_data = PlainBuildData()
+ build_data.setComponentName(self._data['name'])
+ build_data.setComponentVersion(self._data['version'])
+ build_data.setSourceRoot(self.epocroot)
+ build_data.setTargetRoot(self.epocroot)
+
+ build_data.addTargetFiles([path[len(self.epocroot):].lstrip(os.sep) for path in targets])
+
+ deps = []
+ for oby in obys:
+ deps.extend(ObyParser(self.epocroot, oby).getSourceFiles())
+ for target in targets:
+ print target
+ if target.endswith(".fpsx"):
+ target = os.path.normpath(target)
+ bdfile = BdFile(target[len(self.epocroot):].lstrip(os.sep))
+ bdfile.setOwnerDependencies([path[len(self.epocroot):].lstrip(os.sep) for path in deps])
+ build_data.addDeliverable(bdfile)
+ return [build_data]
+
+class IMakerRomDirDataSource(DataSource):
+ """ Extract information from iMaker logs - guess content of the package from the rom output dir. """
+ def __init__(self, epocroot, data=None):
+ DataSource.__init__(self, epocroot, data)
+
+ def getComponents(self):
+ if 'name' not in self._data:
+ raise MissingProperty("The name property has not be defined.")
+ if 'version' not in self._data:
+ raise MissingProperty("The version property has not be defined.")
+ if 'dir' not in self._data:
+ raise MissingProperty("The dir property has not be defined.")
+ cdir = os.path.normpath(self._data['dir'])
+ obys = []
+ targets = []
+ for (path, dirpath, namelist) in os.walk(cdir):
+ for name in namelist:
+ if name.endswith(".oby"):
+ obys.append(os.path.join(path, name)[len(self.epocroot):].lstrip(os.sep))
+ targets.append(os.path.join(path, name)[len(self.epocroot):].lstrip(os.sep))
+ build_data = PlainBuildData()
+ build_data.setComponentName(self._data['name'])
+ build_data.setComponentVersion(self._data['version'])
+ build_data.setSourceRoot(self.epocroot)
+ build_data.setTargetRoot(self.epocroot)
+ build_data.addTargetFiles(targets)
+ return [build_data]
+
+ def getHelp(self):
+ return """
+name Defines the name of the component
+version Defines the version of the component
+dir Defines the root location of ROM images.
+"""
+
+
+DATASOURCES['imaker'] = IMakerDataSource
+DATASOURCES['imaker-romdir'] = IMakerRomDirDataSource
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/packager/datasources/sbs.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,299 @@
+#============================================================================
+#Name : imaker.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+import xml.sax
+import time
+import os
+import re
+import fileutils
+import sys
+from packager.datasources.api import DataSource, MissingProperty, DATASOURCES
+from Blocks.Packaging.DataSources.LinkInfoToBuildData import LinkInfoXmlReader # pylint: disable=F0401
+try:
+ from Blocks.Packaging.DataSources.SbsLinkInfoReader import LinkInfoReader # pylint: disable=E0611
+except ImportError:
+ if os.path.sep == '\\':
+ raptor_cmd = fileutils.which("sbs.bat")
+ else:
+ raptor_cmd = fileutils.which("sbs")
+ sbs_home = os.path.dirname(os.path.dirname(raptor_cmd))
+ os.environ['SBS_HOME'] = sbs_home
+ sys.path.append(os.path.join(sbs_home, 'python'))
+ sys.path.append(os.path.join(sbs_home, 'python', 'plugins'))
+ # loading as raptor plugin - loading also raptor.
+ if os.path.sep == '\\':
+ os.environ['HOSTPLATFORM'] = 'win 32'
+ os.environ['HOSTPLATFORM_DIR'] = 'win32'
+ else:
+ os.environ['HOSTPLATFORM'] = 'linux'
+ os.environ['HOSTPLATFORM_DIR'] = 'linux'
+ from filter_blocks import LinkInfoReader # pylint: disable=F0401
+
+from Blocks.Packaging.BuildData import PlainBuildData
+from Blocks.Packaging.DataSources.WhatLog import WhatLogReader as LogReader
+import logging
+from Queue import Queue
+from threading import Thread
+
+class ComponentNotFound(Exception):
+ """ Error raised in case of not found component. """
+
+ def __init__(self, message):
+ Exception.__init__(self, message)
+
+class SysdefComponentList(xml.sax.ContentHandler):
+ """ Simplistic sysdef data extractor, it will only get data from unit elements."""
+
+ def __init__(self, epocroot, version="1"):
+ xml.sax.ContentHandler.__init__(self)
+ self.__data = {}
+ self.__epocroot = epocroot
+ self.__version = version
+ self.__component = None
+
+ def startElement(self, tag, attributes):
+ if tag == "component" and attributes.get("id"):
+ self.__component = attributes.get("id")
+ elif tag == "unit" and self.__component and not attributes.get("unitID") and not attributes.get("name") and attributes.get("bldFile"):
+ data = {}
+ data['path'] = os.path.normpath(os.path.join(self.__epocroot, attributes.get("bldFile")).replace('\\', os.sep).replace('/', os.sep))
+ if attributes.get("version") is None:
+ data['version'] = self.__version
+ else:
+ data['version'] = attributes.get("version")
+ data['name'] = self.__cleanup_name(self.__component)
+ self.__data[self.__component + attributes.get("bldFile").replace('\\', '_').replace('/', '_')] = data
+ elif tag == "unit" and attributes.get("name") is not None and attributes.get("bldFile") is not None:
+ data = {}
+ data['path'] = os.path.normpath(os.path.join(self.__epocroot, attributes.get("bldFile")).replace('\\', os.sep).replace('/', os.sep))
+ if attributes.get("version") is None:
+ data['version'] = self.__version
+ else:
+ data['version'] = attributes.get("version")
+ data['name'] = self.__cleanup_name(attributes.get("name"))
+ self.__data[self.__cleanup_name(attributes.get("name"))] = data
+
+ def endElement(self, tag):
+ if tag == "component":
+ self.__component = None
+
+ def __cleanup_name(self, name):
+ return re.sub(r'[^a-zA-Z0-9_-]', '', re.sub(r'\.', '_', name))
+
+ def keys(self):
+ return self.__data.keys()
+
+ def __getitem__(self, key):
+ return self.__data[key]
+
+ def __contains__(self, key):
+ for data in self.__data:
+ if key in data['name']:
+ return True
+ return False
+
+ def __len__(self):
+ return self.__data.__len__()
+
+ def get_component_name_by_path(self, dir_):
+ dir_ = os.path.normpath(dir_)
+ for key in self.__data.keys():
+ if dir_.lower() == self.__data[key]['path'].lower():
+ return key
+ raise ComponentNotFound("Could not find component name for dir %s" % dir_)
+
+ def __str__(self):
+ return "<%s: %s>" % (type(self), self.__data)
+
+
+class BldInfWorker(Thread):
+ """ SBS component worker. """
+ def __init__(self, inqueue, outqueue, datasource, whatlog, cl, link_info):
+ Thread.__init__(self)
+ self.logger = logging.getLogger(self.__class__.__name__)
+ self.inqueue = inqueue
+ self.outqueue = outqueue
+ self.whatlog = whatlog
+ self.cl = cl
+ self.link_info = link_info
+ self.datasource = datasource
+
+ def run(self):
+ """ Thread implementation. """
+ while True:
+ tag, bldinf = self.inqueue.get()
+ if tag == 'STOP':
+ self.logger.debug("Builder thread exiting..." )
+ return
+ else:
+ try:
+ tick = time.time()
+ self.outqueue.put(self.datasource.getBuildData(bldinf, self.whatlog, self.cl, self.link_info))
+ tock = time.time()
+ self.logger.info("Analyzed component %s in %s seconds" % (bldinf, tock - tick))
+ except IOError, exc:
+ self.logger.error('Error happened in thread execution %s' % exc)
+ import traceback
+ self.logger.debug(traceback.format_exc())
+
+
+class SBSDataSource(DataSource):
+ """ That class implements the DataSource API"""
+
+ def __init__(self, epocroot, data=None):
+ DataSource.__init__(self, epocroot, data)
+ self.logger = logging.getLogger(self.__class__.__name__)
+
+ def _get_sysdef_info(self):
+ """ Returns a SysdefComponentList containing the result of sysdef parsing. """
+ self.logger.debug("Reading the component information from the sysdef (%s)." % self._data['sysdef'])
+ p = xml.sax.make_parser()
+ cl = SysdefComponentList(self.epocroot)
+ p.setContentHandler(cl)
+ p.parse(open(self._data['sysdef']))
+ return cl
+
+ def _get_whatlog(self):
+ self.logger.debug("Extracting whatlog data (%s)..." % self._data['sbslog'])
+ parser = xml.sax.make_parser()
+ lr = LogReader()
+ parser.setContentHandler(lr)
+ file_ = open(self._data['sbslog'])
+ while True:
+ data = file_.read()
+ if not data:
+ break
+ parser.feed(data)
+ file_.close()
+ parser.close()
+ return lr
+
+ def _generate_link_info(self, output=None):
+ """ Generate the link.info file from the build log. It returns the generated xml filename. """
+ self.logger.info("Generating the link information from the %s log." % self._data['sbslog'])
+ parser = xml.sax.make_parser()
+ reader = LinkInfoReader(self.epocroot)
+ parser.setContentHandler(reader)
+ parser.parse(open(self._data['sbslog'], 'r'))
+ if output is None:
+ output = self._data['sbslog'] + ".link.xml"
+ self.logger.info("Writing %s." % output)
+ out = open(output, 'wb')
+ reader.writeXml(out=out)
+ out.close()
+ return output
+
+ def getComponents(self):
+ if 'sbslog' not in self._data:
+ raise MissingProperty("The sbslog property has not be defined.")
+ if 'sysdef' not in self._data:
+ raise MissingProperty("The sysdef property has not be defined.")
+
+ # generating link info
+ link_info = LinkInfoXmlReader.getBuildData(self._generate_link_info())
+
+ # Read the component list
+ cl = self._get_sysdef_info()
+
+ # Get the whatlog
+ whatlog = self._get_whatlog()
+
+ result = []
+ if 'threads' in self._data and self._data['threads'].isdigit():
+ inqueue = Queue()
+ outqueue = Queue()
+ workers = []
+ # Work to be done
+
+ for bldinf in whatlog.getInfs():
+ inqueue.put(('', bldinf))
+ # Creating the builders
+ for i in range(int(self._data['threads'])):
+ b = BldInfWorker(inqueue, outqueue, self, \
+ whatlog, cl, link_info)
+ workers.append(b)
+ b.start()
+ # Waiting the work to finish.
+ for w in workers:
+ inqueue.put(('STOP', None))
+ for w in workers:
+ w.join()
+ self.logger.info("All done.")
+ while not outqueue.empty():
+ result.append(outqueue.get())
+ else:
+ for bldinf in whatlog.getInfs():
+ result.append(self.getBuildData(bldinf, whatlog, cl, link_info))
+ return result
+
+ def getBuildData(self, bldinf, whatlog, cl, link_info):
+ """ Get the build data from a bldinf name. """
+ tick = time.time()
+ src_walk_path = ""
+ abs_bldinf = os.path.abspath(bldinf)
+ self.logger.debug("component location: %s" % abs_bldinf)
+ component_name = cl.get_component_name_by_path(os.path.normpath(os.path.dirname(abs_bldinf)))
+ build_data = PlainBuildData()
+ self.logger.debug("component name: %s" % cl[component_name]['name'])
+ build_data.setComponentName(cl[component_name]['name'])
+ self.logger.debug("component version: %s" % cl[component_name]['version'])
+ build_data.setComponentVersion(cl[component_name]['version']) # need to get it from a the sysdef file
+ build_data.setSourceRoot(self.epocroot)
+ build_data.setTargetRoot(self.epocroot)
+
+ targets = [path[len(self.epocroot):].lstrip(os.sep) for path in whatlog.getFilePaths(abs_bldinf)]
+ build_data.addTargetFiles(targets)
+
+ # If path contains group folder then parent to parent is required else parent folder is enough
+ if os.path.dirname(abs_bldinf).endswith("group"):
+ src_walk_path = os.path.dirname(os.path.dirname(abs_bldinf))
+ else:
+ src_walk_path = os.path.dirname(abs_bldinf)
+
+ sources = []
+ for (path, dirpath, namelist) in os.walk(src_walk_path):
+ for name in namelist:
+ sources.append(os.path.join(path, name)[len(self.epocroot):].lstrip(os.sep))
+ build_data.addSourceFiles(sources)
+ tock = time.time()
+ self.logger.info(" + Content analysis %s in %s seconds" % (bldinf, tock - tick))
+
+ tick = time.time()
+ key_bldinf = abs_bldinf.replace(os.sep, '/')
+ if link_info.has_key(key_bldinf):
+ self.logger.debug("Found deps for %s" % key_bldinf)
+ for bdfile in link_info[key_bldinf].getDependencies():
+ if bdfile.getPath() in build_data.getTargetFiles():
+ # no dependency data above, only paths - OK to overwrite
+ build_data.addDeliverable(bdfile)
+ else:
+ self.logger.warning("Link data from %s has unlisted target %s" % (abs_bldinf, bdfile.getPath()))
+ tock = time.time()
+ self.logger.info(" + Dependency analysis for %s in %s seconds" % (bldinf, tock - tick))
+ return build_data
+
+ def getHelp(self):
+ help_ = """The sbs datasource will extract component information from the sbs logs. You need a recent version of raptor: e.g 2.8.4.
+Plugin property configuration:
+sbslog Location of the sbs log.
+sysdef Location of the canonical system definition file.
+ """
+ return help_
+
+DATASOURCES['sbs'] = SBSDataSource
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/lib/packager/io.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,143 @@
+#============================================================================
+#Name : io.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+import xml.dom.minidom
+import logging
+from Blocks.Packaging.BuildData import BdFile, PlainBuildData
+logger = logging.getLogger('io')
+
+class BdFileSerializer:
+ """ Class used to serialize or deserialize the DBFile """
+ def __init__(self, bdfile=None):
+ self.bdfile = bdfile
+
+ def toXml(self):
+ logger.debug("Serializing DBFile.")
+ document = xml.dom.minidom.Document()
+ component = document.createElement('bdfile')
+ component.setAttribute('path', self.bdfile.getPath())
+ if self.bdfile.variantType is not None:
+ component.setAttribute('variantType', self.bdfile.variantType)
+ if self.bdfile.variantPlatform is not None:
+ component.setAttribute('variantPlatform', self.bdfile.variantPlatform)
+ # Owner reqs
+ ownerReqs = document.createElement('ownerRequirements')
+ for path in self.bdfile.ownerRequirements:
+ req = document.createElement("ownerRequirement")
+ req.setAttribute('path', path)
+ ownerReqs.appendChild(req)
+ component.appendChild(ownerReqs)
+ # source Requirements
+ srcReqs = document.createElement('sourceRequirements')
+ for path in self.bdfile.sourceRequirements:
+ req = document.createElement("sourceRequirement")
+ req.setAttribute('path', path)
+ srcReqs.appendChild(req)
+ component.appendChild(srcReqs)
+ return component.toxml()
+
+ def fromXml(self, data):
+ logger.debug("Deserializing DBFile.")
+ node = xml.dom.minidom.parseString(data).childNodes[0]
+ if self.bdfile == None:
+ self.bdfile = BdFile(node.getAttribute('path'))
+
+ self.bdfile.path = node.getAttribute('path')
+ self.bdfile.variantPlatform = node.getAttribute('variantPlatform')
+ self.bdfile.variantType = node.getAttribute('variantType')
+ for src in node.getElementsByTagName('ownerRequirements')[0].getElementsByTagName('ownerRequirement'):
+ self.bdfile.ownerRequirements.append(src.getAttribute('path'))
+ for src in node.getElementsByTagName('sourceRequirements')[0].getElementsByTagName('sourceRequirement'):
+ self.bdfile.sourceRequirements.append(src.getAttribute('path'))
+ return self.bdfile
+
+class BuildDataSerializer:
+ """ Class used to serialize or deserialize the plain build data """
+ def __init__(self, builddata=None):
+ self.builddata = builddata
+ if self.builddata is None:
+ self.builddata = PlainBuildData()
+
+ def toXml(self):
+ logger.debug("Serializing PlainBuildData.")
+ document = xml.dom.minidom.Document()
+ component = document.createElement('component')
+ component.setAttribute('name', self.builddata.getComponentName())
+ component.setAttribute('version', self.builddata.getComponentVersion())
+ # sources
+ sources = document.createElement('sources')
+ sources.setAttribute('root', self.builddata.getSourceRoot())
+ for path in self.builddata.getSourceFiles():
+ source = document.createElement("source")
+ source.setAttribute('path', path)
+ sources.appendChild(source)
+ component.appendChild(sources)
+ # targets
+ targets = document.createElement('targets')
+ targets.setAttribute('root', self.builddata.getTargetRoot())
+ for path in self.builddata.targetFiles.keys():
+ target = document.createElement("target")
+ target.setAttribute('path', path)
+ if self.builddata.targetFiles[path] is not None:
+ target.appendChild(document.importNode(xml.dom.minidom.parseString(BdFileSerializer(self.builddata.targetFiles[path]).toXml()).childNodes[0], deep=1))
+ targets.appendChild(target)
+ component.appendChild(targets)
+ return component.toxml()
+
+ def fromXml(self, data):
+ logger.debug("Deserializing PlainBuildData.")
+ node = xml.dom.minidom.parseString(data).childNodes[0]
+ self.builddata.setComponentName(node.getAttribute('name'))
+ self.builddata.setComponentVersion(node.getAttribute('version'))
+ self.builddata.setSourceRoot(node.getElementsByTagName('sources')[0].getAttribute('root'))
+ self.builddata.setTargetRoot(node.getElementsByTagName('targets')[0].getAttribute('root'))
+ files = []
+ for src in node.getElementsByTagName('sources')[0].getElementsByTagName('source'):
+ files.append(src.getAttribute('path'))
+ self.builddata.addSourceFiles(files)
+
+ files = []
+ for target in node.getElementsByTagName('targets')[0].getElementsByTagName('target'):
+ files.append(target.getAttribute('path'))
+ self.builddata.addTargetFiles(files)
+ for target in node.getElementsByTagName('targets')[0].getElementsByTagName('target'):
+ for bdfile in target.getElementsByTagName('bdfile'):
+ self.builddata.addDeliverable(BdFileSerializer().fromXml(bdfile.toxml()))
+ return self.builddata
+
+
+class BuildDataMerger:
+ """ Class used to merge contents of build data """
+ def __init__(self, output):
+ self.output = output
+
+ def merge(self, bd):
+ """ Merge the content of bd into output. """
+ if bd.getComponentName() != self.output.getComponentName():
+ raise Exception("Trying to merger two different components (different name)")
+ if bd.getComponentVersion() != self.output.getComponentVersion():
+ raise Exception("Trying to merger two different components (different version)")
+ if bd.getSourceRoot() != self.output.getSourceRoot():
+ raise Exception("Trying to merger two different components (different source root)")
+ if bd.getTargetRoot() != self.output.getTargetRoot():
+ raise Exception("Trying to merger two different components (different target root)")
+ self.output.addSourceFiles(bd.getSourceFiles())
+ self.output.addTargetFiles(bd.getTargetFiles())
+ for dep in bd.getDependencies():
+ self.output.addDeliverable(dep)
+ return self.output
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/setup.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,37 @@
+#============================================================================
+#Name : .py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+import os
+from setuptools import setup, find_packages
+pyfiles = []
+for x in os.listdir('lib'):
+ if x.endswith('.py'):
+ pyfiles.append(x.replace('.py', ''))
+
+setup(
+ name = 'blockspackager',
+ version = '0.1',
+ description = "blockspackager",
+ license = 'EPL',
+ package_dir = {'': 'lib'},
+ py_modules = pyfiles,
+ packages = find_packages('lib', exclude=["*tests"]),
+ test_suite = 'nose.collector',
+ package_data = {'': ['*.xml', '*.conf', '*.xsd', '*.nsi']},
+ zip_safe = False,
+ )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/blockspackager/tests.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="blockspackager">
+ <description>Helium unittests.</description>
+ <property name="builder.dir" location="../../builder"/>
+ <import file="${builder.dir}/python/test-macros.ant.xml"/>
+
+</project>
--- a/buildframework/helium/sf/python/pythoncore/ivy.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/ivy.xml Mon Oct 18 10:23:52 2010 +0100
@@ -39,5 +39,6 @@
<dependency org="threadpool" name="threadpool" rev="latest.integration" conf="default" />
<dependency org="dom4j" name="dom4j" rev="latest.integration" conf="default" />
<dependency org="setuptools" name="setuptools" rev="0.6+" conf="default" />
+ <dependency org="net.sourceforge.docutils" name="docutils" rev="0.5" conf="default" />
</dependencies>
</ivy-module>
--- a/buildframework/helium/sf/python/pythoncore/lib/amara.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/amara.py Mon Oct 18 10:23:52 2010 +0100
@@ -105,24 +105,26 @@
def __setitem__(self, key, value):
self.xml_set_attribute(key, value)
- def __getattr__(self, attr):
+ def __getattr__(self, attr):
+ if attr == 'xml_child_elements':
+ return self._getxml_child_elements()
if isinstance(attr, basestring):
res = self.dom.getElementsByTagName(attr)
if len(res) == 0:
if hasattr(self.dom, 'documentElement'):
val = self.dom.documentElement.getAttribute(attr)
if not self.dom.documentElement.hasAttribute(attr):
- raise Exception(attr + ' not found')
+ raise AttributeError(attr + ' not found')
else:
val = self.dom.getAttribute(attr)
if not self.dom.hasAttribute(attr):
- raise Exception(attr + ' not found')
+ raise AttributeError(attr + ' not found')
return val
return MinidomAmara(res[0], self.dom)
if self.parent:
return MinidomAmara(self.parent.getElementsByTagName(self.dom.tagName)[attr])
else:
- raise Exception(str(attr) + ' not found')
+ raise AttributeError(str(attr) + ' not found')
def __setattr__(self, name, value):
if isinstance(value, basestring):
@@ -134,13 +136,20 @@
for entry in self.parent.getElementsByTagName(self.dom.tagName):
yield MinidomAmara(entry)
- def __str__(self):
+ def _get_text(self, node):
+ """ Recursive method to collate sub-node strings. """
text = ''
- for t_text in self.dom.childNodes:
- if t_text.nodeType == t_text.TEXT_NODE and t_text.data != None:
- text = text + t_text.data
- return text
+ for child in node.childNodes:
+ if child.nodeType == child.TEXT_NODE and child.data != None:
+ text = text + ' ' + child.data
+ else:
+ text += self._get_text(child)
+ return text.strip()
+ def __str__(self):
+ """ Output a string representing the XML node. """
+ return self._get_text(self.dom)
+
def xml(self, out=None, indent=False, omitXmlDeclaration=False, encoding='utf-8'):
"""xml"""
if omitXmlDeclaration:
@@ -169,6 +178,14 @@
if elem.nodeType == elem.ELEMENT_NODE:
l_attrib.append(MinidomAmara(elem))
return l_attrib
+
+ def _getxml_child_elements(self):
+ """get xml children"""
+ l_attrib = {}
+ for elem in self.dom.childNodes:
+ if elem.nodeType == elem.ELEMENT_NODE:
+ l_attrib[elem.tagName] = MinidomAmara(elem)
+ return l_attrib
def _getxml_attributes(self):
"""get aml attributes"""
@@ -209,6 +226,7 @@
childNodes = property(_getxml_children)
xml_children = property(_getxml_children)
xml_attributes = property(_getxml_attributes)
+ xml_child_elements = property(_getxml_child_elements)
def __eq__(self, obj):
return str(self) == obj
--- a/buildframework/helium/sf/python/pythoncore/lib/archive/mappers.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/archive/mappers.py Mon Oct 18 10:23:52 2010 +0100
@@ -51,21 +51,25 @@
self._metadata = None
if not os.path.exists(self._config['archives.dir']):
os.makedirs(self._config['archives.dir'])
- if self._config.has_key("grace.metadata") and self._config.get_boolean("grace.metadata", False):
- if self._config.has_key("grace.template") and os.path.exists(self._config["grace.template"]) and \
+
+ if self._config.has_key("grace.metadata"):
+ raise Exception('grace.metadata not supported, see documentation for correct configuration')
+
+ if self._config.has_key("release.metadata") and self._config.get_boolean("release.metadata", False):
+ if self._config.has_key("release.template") and os.path.exists(self._config["release.template"]) and \
not os.path.exists(os.path.join(self._config['archives.dir'], self._config['name'] + ".metadata.xml")):
- shutil.copy(config["grace.template"], os.path.join(self._config['archives.dir'], self._config['name'] + ".metadata.xml"))
+ shutil.copy(config["release.template"], os.path.join(self._config['archives.dir'], self._config['name'] + ".metadata.xml"))
self._metadata = symrec.ReleaseMetadata(os.path.join(self._config['archives.dir'], self._config['name']+ ".metadata.xml"),
- service=self._config['grace.service'],
- product=self._config['grace.product'],
- release=self._config['grace.release'])
+ service=self._config['release.service'],
+ product=self._config['release.product'],
+ release=self._config['release.name'])
self._metadata.save()
def declare_package(self, filename, extract="single"):
""" Add a package to the metadata file. """
if self._metadata is None:
return
- self._metadata.add_package(os.path.basename(filename), extract=extract, filters=self._config.get_list('grace.filters', None), default=self._config.get_boolean('grace.default', True))
+ self._metadata.add_package(os.path.basename(filename), extract=extract, filters=self._config.get_list('release.filters', None), default=self._config.get_boolean('release.default', True))
self._metadata.save()
def create_commands(self, manifest):
@@ -99,12 +103,12 @@
if len(manifests) == 1:
filename = os.path.join(self._config['archives.dir'], self._config['name'])
_logger.info(" * " + filename + self._tool.extension())
- self.declare_package(filename + self._tool.extension(), self._config.get('grace.extract', 'single'))
+ self.declare_package(filename + self._tool.extension(), self._config.get('release.extract', 'single'))
result.extend(self._tool.create_command(self._config.get('zip.root.dir', self._config['root.dir']), filename, manifests=[manifest]))
return [result]
- def _split_manifest_file(self, name, manifest_file_path):
+ def _split_manifest_file(self, name, manifest_file_path, key=None):
""" This method return a list of files that contain the content of the zip parts to create. """
filenames = []
@@ -137,7 +141,10 @@
files = 0
part += 1
- filename = "%s_part%02d" % (name, part)
+ if key is not None:
+ filename = "%s_part%02d_%s" % (name, part, key)
+ else:
+ filename = "%s_part%02d" % (name, part)
filenames.append(os.path.join(self._config['temp.build.dir'], filename + ".txt"))
output = codecs.open(os.path.join(self._config['temp.build.dir'], filename + ".txt"), 'w', "utf-8" )
@@ -156,7 +163,10 @@
files = 0
part += 1
- filename = "%s_part%02d" % (name, part)
+ if key is not None:
+ filename = "%s_part%02d_%s" % (name, part, key)
+ else:
+ filename = "%s_part%02d" % (name, part)
filenames.append(os.path.join(self._config['temp.build.dir'], filename + ".txt"))
output = open(os.path.abspath(os.path.join(self._config['temp.build.dir'], filename + ".txt")), 'w')
@@ -178,7 +188,7 @@
return filenames
-class PolicyMapper(Mapper):
+class PolicyMapper(DefaultMapper):
""" Implements a policy content mapper.
It transforms a list of files into a list of commands with their inputs.
@@ -188,7 +198,7 @@
def __init__(self, config, archiver):
""" Initialization. """
- Mapper.__init__(self, config, archiver)
+ DefaultMapper.__init__(self, config, archiver)
self._policies = {}
self._policy_cache = {}
self._binary = {}
@@ -233,11 +243,22 @@
# Generating sublists.
for key in self._policies.keys():
+ manifests = []
self._policies[key].close()
manifest = os.path.join(self._config['temp.build.dir'], self._config['name'] + "_%s" % key + ".txt")
- filename = os.path.join(self._config['archives.dir'], self._config['name'] + "_%s" % key)
- _logger.info(" * " + filename + self._tool.extension())
- result.extend(self._tool.create_command(self._config.get('zip.root.dir', self._config['root.dir']), filename, manifests=[manifest]))
+ _logger.info(" * Input manifest: " + manifest)
+ if self._config.has_key("split.on.uncompressed.size.enabled") and self._config.get_boolean("split.on.uncompressed.size.enabled", "false"):
+ manifests = self._split_manifest_file(self._config['name'], manifest, key)
+ else:
+ manifests.append(manifest)
+ for manifest in manifests:
+ _logger.info(" * Creating command for manifest: " + manifest)
+ filename = os.path.join(self._config['archives.dir'], os.path.splitext(os.path.basename(manifest))[0])
+ if len(manifests) == 1:
+ filename = os.path.join(self._config['archives.dir'], self._config['name'] + "_%s" % key)
+ _logger.info(" * " + filename + self._tool.extension())
+ self.declare_package(filename + self._tool.extension(), self._config.get('release.extract', 'single'))
+ result.extend(self._tool.create_command(self._config.get('zip.root.dir', self._config['root.dir']), filename, manifests=[manifest]))
stages.append(result)
# See if any internal archives need to be created
--- a/buildframework/helium/sf/python/pythoncore/lib/archive/scanners.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/archive/scanners.py Mon Oct 18 10:23:52 2010 +0100
@@ -48,11 +48,10 @@
[self.add_exclude_lst(filename) for filename in self._config.get_list('exclude.lst', [])]
[self.add_filetype(filetype) for filetype in self._config.get_list('filetype', [])]
[self.add_selector(archive.selectors.get_selector(selector, self._config)) for selector in self._config.get_list('selector', [])]
- # To support old features.
- # TODO: inform customers and remove.
+
if 'distribution.policy.s60' in self._config:
self.add_selector(archive.selectors.get_selector('distribution.policy.s60', self._config))
-
+
def add_exclude_lst(self, filename):
""" Adding excludes from exclude list. """
if not os.path.exists(filename):
@@ -76,7 +75,7 @@
This method need to be overloaded by the specialized class.
return fullpath name
"""
- raise NotImplementedError()
+ raise NotImplementedError()
class AbldWhatScanner(Scanner):
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/__init__.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/__init__.py Mon Oct 18 10:23:52 2010 +0100
@@ -54,7 +54,11 @@
# Customize some attributes from how optparse leaves them.
if hasattr(self._opts, 'build_drive'):
self.build_drive = path(self._opts.build_drive)
- self.file_store = path(self._opts.file_store)
+ if os.path.exists(self._opts.file_store):
+ self.file_store = path(self._opts.file_store)
+ else:
+ self.file_store = ''
+ _logger.info(self._opts.file_store + ' not found')
self.flash_images = split_paths(self._opts.flash_images)
if hasattr(self._opts, 'sis_files'):
self.sis_files = split_paths(self._opts.sis_files)
@@ -62,6 +66,8 @@
self.config_file = self._opts.config
if hasattr(self._opts, 'obey_pkgfiles'):
self.obey_pkgfiles = to_bool(self._opts.obey_pkgfiles)
+ if hasattr(self._opts, 'minimum_execution_blocks'):
+ self.minimum_execution_blocks = (self._opts.minimum_execution_blocks == 'true')
if hasattr(self._opts, 'hti'):
self.hti = to_bool(self._opts.hti)
if hasattr(self._opts, 'test_type'):
@@ -91,7 +97,7 @@
for t_key, t_value in temp_dict.items():
self.tsrc_paths_dict[t_key] = t_value
else:
- _logger.error(tsrc + ' not found')
+ _logger.error(tsrc + ' - test source not found')
#preparing a list of main components
for main_component in self.tsrc_paths_dict.keys():
@@ -166,6 +172,9 @@
self.ctc_enabled = 'False'
if hasattr(config, 'ctc_enabled'):
self.ctc_enabled = to_bool(config.ctc_enabled)
+ self.ats_stf_enabled = 'False'
+ if hasattr(config, 'ats_stf_enabled'):
+ self.ats_stf_enabled = to_bool(config.ats_stf_enabled)
if hasattr(config, 'multiset_enabled'):
self.multiset_enabled = to_bool(config.multiset_enabled)
if hasattr(config, 'monsym_files'):
@@ -180,6 +189,9 @@
self.flash_images = config.flash_images
if hasattr(config, 'test_type'):
self.test_type = config.test_type
+ self.minimum_execution_blocks = False
+ if hasattr(config, 'minimum_execution_blocks'):
+ self.minimum_execution_blocks = config.minimum_execution_blocks
def insert_set(self, data_files=None, config_files=None,
engine_ini_file=None, image_files=None, sis_files=None,
@@ -230,12 +242,39 @@
if self.trace_enabled != "":
if self.trace_enabled.lower() == "true":
setd = dict(setd, pmd_files=pmd_files,
- trace_path=self.file_store.joinpath(self.REPORT_PATH, "traces", setd["name"], "tracelog.blx"),
+ trace_path=os.path.join(self.file_store, self.REPORT_PATH, "traces", setd["name"], "tracelog.blx"),
trace_activation_files=trace_activation_files)
else:
setd = dict(setd, pmd_files=[],
trace_path="",trace_activation_files=[])
- self.sets.append(setd)
+
+ if self.minimum_execution_blocks:
+ if self.sets == []:
+ self.sets = [setd]
+ else:
+ files = ['component_path',
+ 'trace_activation_files',
+ 'src_dst',
+ #'trace_path',
+ #'custom_dir',
+ 'pmd_files',
+ 'dll_files',
+ 'config_files',
+ 'data_files',
+ 'testmodule_files']
+
+ if self.sets[0]['test_harness'] == setd['test_harness'] and setd['engine_ini_file'] == None:
+ for param in files:
+ if setd[param]:
+ if type(setd[param]) == dict:
+ for key in setd[param].keys():
+ self.sets[0][param][key] = setd[param][key]
+ else:
+ self.sets[0][param] = self.sets[0][param] + setd[param]
+ else:
+ self.sets.append(setd)
+ else:
+ self.sets.append(setd)
def set_plan_harness(self):
"""setting up test harness for a plan"""
@@ -272,7 +311,7 @@
actions = []
temp_var = ""
include_ctc_runprocess = False
- report_path = self.file_store.joinpath(self.REPORT_PATH)
+ report_path = os.path.join(self.file_store, self.REPORT_PATH)
if self.ctc_enabled and adg.CTC_PATHS_LIST != [] and self.monsym_files != "" and not "${" in self.monsym_files:
include_ctc_runprocess = True
@@ -311,18 +350,18 @@
("send-files", "true"),
("to", self.report_email)))
ats3_report = ("FileStoreAction",
- (("to-folder", report_path.joinpath("ATS3_REPORT")),
+ (("to-folder", os.path.join(report_path, "ATS3_REPORT")),
("report-type", "ATS3_REPORT"),
("date-format", "yyyyMMdd"),
("time-format", "HHmmss")))
stif_report = ("FileStoreAction",
- (("to-folder", report_path.joinpath("STIF_REPORT")),
+ (("to-folder", os.path.join(report_path, "STIF_REPORT")),
("report-type", "STIF_COMPONENT_REPORT_ALL_CASES"),
("run-log", "true"),
("date-format", "yyyyMMdd"),
("time-format", "HHmmss")))
eunit_report = ("FileStoreAction",
- (("to-folder", report_path.joinpath("EUNIT_REPORT")),
+ (("to-folder", os.path.join(report_path, "EUNIT_REPORT")),
("report-type", "EUNIT_COMPONENT_REPORT_ALL_CASES"),
("run-log", "true"),
("date-format", "yyyyMMdd"),
@@ -405,7 +444,9 @@
tesplan_counter += 1
exe_flag = False
for srcanddst in plan_sets['src_dst']:
- _ext = srcanddst[0].rsplit(".")[1]
+ _ext = ''
+ if '.' in srcanddst[0]:
+ _ext = srcanddst[0].rsplit(".")[1]
#the list below are the files which are executable
#if none exists, set is not executable
for mat in ["dll", "ini", "cfg", "exe", "script"]:
@@ -488,9 +529,11 @@
default="")
cli.add_option("--specific-pkg", help="Text in name of pkg files to use", default='')
cli.add_option("--ats4-enabled", help="ATS4 enabled", default="False")
+ cli.add_option("--ats-stf-enabled", help="ATS STF enabled", default="False")
cli.add_option("--obey-pkgfiles", help="If this option is True, then only test components having PKG file are executable and if the compnents don't have PKG files they will be ignored.", default="False")
cli.add_option("--verbose", help="Increase output verbosity", action="store_true", default=False)
cli.add_option("--hti", help="HTI enabled", default="True")
+ cli.add_option("--minimum-execution-blocks", help="Create as few as possible execution blocks", default="false")
opts, tsrc_paths = cli.parse_args()
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/aste_template.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/aste_template.xml Mon Oct 18 10:23:52 2010 +0100
@@ -139,7 +139,7 @@
<type>InstallSisTask</type>
<parameters>
<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
- <parameter name="upgrade-data " value="true"/>
+ <parameter name="upgrade-data" value="true"/>
<parameter name="ignore-ocsp-warnings" value="true"/>
<parameter name="ocsp-done" value="true"/>
<parameter name="software-package" value="c:\testframework\{{ os.path.basename(sis_file) }}"/>
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/ats4_template.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/ats4_template.xml Mon Oct 18 10:23:52 2010 +0100
@@ -77,7 +77,7 @@
{%- endif %}
{% if setd["ctc_enabled"] == "True" -%}
- {{ macros.ctc_initialization() }}
+ {{ macros.ctc_initialization(test_plan) }}
{%- endif %}
<task>
@@ -168,7 +168,7 @@
<type>InstallSisTask</type>
<parameters>
<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
- <parameter name="upgrade-data " value="true"/>
+ <parameter name="upgrade-data" value="true"/>
<parameter name="ignore-ocsp-warnings" value="true"/>
<parameter name="ocsp-done" value="true"/>
<parameter name="software-package" value="c:\testframework\{{ os.path.basename(sis_file) }}"/>
@@ -272,7 +272,7 @@
<finalization>
{% if setd["ctc_enabled"] == "True" -%}
- {{ macros.ctc_finalization(setd) }}
+ {{ macros.ctc_finalization(test_plan) }}
{%- endif %}
<task>
@@ -311,7 +311,7 @@
<type>EmailAction</type>
<parameters>
<parameter value="ATS test results {{ test_plan['testrun_name'] }}" name="subject"/>
- <parameter value="{{ test_plan['report_email'] }}" name="to"/>
+ <parameter value="{{ test_plan['report_email']|e }}" name="to"/>
<parameter value="simplelogger" name="format"/>
{% if test_plan['report_type'].lower() == 'no_attachment' -%}
<parameter value="false" name="attach-report"/>
@@ -319,6 +319,15 @@
</parameters>
</action>
{%- endif %}
+ {% if test_plan['file_store'] -%}
+ <action>
+ <type>FileStoreAction</type>
+ <parameters>
+ <parameter value="{{ test_plan['file_store'] }}\%START_DATE%_%START_TIME%_%SERVER_TOKEN%" name="dst"/>
+ <parameter value="true" name="overwrite"/>
+ </parameters>
+ </action>
+ {% endif %}
{% if test_plan['diamonds_build_url'] -%}
<action>
<type>DiamondsAction</type>
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/atsconfigparser.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/atsconfigparser.py Mon Oct 18 10:23:52 2010 +0100
@@ -51,8 +51,11 @@
p_temp.value = value
changed = True
if not changed:
- for device in self.doc.test.target.device:
- device.xml_append(self.doc.xml_create_element(u"setting", attributes = {u'name': unicode(name), u'value': unicode(value)}))
+ if hasattr(self.doc, 'test'):
+ for device in self.doc.test.target.device:
+ device.xml_append(self.doc.xml_create_element(u"setting", attributes = {u'name': unicode(name), u'value': unicode(value)}))
+ else:
+ raise Exception("You can't add a setting with ats4")
def containsattribute(self, name, value):
""" returns true or false """
@@ -74,9 +77,12 @@
p_temp.value = value
changed = True
if not changed:
- for device in self.doc.test.target.device:
- device.xml_append(self.doc.xml_create_element(u"property", attributes = {u'name': unicode(name), u'value': unicode(value)}))
-
+ if hasattr(self.doc, 'test'):
+ for device in self.doc.test.target.device:
+ device.xml_append(self.doc.xml_create_element(u"property", attributes = {u'name': unicode(name), u'value': unicode(value)}))
+ else:
+ for device in self.doc.testrun.agents.agent:
+ device.xml_append(self.doc.xml_create_element(u"property", attributes = {u'name': unicode(name), u'value': unicode(value)}))
class ATSConfigParser:
""" ATS configuration parser"""
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/bootup_testing.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,361 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================
+#Name : bootup_testing.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""Bootup test drop generation."""
+
+#W0142 => * and ** were used
+#R* removed during refactoring
+
+from optparse import OptionParser
+from xml.etree import ElementTree as et
+import logging
+import os
+import re
+import tempfile
+import zipfile
+import pkg_resources # pylint: disable-msg=F0401
+from path import path # pylint: disable-msg=F0401
+import amara
+import ntpath as atspath
+import jinja2 # pylint: disable-msg=F0401
+import ats3.parsers as parser
+
+_logger = logging.getLogger('bootup-testing')
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+class Configuration(object):
+ """
+ Bootup test drop generation configuration.
+ """
+
+ def __init__(self, opts):
+ """
+ Initialize from optparse configuration options.
+ """
+
+ self._opts = opts
+ # Customize some attributes from how optparse leaves them.
+ self.build_drive = path(self._opts.build_drive)
+ self.file_store = path(self._opts.file_store)
+ self.flash_images = self.split_paths(self._opts.flash_images)
+ self.template_loc = path(self._opts.template_loc)
+
+
+ def split_paths(self, arg, delim=","):
+ """
+ Split the string by delim, removing extra whitespace.
+ """
+ return [path(part.strip())
+ for part in arg.split(delim) if part.strip()]
+
+ def __getattr__(self, attr):
+ return getattr(self._opts, attr)
+
+ def __str__(self):
+ dump = "Configuration:\n"
+ seen = set()
+ for key, value in vars(self).items():
+ if not key.startswith("_"):
+ dump += "\t%s = %s\n" % (key, value)
+ seen.add(key)
+ for key, value in vars(self._opts).items():
+ if key not in seen:
+ dump += "\t%s = %s\n" % (key, value)
+ seen.add(key)
+ return dump
+
+
+class BootupTestPlan(object):
+ """
+ Tells ATS server that images have to be tested if they can start the device.
+ """
+
+ def __init__(self, config):
+ self.pkg_parser = parser.PkgFileParser()
+ self.file_store = config.file_store
+ self.build_drive = config.build_drive
+
+ def insert_execution_block(self, block_count=1, image_files=None):
+ """
+ Insert task and flash files into the execution block
+ """
+ if image_files is None:
+ image_files = []
+
+ exe_dict = dict(name="exe%d" % block_count, image_files=image_files)
+
+ return exe_dict
+
+
+ def __getitem__(self, key):
+ return self.__dict__[key]
+
+
+
+class BootupTestDropGenerator(object):
+ """
+ Generate test drop zip file for Bootup testing.
+
+ The main responsibility of this class is to create testdrop and
+ test.xml file.
+
+ """
+
+ def __init__(self):
+ self.drop_path_root = path("BootupDrop")
+ self.drop_path = None
+ self.defaults = {}
+
+ def generate(self, xml_dict, output_file, template_loc=None):
+ """Generate a test drop file."""
+ xml = self.generate_xml(xml_dict, template_loc)
+ return self.generate_drop(xml_dict, xml, output_file)
+
+ def generate_drop(self, xml_dict, xml, output_file):
+ """Generate test drop zip file."""
+
+ zfile = zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED)
+ try:
+ for drop_file, src_file in self.drop_files(xml_dict):
+
+ _logger.info(" + Adding: %s" % src_file.strip())
+ try:
+ zfile.write(src_file.strip(), drop_file.encode('utf-8'))
+ except OSError, expr:
+ _logger.error(expr)
+ doc = amara.parse(et.tostring(xml.getroot()))
+ _logger.debug("XML output: %s" % doc.xml(indent=u"yes", encoding="ISO-8859-1"))
+ zfile.writestr("test.xml", doc.xml(indent="yes", encoding="ISO-8859-1"))
+ finally:
+ _logger.info("Testdrop for bootup testing created successfully!")
+ zfile.close()
+
+ def generate_xml(self, xml_dict, template_loc):
+ """ generate an XML file"""
+ template_loc = path(template_loc).normpath()
+ loader = jinja2.ChoiceLoader([jinja2.PackageLoader(__name__, 'templates')])
+ env = jinja2.Environment(loader=loader)
+ if template_loc is None or not ".xml" in template_loc.lower():
+ template = env.from_string(pkg_resources.resource_string(__name__, 'bootup_testing_template.xml'))# pylint: disable-msg=E1101
+ else:
+ template = env.from_string(open(template_loc).read())# pylint: disable-msg=E1101
+
+ xmltext = template.render(xml_dict=xml_dict, os=os, atspath=atspath, atsself=self).encode('ISO-8859-1')
+ #print xmltext
+ return et.ElementTree(et.XML(xmltext))
+
+
+ def drop_files(self, xml_dict):
+ """Yield a list of drop files."""
+
+ drop_set = set()
+ drop_files = []
+ #Adding test asset, there's an execution block for every test asset
+ for execution_block in xml_dict["execution_blocks"]:
+ drop_dir = path(execution_block["name"])
+ drop_files = execution_block["image_files"]
+ for file_path in drop_files:
+ if file_path != None:
+ #Adding image files to the top level,
+ drop_file = drop_dir.joinpath("images", file_path.name)
+
+ drop_file = drop_file.normpath()
+ if drop_file not in drop_set:
+ drop_set.add(drop_file)
+ yield (drop_file, file_path.normpath())
+
+
+class ComponentParser(object):
+ """
+ Add information to the XML dictionary
+ """
+ def __init__(self, config):
+ self.flash_images = [path(p) for p in config.flash_images]
+ self.build_drive = config.build_drive
+ self.diamonds_build_url = config.diamonds_build_url
+ self.testrun_name = config.testrun_name
+ self.alias_name = config.alias_name
+ self.device_type = config.device_type
+ self.report_email = config.report_email
+ self.email_format = config.email_format
+ self.email_subject = config.email_subject
+
+ self.xml_dict = {}
+
+
+ def insert_pre_data(self):
+ """
+ Creates a dictionary for the data before
+ the <execution> block starts.
+ """
+ self.xml_dict = dict(self.xml_dict, temp_directory=path(tempfile.mkdtemp()))
+ self.xml_dict = dict(self.xml_dict, diamonds_build_url=self.diamonds_build_url)
+ self.xml_dict = dict(self.xml_dict, testrun_name=self.testrun_name)
+ self.xml_dict = dict(self.xml_dict, alias_name=self.alias_name)
+ self.xml_dict = dict(self.xml_dict, device_type=self.device_type)
+
+ def create_execution_block(self, config):
+ """Parse flash images """
+ execution_block_list = []
+ test_plan = BootupTestPlan(config)
+ block_count = 1
+ self.flash_images = self.get_sorted_images(self.flash_images)
+ execution_block_list.append(test_plan.insert_execution_block(block_count, self.flash_images))
+
+
+ self.xml_dict = dict(self.xml_dict, execution_blocks=execution_block_list)
+
+ def insert_post_data(self):
+ """
+ Creates a dictionary for the data after
+ the <execution> block ends. Or, Postaction data
+ """
+ self.xml_dict = dict(self.xml_dict, report_email=self.report_email)
+ self.xml_dict = dict(self.xml_dict, email_format=self.email_format)
+ self.xml_dict = dict(self.xml_dict, email_subject=self.email_subject)
+
+ return self.xml_dict
+
+ def get_sorted_images(self, image_files):
+ """sort the images """
+ sorted_images = []
+ for image_file in image_files:
+ if 'core' in image_file.name:
+ sorted_images.append(image_file)
+ for image_file in image_files:
+ if 'rofs2' in image_file.name:
+ sorted_images.append(image_file)
+ for image_file in image_files:
+ if 'rofs3' in image_file.name:
+ sorted_images.append(image_file)
+ for image_file in image_files:
+ if 'udaerase' in image_file.name:
+ sorted_images.append(image_file)
+ for image_file in image_files:
+ if 'core' not in image_file.name and 'rofs2' not in image_file.name and 'rofs3' not in image_file.name and 'udaerase' not in image_file.name.lower():
+ sorted_images.append(image_file)
+ if len(sorted_images) > 0 and "rofs" in sorted_images[0]:
+ return image_files
+ return sorted_images
+
+def create_drop(config):
+ """Create a test drop."""
+ xml_dict = {}
+
+ _logger.debug("initialize configuration dictionary")
+ drop_parser = ComponentParser(config)
+
+ #Inserting data for test run and global through out the dictionary
+ drop_parser.insert_pre_data()
+
+ #for every asset path there should be a
+ #separate execution block
+ drop_parser.create_execution_block(config)
+
+ #Inserting reporting and email data (post actions)
+ xml_dict = drop_parser.insert_post_data()
+
+
+# print "-------------------------------------------------"
+# keys = xml_dict
+# for key in xml_dict.keys():
+# if key == "execution_blocks":
+# for exe in xml_dict[key]:
+# print key, "->"
+# print exe['name']
+# print exe['image_files']
+# for file1 in exe['image_files']:
+# print file1
+#
+# else:
+# print key, "->", xml_dict[key]
+#
+# print xml_dict['diamonds_build_url']
+# print xml_dict['testrun_name']
+# print xml_dict['email_format']
+# print xml_dict['email_subject']
+#
+# print "-------------------------------------------------"
+
+
+
+ generator = BootupTestDropGenerator()
+ _logger.info("generating drop file: %s" % config.drop_file)
+ generator.generate(xml_dict, output_file=config.drop_file, template_loc=config.template_loc)
+
+
+
+def to_bool(param):
+ """setting a true or false based on a param value"""
+ param = str(param).lower()
+ if "true" == param or "t" == param or "1" == param:
+ return "True"
+ else:
+ return "False"
+
+def main():
+ """Main entry point."""
+
+
+ cli = OptionParser(usage="%prog [options] PATH1 [PATH2 [PATH3 ...]]")
+ cli.add_option("--ats4-enabled", help="ATS4 enabled", default="True")
+ cli.add_option("--build-drive", help="Build area root drive")
+ cli.add_option("--drop-file", help="Name for the final drop zip file", default="ATSBootupDrop.zip")
+
+ cli.add_option("--minimum-flash-images", help="Minimum amount of flash images", default=2)
+ cli.add_option("--flash-images", help="Paths to the flash image files", default="")
+
+ cli.add_option("--template-loc", help="Custom template location", default="")
+
+ cli.add_option("--file-store", help="Destination path for reports.", default="")
+ cli.add_option("--report-email", help="Email notification receivers", default="")
+ cli.add_option("--testrun-name", help="Name of the test run", default="bootup_test")
+ cli.add_option("--alias-name", help="Name of the alias", default="alias")
+ cli.add_option("--device-type", help="Device type (e.g. 'PRODUCT')", default="unknown")
+ cli.add_option("--diamonds-build-url", help="Diamonds build url")
+ cli.add_option("--email-format", help="Format of an email", default="")
+ cli.add_option("--email-subject", help="Subject of an email", default="Bootup Testing")
+ cli.add_option("--verbose", help="Increase output verbosity", action="store_true", default=False)
+
+ opts, _ = cli.parse_args()
+
+ ats4_enabled = to_bool(opts.ats4_enabled)
+
+ if ats4_enabled == "False":
+ cli.error("Bootup test executes on ATS4. Set property 'ats4.enabled'")
+
+ if not opts.flash_images:
+ cli.error("no flash image files given")
+ if len(opts.flash_images.split(",")) < int(opts.minimum_flash_images):
+ cli.error("Not enough flash files: %i defined, %i needed" % (len(opts.flash_images.split(",")), int(opts.minimum_flash_images) ))
+
+ if opts.verbose:
+ _logger.setLevel(logging.DEBUG)
+ logging.basicConfig(level=logging.DEBUG)
+ _ = tempfile.mkdtemp()
+ config = Configuration(opts)
+ create_drop(config)
+
+if __name__ == "__main__":
+ main()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/bootup_testing_template.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
+<!--
+============================================================================
+Name : bootup_testing_template.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Contains the template for the test.xml file output. The test.xml file contains
+information on the files used to create the drop file.
+============================================================================
+-->
+
+<testrun>
+ <metadata>
+ {% if xml_dict['diamonds_build_url'] -%}
+ <meta name="diamonds-buildid">{{ xml_dict['diamonds_build_url'] }}</meta>
+ <meta name="diamonds-testtype">Smoke</meta>
+ {% endif %}
+ <meta name="name">{{ xml_dict['testrun_name'] }}</meta>
+ </metadata>
+
+ <agents>
+ <agent alias="{{ xml_dict['alias_name'] }}">
+ <property name="hardware" value="{{ xml_dict["device_type"] }}"/>
+ </agent>
+ </agents>
+
+
+ {% for exe_block in xml_dict['execution_blocks'] -%}
+ <execution defaultAgent="{{ xml_dict['alias_name'] }}">
+ <initialization>
+
+ {% if exe_block['image_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FlashTask</type>
+ <parameters>
+ {% set i = 1 %}
+ {% for img in exe_block['image_files'] -%}
+ <parameter name="image-{{ i }}" value="{{ exe_block['name'] }}\images\{{ os.path.basename(img) }}" />
+ {% set i = i + 1 %}
+ {% endfor -%}
+ </parameters>
+ </task>
+ {% endif %}
+
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>RebootTask</type>
+ <parameters/>
+ </task>
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>CreateDirTask</type>
+ <parameters>
+ <parameter value="c:\logs\testability" name="dir"/>
+ </parameters>
+ </task>
+ </initialization>
+
+ <finalization>
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>CleanupTask</type>
+ <parameters>
+ <parameter value="true" name="upload-files"/>
+ </parameters>
+ </task>
+ </finalization>
+ </execution>
+ {% endfor -%}
+
+ <postActions>
+ <action>
+ <type>EmailAction</type>
+ <parameters>
+ <parameter value="{{ xml_dict['email_subject'] }}" name="subject"/>
+ <parameter value="{{ xml_dict['report_email'] }}" name="to"/>
+ <parameter value="{{ xml_dict['email_format'] }}" name="format"/>
+ </parameters>
+ </action>
+ </postActions>
+
+</testrun>
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/dropgenerator.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/dropgenerator.py Mon Oct 18 10:23:52 2010 +0100
@@ -440,7 +440,7 @@
if 'rofs3' in image_file.name:
sorted_images.append(image_file)
for image_file in setd["image_files"]:
- if 'core' not in image_file.name and 'rofs2' not in image_file.name and 'rofs3' not in image_file.name and 'udaerase' not in image_file.name.lower():
+ if 'core' not in image_file.name and 'rofs2' not in image_file.name and 'rofs3' not in image_file.name:
sorted_images.append(image_file)
if len(sorted_images) > 0 and "rofs" in sorted_images[0]:
return setd["image_files"]
@@ -1029,7 +1029,11 @@
template = env.from_string(pkg_resources.resource_string(__name__, 'ats4_template.xml'))# pylint: disable=E1101
xmltext = template.render(test_plan=test_plan, os=os, atspath=atspath, atsself=self).encode('ISO-8859-1')
- return et.ElementTree(et.XML(xmltext))
+ try:
+ xml = et.ElementTree(et.XML(xmltext))
+ except ExpatError, err:
+ raise ExpatError(str(err) + xmltext)
+ return xml
def get_template(self, directory, template_name):
if directory:
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/matti/MattiDrops.py Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,254 +0,0 @@
-# -*- encoding: latin-1 -*-
-
-#============================================================================
-#Name : MattiDrops.py
-#Part of : Helium
-
-#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 the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description: Script for test drop generation and sending to execution to
-#ATS3-system
-#===============================================================================
-
-""" create the MATTI test drop file for use on the test server """
-# pylint: disable=R0902, R0903, R0912
-
-import os
-import re
-import sys
-import string
-import zipfile
-import logging
-from optparse import OptionParser
-from xml.etree import ElementTree as et
-from jinja2 import Environment, PackageLoader # pylint: disable=F0401
-
-# Shortcuts
-E = et.Element
-SE = et.SubElement
-
-_logger = logging.getLogger('matti')
-
-class Configuration(object):
- """
- ATS3 drop generation configuration.
- """
-
- def __init__(self, opts):
- """
- Initialize from optparse configuration options.
- """
- self._opts = opts
-
- # Customize some attributes from how optparse leaves them.
- self.build_drive = os.path.normpath(self._opts.build_drive)
- self.file_store = os.path.normpath(self._opts.file_store)
- self.matti_scripts = os.path.normpath(self._opts.matti_scripts)
- self.template_location = os.path.normpath(self._opts.template_loc)
- if self._opts.flash_images:
- self.flash_images = self._opts.flash_images.split(',')
- else:
- self.flash_images = []
- if not re.search(r'\A\s*?\Z', self._opts.sis_files):
- self.sis_files = self._opts.sis_files.split(',')
- else:
- self.sis_files = None
- self.step_list = []
- self.filelist = []
- self.image_list = []
- self.sis_list = []
- self.device_type = self._opts.device_type
- self.device_hwid = self._opts.device_hwid
- self.drop_file = self._opts.drop_file
- self.minimum_flash_images = self._opts.minimum_flash_images
- self.plan_name = self._opts.plan_name
- self.test_timeout = self._opts.test_timeout
- self.diamonds_build_url = self._opts.diamonds_build_url
- self.testrun_name = self._opts.testrun_name
- self.report_email = self._opts.report_email
- self.harness = self._opts.harness
- self.sis_enabled = False
- if self.sis_files:
- if len(self.sis_files) >= 1:
- self.sis_enabled = True
-
-
- def __getattr__(self, attr):
- return getattr(self._opts, attr)
-
- def __str__(self):
- dump = "Configuration:\n"
- seen = set()
- for key, value in vars(self).items():
- if not key.startswith("_"):
- dump += "\t%s = %s\n" % (key, value)
- seen.add(key)
- for key, value in vars(self._opts).items():
- if key not in seen:
- dump += "\t%s = %s\n" % (key, value)
- seen.add(key)
- return dump
-
-class MattiDrop(object):
- """
- ATS3 testdrop generation for MATTI tool
- """
-
- def __init__(self, config=None):
- self.configuration = config
- self.matti_cases = {}
- self.tmp_path = os.getcwd()
- self.files = []
- self.test_files = []
-
- def fetch_testfiles(self):
- """Needed flash files, sis-files and testscripts from given matti scripts -folder are added to file list."""
- tmp_case_list = []
-# tmp_image_list = []
- os.chdir(os.path.normpath(self.configuration.matti_scripts))
- try:
- for path, _, names in os.walk(os.getcwd()):
- for name in names:
- if re.search(r'.*?[.]rb\Z', name):
- tmp_case_list.append((os.path.normpath(os.path.join(path, name)), os.path.join("ats3", "matti", "script", name)))
- if tmp_case_list:
- for tmp_case in tmp_case_list:
- self.configuration.step_list.append(dict(path=os.path.join("§TEST_RUN_ROOT§", str(tmp_case[1])), name="Test case"))
- if self.configuration.flash_images:
- for image in self.configuration.flash_images:
- tmp = string.rsplit(image, os.sep)
- image_name = tmp[len(tmp)-1]
- self.configuration.image_list.append(os.path.join("ATS3Drop", "images", image_name))
- if self.configuration.sis_files:
- for sis in self.configuration.sis_files:
- tmp = string.rsplit(sis, os.sep)
- sis_name = tmp[len(tmp)-1]
- self.configuration.sis_list.append(dict(path=os.path.join("ATS3Drop", "sis", sis_name), dest=sis_name))
- except KeyError, error:
- _logger.error("Error in file reading / fetching!")
- sys.stderr.write(error)
- if tmp_case_list:
- for tmp_case in tmp_case_list:
- self.configuration.filelist.append(tmp_case[1])
- return tmp_case_list
- else:
- _logger.error("No test cases/files available!")
- return None
-
-
- def create_testxml(self):
- """This method will use Jinja2 template engine for test.xml creation"""
- os.chdir(self.tmp_path)
- env = Environment(loader=PackageLoader('ats3.matti', 'template'))
- if os.path.isfile(self.configuration.template_location):
- template = env.from_string(open(self.configuration.template_location).read())
- xml_file = open("test.xml", 'w')
- xml_file.write(template.render(configuration=self.configuration))
- xml_file.close()
- else:
- _logger.error("No template file found")
-
- def create_testdrop(self, output_file=None, file_list=None):
- """Creates testdrop zip-file to given location."""
- #env = Environment(loader=PackageLoader('MattiDrops', 'template'))
- os.chdir(self.tmp_path)
- if output_file and file_list:
- zfile = zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED)
- try:
- _logger.info("Adding files to testdrop:")
- for src_file, drop_file in file_list:
- _logger.info(" + Adding: %s" % src_file.strip())
- if os.path.isfile(src_file):
- zfile.write(str(src_file.strip()), str(drop_file))
- else:
- _logger.error("invalid test file name supplied %s " % drop_file)
- if self.configuration.flash_images:
- for image in self.configuration.flash_images:
- tmp = string.rsplit(image, os.sep)
- image_name = tmp[len(tmp)-1]
- _logger.info(" + Adding: %s" % image_name)
- if os.path.isfile(image):
- zfile.write(image, os.path.join("ATS3Drop", "images", image_name))
- else:
- _logger.error("invalid flash file name supplied %s " % image_name)
- if self.configuration.sis_enabled:
- if self.configuration.sis_files:
- for sis in self.configuration.sis_files:
- tmp = string.rsplit(sis, os.sep)
- sis_name = tmp[len(tmp)-1]
- _logger.info(" + Adding: %s" % sis_name)
- if os.path.isfile(sis):
- zfile.write(sis, os.path.join("ATS3Drop", "sis", sis_name))
- else:
- _logger.error("invalid sis file name supplied %s " % sis_name)
- zfile.write(os.path.normpath(os.path.join(os.getcwd(),"test.xml")), "test.xml")
- finally:
- _logger.info("Testdrop created! %s" % output_file)
- zfile.close()
- return zfile
-
-def create_drop(configuration):
- """Testdrop creation"""
- if configuration:
- m_drop = MattiDrop(configuration)
- m_drop.fetch_testfiles()
- m_drop.create_testxml()
- return m_drop.create_testdrop(configuration.drop_file, m_drop.fetch_testfiles())
- else:
- _logger.error("No configuration available for test drop creation")
-
-def main():
- """Main entry point."""
- cli = OptionParser(usage="%prog [options] TSRC1 [TSRC2 [TSRC3 ...]]")
- cli.add_option("--build-drive", help="Build area root drive", default='X:')
- cli.add_option("--matti-scripts", help="Path to the directory where the MATTI test scripts are saved.", default="")
- cli.add_option("--flash-images", help="Flash image files as a list",
- default="")
- cli.add_option("--report-email", help="Email notification receivers",
- default="")
- cli.add_option("--harness", help="Test harness (default: %default)",
- default="unknown")
- cli.add_option("--file-store", help="Destination path for reports.",
- default="")
- cli.add_option("--testrun-name", help="Name of the test run",
- default="run")
- cli.add_option("--device-type", help="Device type (e.g. 'PRODUCT')",
- default="unknown")
- cli.add_option("--device-hwid", help="Device hwid",
- default="")
- cli.add_option("--diamonds-build-url", help="Diamonds build url")
- cli.add_option("--drop-file", help="Name for the final drop zip file",
- default="")
- cli.add_option("--minimum-flash-images", help="Minimum amount of flash images",
- default=2)
- cli.add_option("--plan-name", help="Name of the test plan",
- default="plan")
- cli.add_option("--sis-files", help="Sis files as a list",
- default="")
- cli.add_option("--template-loc", help="location of template file",
- default="..\template")
- cli.add_option("--test-timeout", help="Test execution timeout value (default: %default)",
- default="60")
- cli.add_option("--verbose", help="Increase output verbosity",
- action="store_true", default=True)
- opts, _ = cli.parse_args()
-
- if opts.verbose:
- _logger.setLevel(logging.DEBUG)
- logging.basicConfig(level=logging.DEBUG)
- config = Configuration(opts)
- create_drop(config)
-
-
-if __name__ == "__main__":
- main()
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/matti/__init__.py Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-# -*- coding: latin-1 -*-
-
-#============================================================================
-#Name : __init__.py
-#Part of : Helium
-
-#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 the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-""" nothing needed here"""
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/matti/template/matti_demo.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-============================================================================
-Name : matti.demo.xml
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-Contains the template for the test.xml file output. The test.xml file contains
-information on the files used to create the drop file.
-============================================================================
---><test>
-<name>{{ configuration.testrun_name }}</name>
- <target>
- <device alias="{{ configuration.harness }}" rank="none">
- <property name="HARNESS" value="{{ configuration.harness }}"/>
- <property name="TYPE" value="{{ configuration.device_type }}"/>
- <property name="HARDWARE" value="{{ configuration.device_type }}"/>
- </device>
- </target>
- <plan passrate="100" enabled="true" name="MATTI test {{ configuration.plan_name }}" significant="false" harness="{{ configuration.harness }}">
- <session name="session" harness="{{ configuration.harness }}" enabled="true" passrate="100">
- {%- set i = 0 -%}
- <set name="MATTI test set{{ i }}" harness="{{ configuration.harness }}" enabled="true" passrate="100">
- <target>
- <device alias="{{ configuration.harness }}" rank="master"/>
- </target>
- <case name="MATTI test case" passrate="100" harness="STIF" enabled="true" significant="false">
- {% if configuration.image_list -%}
- {% for flash in configuration.image_list -%}
- <flash target-alias="{{ configuration.harness }}" images="{{ flash }}" />
- {% endfor -%}
- {% endif %}
- <step name="Create logs folder" harness="STIF" enabled="true" passrate="100" significant="false">
- <command>makedir</command>
- <params>
- <param dir="c:\logs\testability"/>
- </params>
- </step>
- {% if configuration.sis_list -%}
- {% for sis in configuration.sis_list -%}
- <step name="Copy sis" harness="STIF" enabled="true" passrate="100" significant="false">
- <command>install</command>
- <params>
- <param src="{{ sis['path'] }}"/>
- <param dst="E:\{{ sis['dest'] }}"/>
- <param overwrite="false"/>
- </params>
- </step>
-
- <step name="Install SIS" harness="STIF" enabled="true" passrate="100" significant="false">
- <command>install-software</command>
- <params>
- <param sisPackageName="E:\{{ sis['dest'] }}"/>
- <param upgradeAllowed="true"/>
- <param optionalItemsAllowed="true"/>
- <param OCSP_Done="true"/>
- <param ignoreOCSPWarnings="true"/>
- <param untrustedAllowed="true"/>
- <param packageInfoAllowed="true"/>
- <param userCapGranted="true"/>
- <param killApp="true"/>
- <param overWriteAllowed="true"/>
- <param downloadAllowed="false"/>
- <param downloadUsername="user"/>
- <param downloadPassword="passwd"/>
- <param installDrive="C"/>
- <param upgradeData="true"/>
- <param timeout="40"/>
- </params>
- </step>
- {% endfor -%}
- {% endif %}
- {% for step in configuration.step_list -%}
- <step name="{{ step['name'] }}" harness="{{ configuration.harness }}" enabled="true" passrate="100" significant="false">
- <command>execute</command>
- <params>
- <param dir="C:\ruby\bin\"/>
- <param file="C:\ruby\bin\ruby.exe"/>
- <param parameters="{{ step['path'] }}"/>
- <param timeout="60"/>
- <param local="true"/>
- <param async="false"/>
- <param needs-connection="true"/>
- </params>
- </step>
- {% endfor -%}
- </case>
- </set>
- {%- set i = i + 1 -%}
- </session>
- </plan>
- {% if configuration.report_email %}
- <postAction>
- <type>SendEmailAction</type>
- <params>
- <param name="subject" value="ATS3 report for §RUN_NAME§ §RUN_START_DATE§ §RUN_START_TIME§"/>
- <param name="type" value="ATS3_REPORT"/>
- <param name="send-files" value="true"/>
- <param name="to" value="{{ configuration.report_email }}"/>
- </params>
- </postAction>
- {% endif %}
- {% if configuration.filelist %}
- <files>
- {% for img in configuration.image_list -%}
- <file>{{ img }}</file>
- {% endfor -%}
- {% for sis in configuration.sis_list -%}
- <file>{{ sis['path'] }}</file>
- {% endfor -%}
- {% for file in configuration.filelist -%}
- <file>{{ file }}</file>
- {% endfor -%}
- </files>
- {% endif %}
-</test>
\ No newline at end of file
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/matti2.py Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,446 +0,0 @@
-# -*- encoding: latin-1 -*-
-
-#============================================================================
-#Name : matti.py
-#Part of : Helium
-
-#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 the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-"""MATTI test drop generation."""
-
-# pylint: disable=R0201,R0903,R0902,W0142
-#W0142 => * and ** were used
-#R* removed during refactoring
-
-from optparse import OptionParser
-from xml.etree import ElementTree as et
-import logging
-import os
-import re
-import tempfile
-import zipfile
-import pkg_resources # pylint: disable=F0401
-from path import path # pylint: disable=F0401
-import amara
-import ntpath as atspath
-import jinja2 # pylint: disable=F0401
-import ats3.parsers as parser
-
-_logger = logging.getLogger('matti')
-
-# Shortcuts
-E = et.Element
-SE = et.SubElement
-
-class Configuration(object):
- """
- MATTI drop generation configuration.
- """
-
- def __init__(self, opts):
- """
- Initialize from optparse configuration options.
- """
-
- self._opts = opts
- # Customize some attributes from how optparse leaves them.
- self.build_drive = path(self._opts.build_drive)
- self.file_store = path(self._opts.file_store)
- self.flash_images = self.split_paths(self._opts.flash_images)
- self.matti_sis_files = self.split_paths(self._opts.matti_sis_files)
- self.test_assets = self.split_paths(self._opts.testasset_location)
- self.template_loc = path(self._opts.template_loc)
-
-
- def split_paths(self, arg, delim=","):
- """
- Split the string by delim, removing extra whitespace.
- """
- return [path(part.strip())
- for part in arg.split(delim) if part.strip()]
-
- def __getattr__(self, attr):
- return getattr(self._opts, attr)
-
- def __str__(self):
- dump = "Configuration:\n"
- seen = set()
- for key, value in vars(self).items():
- if not key.startswith("_"):
- dump += "\t%s = %s\n" % (key, value)
- seen.add(key)
- for key, value in vars(self._opts).items():
- if key not in seen:
- dump += "\t%s = %s\n" % (key, value)
- seen.add(key)
- return dump
-
-
-class MattiTestPlan(object):
- """
- Tells MATTI server what to test and how.
-
- The MATTI test plan from which the test.xml file can be written. The test
- plan requires TestAsset(s) to perform the tests
- """
-
- def __init__(self, config):
- self.pkg_parser = parser.PkgFileParser()
- self.file_store = config.file_store
- self.matti_timeout = config.matti_timeout
- self.test_profiles = config.test_profiles
- self.sierra_enabled = to_bool(config.sierra_enabled)
- self.sierra_parameters = config.sierra_parameters
- self.test_profiles = config.test_profiles.strip().split(",")
- self.build_drive = config.build_drive
- self.matti_sis_files = ""
- self.install_files = []
- self.matti_task_files = None
-
- def insert_execution_block(self, block_count=1, image_files=None, matti_sis_files=None, test_asset_path=None, matti_parameters=None):
- """
- Insert Matti tasks and test data files into execution block
- """
- self.matti_sis_files = matti_sis_files
- temp_sis_files = []
- if self.matti_sis_files != None:
- for sis_file in self.matti_sis_files:
- temp_sis_files.append(sis_file.split("#"))
-
- test_asset_path = test_asset_path
- if image_files is None:
- image_files = []
-
- exe_dict = dict(name="exe%d" % block_count, asset_path=test_asset_path, image_files=image_files, matti_sis_files=temp_sis_files)
- exe_dict = dict(exe_dict, test_timeout=self.matti_timeout)
- exe_dict = dict(exe_dict, matti_parameters=matti_parameters)
- exe_dict = dict(exe_dict, sierra_enabled=self.sierra_enabled.lower())
- exe_dict = dict(exe_dict, sierra_parameters=self.sierra_parameters)
-
-
- self.matti_task_files = self.create_matti_task_files_list(self.sierra_enabled, test_asset_path)
- exe_dict = dict(exe_dict, matti_task_files=self.matti_task_files)
-
- self.install_files = self.create_install_files_list(test_asset_path)
- exe_dict = dict(exe_dict, install_files=self.install_files)
- return exe_dict
-
- def create_matti_task_files_list(self, enabler=None, asset_path=None):
- """
- Creates list of files needed to include in MATTI execution tasks
- if sierra.enabled then
- profiles (.sip files) are included
- else
- all ruby (.rb) files are included
- """
-
- profiles = []
- rb_files = []
-
- #If sierra engine is enabled (set to True)
- if self.sierra_enabled.lower() == "true":
- profile_path = path(os.path.join(asset_path, "profile"))
- if os.path.exists(profile_path):
- for profile_name in self.test_profiles:
- item = list(profile_path.walkfiles("%s.sip"%profile_name.lower().strip()))
- if len(item) > 0:
- #profiles.append(os.path.join(profile_path, item[0]))
- profiles.append(asset_path.rsplit(os.sep, 1)[1] + "/" + "profile" + "/" + item[0].rsplit(os.sep, 1)[1])
- return profiles
- else: #If sierra engine is not enabled (set to False)
- if os.path.exists(asset_path):
- #returns list(asset_path.walkfiles("*.rb")):
- for item in list(asset_path.walkfiles("*.rb")):
- rb_files.append(asset_path.rsplit(os.sep, 1)[1] + "/" + item.rsplit(os.sep, 1)[1])
- # Sorting the result, so we ensure they are always in similar order.
- rb_files.sort()
- return rb_files
-
- def create_install_files_list(self, asset_path=None):
- """
- Collects all the .pkg files and extract data
- Creates a list of src, dst files.
- """
- pkg_files = []
- if os.path.exists(asset_path):
- pkg_files = list(asset_path.walkfiles("*.pkg"))
- return self.pkg_parser.get_data_files(pkg_files, self.build_drive)
- else:
- return None
-
- def __getitem__(self, key):
- return self.__dict__[key]
-
-
-
-class MattiTestDropGenerator(object):
- """
- Generate test drop zip file for Matti.
-
- Generates drop zip files file from Test Assets. The main
- responsibility of this class is to create testdrop and test.xml
- file and build a zip file for the MATTI drop.
-
- """
-
- def __init__(self):
- self.drop_path_root = path("MATTIDrop")
- self.drop_path = None
- self.defaults = {}
-
- def generate(self, xml_dict, output_file, template_loc=None):
- """Generate a test drop file."""
- xml = self.generate_xml(xml_dict, template_loc)
- return self.generate_drop(xml_dict, xml, output_file)
-
- def generate_drop(self, xml_dict, xml, output_file):
- """Generate test drop zip file."""
-
- zfile = zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED)
- try:
- for drop_file, src_file in self.drop_files(xml_dict):
-
- _logger.info(" + Adding: %s" % src_file.strip())
- try:
- zfile.write(src_file.strip(), drop_file.encode('utf-8'))
- except OSError, expr:
- _logger.error(expr)
- doc = amara.parse(et.tostring(xml.getroot()))
- _logger.debug("XML output: %s" % doc.xml(indent=u"yes", encoding="ISO-8859-1"))
- zfile.writestr("test.xml", doc.xml(indent="yes", encoding="ISO-8859-1"))
- finally:
- _logger.info("Matti testdrop created successfully!")
- zfile.close()
-
- def generate_xml(self, xml_dict, template_loc):
- """ generate an XML file"""
- template_loc = path(template_loc).normpath()
- loader = jinja2.ChoiceLoader([jinja2.PackageLoader(__name__, 'templates')])
- env = jinja2.Environment(loader=loader)
- if template_loc is None or not ".xml" in template_loc.lower():
- template = env.from_string(pkg_resources.resource_string(__name__, 'matti_template.xml'))# pylint: disable=E1101
- else:
- template = env.from_string(open(template_loc).read())# pylint: disable=E1101
-
- xmltext = template.render(xml_dict=xml_dict, os=os, atspath=atspath, atsself=self).encode('ISO-8859-1')
- #print xmltext
- return et.ElementTree(et.XML(xmltext))
-
-
- def generate_testasset_zip(self, xml_dict, output_file=None):
- """Generate TestAsset.zip for the MATTI server"""
- filename = xml_dict["temp_directory"].joinpath(r"TestAsset.zip")
-
- if output_file != None:
- filename = output_file
-
- for exe_block in xml_dict["execution_blocks"]:
- testasset_location = path(exe_block["asset_path"])
-
- zfile = zipfile.ZipFile(filename, "w", zipfile.ZIP_DEFLATED)
- try:
- for file_ in list(testasset_location.walkfiles()):
- file_mod = file_.replace(testasset_location, "")
- zfile.write(file_, file_mod.encode('utf-8'))
- finally:
- zfile.close()
- return filename
-
- def drop_files(self, xml_dict):
- """Yield a list of drop files."""
-
- drop_set = set()
- drop_files = []
-
- #Adding test asset, there's an execution block for every test asset
- for execution_block in xml_dict["execution_blocks"]:
- testasset_location = path(execution_block["asset_path"])
- asset_files = list(testasset_location.walkfiles())
-
- drop_path = path(execution_block["name"])
-
- drop_files = ((drop_path.parent, "images", execution_block["image_files"]),
- (drop_path.parent, "sisfiles", execution_block["matti_sis_files"]),
- (drop_path.parent, "mattiparameters", execution_block["matti_parameters"]),
- (drop_path.parent, execution_block["name"], asset_files))
-
- for drop_dir, sub_dir, files in drop_files:
- for file_path in files:
- if file_path != None:
-
- #Adding image files to the top level,
- #Also adding mattiparameters.xml file
- if sub_dir.lower() == "images" or sub_dir.lower() == "mattiparameters":
- drop_file = drop_dir.joinpath(sub_dir, file_path.name)
-
- #Adding sisfiles, installation of matti sisfiles is a bit different
- #than normal sisfiles
- elif sub_dir.lower() == "sisfiles":
- drop_file = drop_dir.joinpath(sub_dir, path(file_path[0]).name)
- file_path = path(file_path[0])
-
- #Adding test asset files
- else:
- temp_file = file_path.rsplit(os.sep, 1)[0]
- replace_string = testasset_location.rsplit(os.sep, 1)[0]
- drop_file = drop_dir.joinpath(sub_dir + "\\" + temp_file.replace(replace_string, ""), file_path.name)
-
- drop_file = drop_file.normpath()
- if drop_file not in drop_set:
- drop_set.add(drop_file)
- yield (drop_file, file_path.normpath())
-
-
-class MattiComponentParser(object):
- """
- Add information to the XML dictionary
- """
- def __init__(self, config):
- self.flash_images = [path(p) for p in config.flash_images]
- self.matti_parameters = [path(config.matti_parameters).normpath()]
- self.matti_sis_files = config.matti_sis_files
- self.build_drive = config.build_drive
- self.test_timeout = config.matti_timeout
- self.diamonds_build_url = config.diamonds_build_url
- self.testrun_name = config.testrun_name
- self.alias_name = config.alias_name
- self.device_type = config.device_type
- self.report_email = config.report_email
- self.email_format = config.email_format
- self.email_subject = config.email_subject
-
- self.xml_dict = {}
-
-
- def insert_pre_data(self):
- """
- Creates a dictionary for the data before
- the <execution> block starts.
- """
- self.xml_dict = dict(self.xml_dict, temp_directory=path(tempfile.mkdtemp()))
- self.xml_dict = dict(self.xml_dict, diamonds_build_url=self.diamonds_build_url)
- self.xml_dict = dict(self.xml_dict, testrun_name=self.testrun_name)
- self.xml_dict = dict(self.xml_dict, alias_name=self.alias_name)
- self.xml_dict = dict(self.xml_dict, device_type=self.device_type)
-
- def create_execution_block(self, config):
- """Parse flash images and creates execution block for matti"""
- execution_block_list = []
- block_count = 0
- for test_asset in config.test_assets:
- if os.path.exists(test_asset):
- test_plan = MattiTestPlan(config)
- block_count += 1
- execution_block_list.append(test_plan.insert_execution_block(block_count, self.flash_images, self.matti_sis_files, test_asset, self.matti_parameters))
-
-
- self.xml_dict = dict(self.xml_dict, execution_blocks=execution_block_list)
-
- def insert_post_data(self):
- """
- Creates a dictionary for the data after
- the <execution> block ends. Or, Postaction data
- """
- self.xml_dict = dict(self.xml_dict, report_email=self.report_email)
- self.xml_dict = dict(self.xml_dict, email_format=self.email_format)
- self.xml_dict = dict(self.xml_dict, email_subject=self.email_subject)
-
- return self.xml_dict
-
-def create_drop(config):
- """Create a test drop."""
- xml_dict = {}
-
- _logger.debug("initialize Matti dictionary")
- drop_parser = MattiComponentParser(config)
-
- #Inserting data for test run and global through out the dictionary
- drop_parser.insert_pre_data()
-
- #for every asset path there should be a
- #separate execution block
- drop_parser.create_execution_block(config)
-
- #Inserting reporting and email data (post actions)
- xml_dict = drop_parser.insert_post_data()
-
- generator = MattiTestDropGenerator()
-
- _logger.info("generating drop file: %s" % config.drop_file)
- generator.generate(xml_dict, output_file=config.drop_file, template_loc=config.template_loc)
-
-def to_bool(param):
- """setting a true or false based on a param value"""
- param = str(param).lower()
- if "true" == param or "t" == param or "1" == param:
- return "True"
- else:
- return "False"
-
-def main():
- """Main entry point."""
-
-
- cli = OptionParser(usage="%prog [options] PATH1 [PATH2 [PATH3 ...]]")
- cli.add_option("--ats4-enabled", help="ATS4 enabled", default="True")
- cli.add_option("--build-drive", help="Build area root drive")
- cli.add_option("--drop-file", help="Name for the final drop zip file", default="MATTIDrop.zip")
-
- cli.add_option("--minimum-flash-images", help="Minimum amount of flash images", default=2)
- cli.add_option("--flash-images", help="Paths to the flash image files", default="")
- cli.add_option("--matti-sis-files", help="Sis files location", default="")
-
- cli.add_option("--testasset-location", help="MATTI test assets location", default="")
- cli.add_option("--template-loc", help="Custom template location", default="")
- cli.add_option("--sierra-enabled", help="Enabled or disabled Sierra", default=True)
- cli.add_option("--test-profiles", help="Test profiles e.g. bat, fute", default="")
- cli.add_option("--matti-parameters", help="Location of xml file contains additional parameters for Matti", default="")
-
- cli.add_option("--matti-timeout", help="Test execution timeout value (default: %default)", default="60")
- cli.add_option("--sierra-parameters", help="Additional sierra parameters for matti task", default="")
- cli.add_option("--file-store", help="Destination path for reports.", default="")
- cli.add_option("--report-email", help="Email notification receivers", default="")
- cli.add_option("--testrun-name", help="Name of the test run", default="run")
- cli.add_option("--alias-name", help="Name of the alias", default="sut_s60")
- cli.add_option("--device-type", help="Device type (e.g. 'PRODUCT')", default="unknown")
- cli.add_option("--diamonds-build-url", help="Diamonds build url")
- cli.add_option("--email-format", help="Format of an email", default="")
- cli.add_option("--email-subject", help="Subject of an email", default="Matti Testing")
-
-
- cli.add_option("--verbose", help="Increase output verbosity", action="store_true", default=False)
-
- opts, _ = cli.parse_args()
-
- ats4_enabled = to_bool(opts.ats4_enabled)
-
- if ats4_enabled == "False":
- cli.error("MATTI tests execute on ATS4. Set property 'ats4.enabled'")
-
- if not opts.flash_images:
- cli.error("no flash image files given")
- if len(opts.flash_images.split(",")) < int(opts.minimum_flash_images):
- cli.error("Not enough flash files: %i defined, %i needed" % (len(opts.flash_images.split(",")), int(opts.minimum_flash_images) ))
-
- if opts.verbose:
- _logger.setLevel(logging.DEBUG)
- logging.basicConfig(level=logging.DEBUG)
- _ = tempfile.mkdtemp()
- config = Configuration(opts)
- create_drop(config)
-
-if __name__ == "__main__":
- main()
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/matti_template.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
-<!--
-============================================================================
-Name : matti_template.xml
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-Contains the template for the test.xml file output. The test.xml file contains
-information on the files used to create the drop file.
-============================================================================
--->
-
-<testrun>
- <metadata>
- {% if xml_dict['diamonds_build_url'] -%}
- <meta name="diamonds-buildid">{{ xml_dict['diamonds_build_url'] }}</meta>
- <meta name="diamonds-testtype">Smoke</meta>
- {% endif %}
- <meta name="name">{{ xml_dict['testrun_name'] }}</meta>
- </metadata>
-
- <agents>
- <agent alias="{{ xml_dict['alias_name'] }}">
- <property name="hardware" value="{{ xml_dict["device_type"] }}"/>
- </agent>
- </agents>
-
-
- {% for exe_block in xml_dict['execution_blocks'] -%}
- <execution defaultAgent="{{ xml_dict['alias_name'] }}">
- <initialization>
-
- {% if exe_block['image_files'] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>FlashTask</type>
- <parameters>
- {% set i = 1 %}
- {% for img in exe_block['image_files'] -%}
- <parameter name="image-{{ i }}" value="images\{{ os.path.basename(img) }}" />
- {% set i = i + 1 %}
- {% endfor -%}
- </parameters>
- </task>
- {% endif %}
-
-
- {% if exe_block['install_files'] != [] -%}
- {% for file in exe_block['install_files'] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="{{exe_block['name']}}{{ atspath.normpath(atspath.normpath(file[0]).replace(atspath.normpath(exe_block['asset_path']).rsplit("\\", 1)[0], "")) }}"/>
- <parameter name="dst" value="{{ atspath.normpath(file[1]) }}"/>
- </parameters>
- </task>
- {% endfor -%}
- {% endif %}
-
- {% if exe_block['matti_sis_files'] != [] -%}
- {% for sisfile in exe_block['matti_sis_files'] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="sisfiles\{{ os.path.basename(sisfile[0]) }}"/>
- <parameter name="dst" value="{{ sisfile[2] }}"/>
- </parameters>
- </task>
- {% endfor -%}
- {% endif %}
-
- {% for sis_file in exe_block["matti_sis_files"] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>InstallSisTask</type>
- <parameters>
- <parameter name="software-package" value="{{ sis_file[2] }}"/>
- <parameter name="timeout" value="{{ exe_block["test_timeout"] }}"/>
- <parameter name="upgrade-data " value="true"/>
- <parameter name="ignore-ocsp-warnings" value="true"/>
- <parameter name="ocsp-done" value="true"/>
- <parameter name="install-drive" value="{{ sis_file[2].split(":")[0] }}"/>
- <parameter name="overwrite-allowed" value="true"/>
- <parameter name="download-allowed" value="false"/>
- <parameter name="download-username" value="user"/>
- <parameter name="download-password" value="passwd"/>
- <parameter name="upgrade-allowed" value="true"/>
- <parameter name="optional-items-allowed" value="true"/>
- <parameter name="untrusted-allowed" value="true"/>
- <parameter name="package-info-allowed" value="true"/>
- <parameter name="user-capabilities-granted" value="true"/>
- <parameter name="kill-app" value="true"/>
- </parameters>
- </task>
- {%- endfor -%}
-
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>RebootTask</type>
- <parameters/>
- </task>
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>CreateDirTask</type>
- <parameters>
- <parameter value="c:\logs\testability" name="dir"/>
- </parameters>
- </task>
- </initialization>
-
- {% for task_file in exe_block["matti_task_files"] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>MATTITask</type>
- <parameters>
- <parameter value="{{ exe_block["name"] }}\matti_testcases\" name="script"/>
- <parameter value="{{ exe_block["name"] }}\matti_testcases\mattiparameters\{{ os.path.basename(exe_block["matti_parameters"][0]) }}" name="xml"/>
- <parameter value="{{ exe_block['test_timeout'] }}" name="timeout"/>
- <parameter value="{{ exe_block["sierra_enabled"] }}" name="sierra"/>
- <parameter value="{{ exe_block["sierra_parameters"] }} -e %TEST_RUN_SANDBOX%/{{ exe_block["name"] }}/{{ task_file }} test_unit" name="executable-parameters"/>
- </parameters>
- </task>
- {% endfor -%}
-
- <finalization>
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>CleanupTask</type>
- <parameters>
- <parameter value="true" name="upload-files"/>
- </parameters>
- </task>
- </finalization>
- </execution>
- {% endfor -%}
-
- <postActions>
- <action>
- <type>EmailAction</type>
- <parameters>
- <parameter value="{{ xml_dict['email_subject'] }}" name="subject"/>
- <parameter value="{{ xml_dict['report_email'] }}" name="to"/>
- <parameter value="{{ xml_dict['email_format'] }}" name="format"/>
- </parameters>
- </action>
- </postActions>
-
-</testrun>
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/parsers.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/parsers.py Mon Oct 18 10:23:52 2010 +0100
@@ -222,7 +222,7 @@
_logger.debug(itm)
for itm in test_cases:
_logger.debug(itm)
- _logger.error(path_to_bld + ' test_sets are empty')
+ _logger.error(path_to_bld + ' - test sets are empty')
return test_sets
@@ -553,7 +553,7 @@
elif harness is "STIF":
dll_type = "executable"
- except:
+ except IOError:
traceback.print_exc()
else:
returnvals = None
@@ -596,7 +596,6 @@
self.drive = drive
self._files = []
self.pkg_files = []
- self.pkg_file_path = None
self.exclude = ""
self.location = None
self.bldpath = bldpath
@@ -638,7 +637,7 @@
return self.pkg_files
- def get_data_files(self, location = [], drive = "", exclude = ""):
+ def get_data_files(self, location=None, drive="", exclude=""):
"""
Returns data files, source and destination of the files to be installed
on the phone
@@ -656,7 +655,9 @@
if pkg file is not given, the function will try to find the file(s) on the given location with extension ".pkg"
"""
-
+ if location == None:
+ location = []
+
self.drive = drive
self.exclude = exclude
self._files = []
@@ -681,15 +682,13 @@
return self.read_pkg_file(self._files)
- def __map_pkg_path(self, pkg_line, pkg_file_path, pkg_file):
+ def __map_pkg_path(self, pkg_line, pkg_file_path, pkg_file, test_type, libraries):
"""Parse package file to get the src and dst paths" for installing files"""
- mmp_parser = MmpFileParser(self.bldpath)
ext = ""
val1 = ""
val2 = ""
map_src = ""
map_dst = ""
- self.pkg_file_path = pkg_file_path
if not self.exclude == "":
if re.search(r'%s' % self.exclude, pkg_line) is not None:
@@ -712,19 +711,20 @@
if "$(target)" in val1.lower() and self.build_target is not None:
val1 = val1.lower().replace("$(target)", self.build_target)
- #For MATTI PKG files in which location of the data files are unknown or can be changed
+ #For TDriver PKG files in which location of the data files are unknown or can be changed
if "[PKG_LOC]" in val1.upper():
- val1 = val1.replace("[PKG_LOC]", self.pkg_file_path)
+ val1 = val1.replace("[PKG_LOC]", pkg_file_path)
- if os.path.exists(val1):
- map_src = os.path.abspath(val1)
+ if os.path.isabs(os.path.normpath(val1)):
+ map_src = os.path.normpath(os.path.join(self.drive, val1))
+ elif re.search(r"\A\w", val1, 1):
+ map_src = os.path.normpath(os.path.join(pkg_file_path + os.sep, os.path.normpath(val1)))
else:
- if os.path.isabs(os.path.normpath(val1)):
- map_src = os.path.normpath(os.path.join(self.drive, val1))
- elif re.search(r"\A\w", val1, 1):
- map_src = os.path.normpath(os.path.join(self.pkg_file_path + os.sep, os.path.normpath(val1)))
- else:
- map_src = os.path.normpath(os.path.join(self.pkg_file_path, val1))
+ map_src = os.path.normpath(os.path.join(pkg_file_path, val1))
+
+ if os.sep == '\\':
+ if os.path.splitunc(val1)[0].strip() != "":
+ map_src = os.path.normpath(val1)
map_dst = os.path.normpath(val2)
else:
map_src, map_dst = val1, val2
@@ -739,14 +739,6 @@
ext = indx[1]
else:
_logger.warning("File extension not found for " + map_dst)
-
- _test_type_ = ""
- _target_filename_ = ""
-
- _target_filename_ = mmp_parser.get_target_filename(self.pkg_file_path)
- _test_type_ = mmp_parser.get_dll_type(self.pkg_file_path)
- _harness_ = mmp_parser.get_harness(self.pkg_file_path)
- _libraries_ = mmp_parser.get_libraries(self.pkg_file_path)
if ext == "ini":
file_type = "engine_ini"
@@ -754,24 +746,24 @@
file_type = "conf"
elif ext == "dll":
#adding type of dll (executable or dependent), if file type is dll
- if _test_type_ == "dependent":
- file_type = "data" + ":%s" % _test_type_
+ if test_type == "dependent":
+ file_type = "data" + ":%s" % test_type
else:
- if "qttest.lib" in _libraries_:
+ if "qttest.lib" in libraries:
file_type = "data" + ":qt:dependent"
else:
- if 'symbianunittestfw.lib' in _libraries_:
+ if 'symbianunittestfw.lib' in libraries:
file_type = "testmodule:sut"
else:
file_type = "testmodule"
- elif ext == 'exe' and 'rtest' in _libraries_:
+ elif ext == 'exe' and 'rtest' in libraries:
file_type = "testmodule:rtest"
elif ext == "exe":
- if _test_type_ == "dependent":
- file_type = "data" + ":%s" % _test_type_
+ if test_type == "dependent":
+ file_type = "data" + ":%s" % test_type
else:
- if "qttest.lib" in _libraries_:
+ if "qttest.lib" in libraries:
file_type = "testmodule:qt"
else:
file_type = "testmodule"
@@ -783,7 +775,7 @@
elif ext == "pmd":
file_type = "pmd"
elif ext == "script":
- if "testframeworkclient.lib" in _libraries_:
+ if "testframeworkclient.lib" in libraries:
file_type = "testscript:mtf:testframework.exe"
else:
file_type = "testscript:testexecute.exe"
@@ -796,7 +788,7 @@
elif exename == 'testexecute.exe':
file_type = "testscript:" + exename
else:
- if "testframeworkclient.lib" in _libraries_:
+ if "testframeworkclient.lib" in libraries:
file_type = "testscript:mtf:" + exename
else:
file_type = "testscript:" + exename
@@ -817,8 +809,8 @@
pkg_files = [pkg_files]
for pkg_file in pkg_files:
- if not os.path.exists( pkg_file ):
- _logger.error("No PKG -file in path specified")
+ if not os.path.exists(pkg_file):
+ _logger.error(pkg_file + ' not found')
continue
else:
file1 = codecs.open(pkg_file, 'r', 'utf16')
@@ -829,11 +821,13 @@
lines = file1.readlines()
pkg_file_path = path((pkg_file.rsplit(os.sep, 1))[0])
+
+ mmp_parser = MmpFileParser(self.bldpath)
+ test_type = mmp_parser.get_dll_type(pkg_file_path)
+ libraries = mmp_parser.get_libraries(pkg_file_path)
for line in lines:
- pkg_path = self.__map_pkg_path(line, pkg_file_path, os.path.basename(pkg_file))
- if pkg_path is None:
- continue
- else:
+ pkg_path = self.__map_pkg_path(line, pkg_file_path, os.path.basename(pkg_file), test_type, libraries)
+ if pkg_path:
pkg_paths.append(pkg_path)
return pkg_paths
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/tdriver.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,454 @@
+# -*- encoding: latin-1 -*-
+
+#============================================================================
+#Name : tdriver.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""TDriver test drop generation."""
+
+
+#W0142 => * and ** were used
+#R* removed during refactoring
+
+from optparse import OptionParser
+from xml.etree import ElementTree as et
+import pkg_resources
+from path import path # pylint: disable=F0401
+import logging
+import os
+import re
+import tempfile
+import zipfile
+import amara
+import ntpath as atspath
+import jinja2 # pylint: disable=F0401
+import ats3.parsers
+
+_logger = logging.getLogger('tdriver')
+
+# Shortcuts
+E = et.Element
+SE = et.SubElement
+
+class Configuration(object):
+ """
+ TDriver drop generation configuration.
+ """
+
+ def __init__(self, opts):
+ """
+ Initialize from optparse configuration options.
+ """
+
+ self._opts = opts
+ # Customize some attributes from how optparse leaves them.
+ self.build_drive = path(self._opts.build_drive)
+ self.file_store = path(self._opts.file_store)
+ self.flash_images = self.split_paths(self._opts.flash_images)
+ self.tdriver_sis_files = self.split_paths(self._opts.tdriver_sis_files)
+ self.test_assets = self.split_paths(self._opts.testasset_location)
+ self.template_loc = path(self._opts.template_loc)
+
+
+ def split_paths(self, arg, delim=","):
+ """
+ Split the string by delim, removing extra whitespace.
+ """
+ return [path(part.strip())
+ for part in arg.split(delim) if part.strip()]
+
+ def __getattr__(self, attr):
+ return getattr(self._opts, attr)
+
+ def __str__(self):
+ dump = "Configuration:\n"
+ seen = set()
+ for key, value in vars(self).items():
+ if not key.startswith("_"):
+ dump += "\t%s = %s\n" % (key, value)
+ seen.add(key)
+ for key, value in vars(self._opts).items():
+ if key not in seen:
+ dump += "\t%s = %s\n" % (key, value)
+ seen.add(key)
+ return dump
+
+
+class TDriverTestPlan(object):
+ """ Tells TDriver server what to test and how.
+
+ The TDriver test plan from which the test.xml file can be written. The test
+ plan requires TestAsset(s) to perform the tests
+ """
+
+ def __init__(self, config):
+ self.pkg_parser = ats3.parsers.PkgFileParser()
+ self.file_store = config.file_store
+ self.tdriver_timeout = config.tdriver_timeout
+ self.test_profiles = config.test_profiles
+ self.tdrunner_enabled = to_bool(config.tdrunner_enabled)
+ self.tdrunner_parameters = config.tdrunner_parameters
+ self.test_profiles = config.test_profiles.strip().split(",")
+ self.build_drive = config.build_drive
+ self.tdriver_sis_files = ""
+ self.install_files = []
+ self.tdriver_task_files = None
+ self.ctc_enabled = 'False'
+ if hasattr(config, 'ctc_enabled'):
+ self.ctc_enabled = to_bool(config.ctc_enabled)
+
+ def insert_execution_block(self, block_count=1, image_files=None, tdriver_sis_files=None, test_asset_path=None, tdriver_parameters=None):
+ """
+ Insert TDriver tasks and test data files into execution block
+ """
+ self.tdriver_sis_files = tdriver_sis_files
+ temp_sis_files = []
+ if self.tdriver_sis_files != None:
+ for sis_file in self.tdriver_sis_files:
+ temp_sis_files.append(sis_file.split("#"))
+
+ test_asset_path = test_asset_path
+ if image_files is None:
+ image_files = []
+
+ exe_dict = dict(name="exe%d" % block_count, asset_path=test_asset_path, image_files=image_files, tdriver_sis_files=temp_sis_files, ctc_enabled=self.ctc_enabled)
+ exe_dict = dict(exe_dict, test_timeout=self.tdriver_timeout)
+ exe_dict = dict(exe_dict, tdriver_parameters=tdriver_parameters)
+ exe_dict = dict(exe_dict, tdrunner_enabled=self.tdrunner_enabled.lower())
+ exe_dict = dict(exe_dict, tdrunner_parameters=self.tdrunner_parameters)
+
+
+ self.tdriver_task_files = self._create_tdriver_task_files_list(test_asset_path)
+ exe_dict = dict(exe_dict, tdriver_task_files=self.tdriver_task_files)
+
+ self.install_files = self.create_install_files_list(test_asset_path)
+ exe_dict = dict(exe_dict, install_files=self.install_files)
+ return exe_dict
+
+ def _create_tdriver_task_files_list(self, asset_path=None):
+ """
+ Creates list of files needed to include in TDriver execution tasks
+ if tdrunner.enabled then
+ profiles (.sip files) are included
+ else
+ all ruby (.rb) files are included
+ """
+
+ profiles = []
+ rb_files = []
+
+ #If TDrunner engine is enabled (set to True)
+ if self.tdrunner_enabled.lower() == "true":
+ profile_path = path(os.path.join(asset_path, "profile"))
+ if os.path.exists(profile_path):
+ for profile_name in self.test_profiles:
+ item = list(profile_path.walkfiles("%s.sip"%profile_name.lower().strip()))
+ if len(item) > 0:
+ #profiles.append(os.path.join(profile_path, item[0]))
+ profiles.append(asset_path.rsplit(os.sep, 1)[1] + "/" + "profile" + "/" + item[0].rsplit(os.sep, 1)[1])
+ return profiles
+ else:
+ _logger.warning(profile_path + ' not found')
+ else: #If TDruner engine is not enabled (set to False)
+ if os.path.exists(asset_path):
+ #returns list(asset_path.walkfiles("*.rb")):
+ for item in list(asset_path.walkfiles("*.rb")):
+ rb_files.append(asset_path.rsplit(os.sep, 1)[1] + "/" + item.rsplit(os.sep, 1)[1])
+ # Sorting the result, so we ensure they are always in similar order.
+ rb_files.sort()
+ return rb_files
+ else:
+ _logger.warning(asset_path + ' not found')
+
+ def create_install_files_list(self, asset_path=None):
+ """
+ Collects all the .pkg files and extract data
+ Creates a list of src, dst files.
+ """
+ pkg_files = []
+ if os.path.exists(asset_path):
+ pkg_files = list(asset_path.walkfiles("*.pkg"))
+ return self.pkg_parser.get_data_files(pkg_files, self.build_drive)
+ else:
+ return None
+
+ def __getitem__(self, key):
+ return self.__dict__[key]
+
+
+
+class TDriverTestDropGenerator(object):
+ """
+ Generate test drop zip file for TDriver.
+
+ Generates drop zip files file from Test Assets. The main
+ responsibility of this class is to create testdrop and test.xml
+ file and build a zip file for the TDriver drop.
+
+ """
+
+ def __init__(self):
+ self.drop_path_root = path("TDriverDrop")
+ self.drop_path = None
+ self.defaults = {}
+ self.CTC_LOG_DIR = r"c:\data\ctc"
+
+ def generate(self, xml_dict, output_file, template_loc=None):
+ """Generate a test drop file."""
+ xml = self.generate_xml(xml_dict, template_loc)
+ return self.generate_drop(xml_dict, xml, output_file)
+
+ def generate_drop(self, xml_dict, xml, output_file):
+ """Generate test drop zip file."""
+
+ zfile = zipfile.ZipFile(output_file, "w", zipfile.ZIP_DEFLATED)
+ try:
+ for drop_file, src_file in self.drop_files(xml_dict):
+
+ _logger.info(" + Adding: %s" % src_file.strip())
+ try:
+ zfile.write(src_file.strip(), drop_file.encode('utf-8'))
+ except OSError, expr:
+ _logger.error(expr)
+ doc = amara.parse(et.tostring(xml.getroot()))
+ _logger.debug("XML output: %s" % doc.xml(indent=u"yes", encoding="ISO-8859-1"))
+ zfile.writestr("test.xml", doc.xml(indent="yes", encoding="ISO-8859-1"))
+ finally:
+ _logger.info("TDriver testdrop created successfully!")
+ zfile.close()
+
+ def generate_xml(self, xml_dict, template_loc):
+ """ generate an XML file"""
+ template_loc = path(template_loc).normpath()
+ loader = jinja2.ChoiceLoader([jinja2.PackageLoader(__package__, 'templates')])
+ env = jinja2.Environment(loader=loader)
+ if template_loc is None or not ".xml" in template_loc.lower():
+ template = env.from_string(pkg_resources.resource_string(__name__, 'tdriver_template.xml'))# pylint: disable=E1101
+ else:
+ template = env.from_string(open(template_loc).read())# pylint: disable=E1101
+
+ xmltext = template.render(xml_dict=xml_dict, test_plan=xml_dict, os=os, atspath=atspath, atsself=self).encode('ISO-8859-1')
+ _logger.info(xmltext)
+ return et.ElementTree(et.XML(xmltext))
+
+
+ def generate_testasset_zip(self, xml_dict, output_file=None):
+ """Generate TestAsset.zip for the TDriver server"""
+ filename = xml_dict["temp_directory"].joinpath(r"TestAsset.zip")
+
+ if output_file != None:
+ filename = output_file
+
+ for exe_block in xml_dict["execution_blocks"]:
+ testasset_location = path(exe_block["asset_path"])
+
+ zfile = zipfile.ZipFile(filename, "w", zipfile.ZIP_DEFLATED)
+ try:
+ for file_ in list(testasset_location.walkfiles()):
+ file_mod = file_.replace(testasset_location, "")
+ zfile.write(file_, file_mod.encode('utf-8'))
+ finally:
+ zfile.close()
+ return filename
+
+ def drop_files(self, xml_dict):
+ """Yield a list of drop files."""
+
+ drop_set = set()
+ drop_files = []
+
+ #Adding test asset, there's an execution block for every test asset
+ for execution_block in xml_dict["execution_blocks"]:
+ testasset_location = path(execution_block["asset_path"])
+ asset_files = list(testasset_location.walkfiles())
+
+ drop_path = path(execution_block["name"])
+
+ drop_files = ((drop_path.parent, "images", execution_block["image_files"]),
+ (drop_path.parent, "sisfiles", execution_block["tdriver_sis_files"]),
+ (drop_path.parent, "tdriverparameters", execution_block["tdriver_parameters"]),
+ (drop_path.parent, execution_block["name"], asset_files))
+
+ for drop_dir, sub_dir, files in drop_files:
+ for file_path in files:
+ if file_path != None:
+
+ #Adding image files to the top level,
+ #Also adding tdriverparameters.xml file
+ if sub_dir.lower() == "images" or sub_dir.lower() == "tdriverparameters":
+ drop_file = drop_dir.joinpath(sub_dir, file_path.name)
+
+ #Adding sisfiles, installation of tdriver sisfiles is a bit different
+ #than normal sisfiles
+ elif sub_dir.lower() == "sisfiles":
+ drop_file = drop_dir.joinpath(sub_dir, path(file_path[0]).name)
+ file_path = path(file_path[0])
+
+ #Adding test asset files
+ else:
+ temp_file = file_path.rsplit(os.sep, 1)[0]
+ replace_string = testasset_location.rsplit(os.sep, 1)[0]
+ drop_file = drop_dir.joinpath(sub_dir + "\\" + temp_file.replace(replace_string, ""), file_path.name)
+
+ drop_file = drop_file.normpath()
+ if drop_file not in drop_set:
+ drop_set.add(drop_file)
+ yield (drop_file, file_path.normpath())
+
+
+class TDriverComponentParser(object):
+ """
+ Add information to the XML dictionary
+ """
+ def __init__(self, config):
+ self.flash_images = [path(p) for p in config.flash_images]
+ self.tdriver_parameters = [path(config.tdriver_parameters).normpath()]
+ self.tdriver_sis_files = config.tdriver_sis_files
+ self.build_drive = config.build_drive
+ self.test_timeout = config.tdriver_timeout
+ self.diamonds_build_url = config.diamonds_build_url
+ self.testrun_name = config.testrun_name
+ self.alias_name = config.alias_name
+ self.device_type = config.device_type
+ self.report_email = config.report_email
+ self.email_format = config.email_format
+ self.email_subject = config.email_subject
+ self.file_store = config.file_store
+
+ self.xml_dict = {}
+
+
+ def insert_pre_data(self):
+ """
+ Creates a dictionary for the data before
+ the <execution> block starts.
+ """
+ self.xml_dict = dict(self.xml_dict, temp_directory=path(tempfile.mkdtemp()))
+ self.xml_dict = dict(self.xml_dict, diamonds_build_url=self.diamonds_build_url)
+ self.xml_dict = dict(self.xml_dict, testrun_name=self.testrun_name)
+ self.xml_dict = dict(self.xml_dict, alias_name=self.alias_name)
+ self.xml_dict = dict(self.xml_dict, device_type=self.device_type)
+
+ def create_execution_block(self, config):
+ """Parse flash images and creates execution block for TDriver"""
+ execution_block_list = []
+ block_count = 0
+ for test_asset in config.test_assets:
+ if os.path.exists(test_asset):
+ test_plan = TDriverTestPlan(config)
+ block_count += 1
+ execution_block_list.append(test_plan.insert_execution_block(block_count, self.flash_images, self.tdriver_sis_files, test_asset, self.tdriver_parameters))
+
+
+ self.xml_dict = dict(self.xml_dict, execution_blocks=execution_block_list)
+
+ def insert_post_data(self):
+ """
+ Creates a dictionary for the data after
+ the <execution> block ends. Or, Postaction data
+ """
+ self.xml_dict = dict(self.xml_dict, report_email=self.report_email)
+ self.xml_dict = dict(self.xml_dict, email_format=self.email_format)
+ self.xml_dict = dict(self.xml_dict, email_subject=self.email_subject)
+ self.xml_dict = dict(self.xml_dict, report_location=self.file_store)
+
+ return self.xml_dict
+
+def create_drop(config):
+ """Create a test drop."""
+ xml_dict = {}
+
+ _logger.debug("initialize TDriver dictionary")
+ drop_parser = TDriverComponentParser(config)
+
+ #Inserting data for test run and global through out the dictionary
+ drop_parser.insert_pre_data()
+
+ #for every asset path there should be a
+ #separate execution block
+ drop_parser.create_execution_block(config)
+
+ #Inserting reporting and email data (post actions)
+ xml_dict = drop_parser.insert_post_data()
+
+ generator = TDriverTestDropGenerator()
+
+ _logger.info("generating drop file: %s" % config.drop_file)
+ generator.generate(xml_dict, output_file=config.drop_file, template_loc=config.template_loc)
+
+def to_bool(param):
+ """setting a true or false based on a param value"""
+ param = str(param).lower()
+ if "true" == param or "t" == param or "1" == param:
+ return "True"
+ else:
+ return "False"
+
+def main():
+ """Main entry point."""
+
+
+ cli = OptionParser(usage="%prog [options] PATH1 [PATH2 [PATH3 ...]]")
+ cli.add_option("--ats4-enabled", help="ATS4 enabled", default="True")
+ cli.add_option("--build-drive", help="Build area root drive")
+ cli.add_option("--drop-file", help="Name for the final drop zip file", default="TDriverDrop.zip")
+
+ cli.add_option("--minimum-flash-images", help="Minimum amount of flash images", default=2)
+ cli.add_option("--flash-images", help="Paths to the flash image files", default="")
+ cli.add_option("--tdriver-sis-files", help="Sis files location", default="")
+
+ cli.add_option("--testasset-location", help="TDriver test assets location", default="")
+ cli.add_option("--template-loc", help="Custom template location", default="")
+ cli.add_option("--tdrunner-enabled", help="Enabled or disabled TDrunner", default=True)
+ cli.add_option("--test-profiles", help="Test profiles e.g. bat, fute", default="")
+ cli.add_option("--tdriver-parameters", help="Location of xml file contains additional parameters for TDriver", default="")
+
+ cli.add_option("--tdriver-timeout", help="Test execution timeout value (default: %default)", default="60")
+ cli.add_option("--tdrunner-parameters", help="Additional TDrunner parameters for TDriver task", default="")
+ cli.add_option("--file-store", help="Destination path for reports.", default="")
+ cli.add_option("--report-email", help="Email notification receivers", default="")
+ cli.add_option("--testrun-name", help="Name of the test run", default="run")
+ cli.add_option("--alias-name", help="Name of the alias", default="sut_s60")
+ cli.add_option("--device-type", help="Device type (e.g. 'PRODUCT')", default="unknown")
+ cli.add_option("--diamonds-build-url", help="Diamonds build url")
+ cli.add_option("--email-format", help="Format of an email", default="")
+ cli.add_option("--email-subject", help="Subject of an email", default="TDriver Testing")
+ cli.add_option("--ctc-enabled", help="CTC enabled", default="False")
+
+ cli.add_option("--verbose", help="Increase output verbosity", action="store_true", default=False)
+
+ opts, _ = cli.parse_args()
+
+ ats4_enabled = to_bool(opts.ats4_enabled)
+
+ if ats4_enabled == "False":
+ cli.error("TDriver tests execute on ATS4. Set property 'ats4.enabled'")
+
+ if not opts.flash_images:
+ cli.error("no flash image files given")
+ if len(opts.flash_images.split(",")) < int(opts.minimum_flash_images):
+ cli.error("Not enough flash files: %i defined, %i needed" % (len(opts.flash_images.split(",")), int(opts.minimum_flash_images) ))
+
+ if opts.verbose:
+ _logger.setLevel(logging.DEBUG)
+ logging.basicConfig(level=logging.DEBUG)
+ config = Configuration(opts)
+ create_drop(config)
+
+if __name__ == "__main__":
+ main()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/tdriver_template.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
+<!--
+============================================================================
+Name : tdriver_template.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Contains the template for the test.xml file output. The test.xml file contains
+information on the files used to create the drop file.
+============================================================================
+-->
+
+{% import 'ats4_macros.xml' as macros with context %}
+
+<testrun>
+ <metadata>
+ {% if xml_dict['diamonds_build_url'] -%}
+ <meta name="diamonds-buildid">{{ xml_dict['diamonds_build_url'] }}</meta>
+ <meta name="diamonds-testtype">Smoke</meta>
+ {% endif %}
+ <meta name="name">{{ xml_dict['testrun_name'] }}</meta>
+ </metadata>
+
+ <agents>
+ <agent alias="{{ xml_dict['alias_name'] }}">
+ <property name="hardware" value="{{ xml_dict["device_type"] }}"/>
+ </agent>
+ </agents>
+
+
+ {% for exe_block in xml_dict['execution_blocks'] -%}
+ <execution defaultAgent="{{ xml_dict['alias_name'] }}">
+ <initialization>
+
+ {% if exe_block['image_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FlashTask</type>
+ <parameters>
+ {% set i = 1 %}
+ {% for img in exe_block['image_files'] -%}
+ <parameter name="image-{{ i }}" value="images\{{ os.path.basename(img) }}" />
+ {% set i = i + 1 %}
+ {% endfor -%}
+ </parameters>
+ </task>
+ {% endif %}
+
+ {% if exe_block['install_files'] != [] -%}
+ {% for file in exe_block['install_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="{{exe_block['name']}}{{ atspath.normpath(atspath.normpath(file[0]).replace(atspath.normpath(exe_block['asset_path']).rsplit("\\", 1)[0], "")) }}"/>
+ <parameter name="dst" value="{{ atspath.normpath(file[1]) }}"/>
+ </parameters>
+ </task>
+ {% endfor -%}
+ {% endif %}
+
+ {% if exe_block['tdriver_sis_files'] != [] -%}
+ {% for sisfile in exe_block['tdriver_sis_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="sisfiles\{{ os.path.basename(sisfile[0]) }}"/>
+ <parameter name="dst" value="{{ sisfile[2] }}"/>
+ </parameters>
+ </task>
+ {% endfor -%}
+ {% endif %}
+
+ {% for sis_file in exe_block["tdriver_sis_files"] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>InstallSisTask</type>
+ <parameters>
+ <parameter name="software-package" value="{{ sis_file[2] }}"/>
+ <parameter name="timeout" value="{{ exe_block["test_timeout"] }}"/>
+ <parameter name="upgrade-data" value="true"/>
+ <parameter name="ignore-ocsp-warnings" value="true"/>
+ <parameter name="ocsp-done" value="true"/>
+ <parameter name="install-drive" value="{{ sis_file[2].split(":")[0] }}"/>
+ <parameter name="overwrite-allowed" value="true"/>
+ <parameter name="download-allowed" value="false"/>
+ <parameter name="download-username" value="user"/>
+ <parameter name="download-password" value="passwd"/>
+ <parameter name="upgrade-allowed" value="true"/>
+ <parameter name="optional-items-allowed" value="true"/>
+ <parameter name="untrusted-allowed" value="true"/>
+ <parameter name="package-info-allowed" value="true"/>
+ <parameter name="user-capabilities-granted" value="true"/>
+ <parameter name="kill-app" value="true"/>
+ </parameters>
+ </task>
+ {%- endfor -%}
+
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>RebootTask</type>
+ <parameters/>
+ </task>
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>CreateDirTask</type>
+ <parameters>
+ <parameter value="c:\logs\testability" name="dir"/>
+ </parameters>
+ </task>
+
+ {% if exe_block["ctc_enabled"] == "True" -%}
+ {{ macros.ctc_initialization(exe_block) }}
+ {%- endif %}
+ </initialization>
+
+ {% if exe_block["tdriver_task_files"] -%}
+ {% for task_file in exe_block["tdriver_task_files"] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>TestabilityTask</type>
+ <parameters>
+ <parameter value="{{ exe_block["name"] }}\tdriver_testcases\" name="script"/>
+ <parameter value="{{ exe_block["name"] }}\tdriver_testcases\tdriverparameters\{{ os.path.basename(exe_block["tdriver_parameters"][0]) }}" name="xml"/>
+ <parameter value="{{ exe_block['test_timeout'] }}" name="timeout"/>
+ <parameter value="{{ exe_block["tdrunner_enabled"] }}" name="tdrunner"/>
+ <parameter value="{{ exe_block["tdrunner_parameters"] }} -e %TEST_RUN_SANDBOX%/{{ exe_block["name"] }}/{{ task_file }} test_unit" name="executable-parameters"/>
+ </parameters>
+ </task>
+ {% endfor -%}
+ {% endif %}
+
+ <finalization>
+ {% if exe_block["ctc_enabled"] == "True" -%}
+ {{ macros.ctc_finalization(exe_block) }}
+ {%- endif %}
+
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>CleanupTask</type>
+ <parameters>
+ <parameter value="true" name="upload-files"/>
+ </parameters>
+ </task>
+ </finalization>
+ </execution>
+ {% endfor -%}
+
+ <postActions>
+ <action>
+ <type>EmailAction</type>
+ <parameters>
+ <parameter value="{{ xml_dict['email_subject'] }}" name="subject"/>
+ <parameter value="{{ xml_dict['report_email'] }}" name="to"/>
+ <parameter value="{{ xml_dict['email_format'] }}" name="format"/>
+ </parameters>
+ </action>
+ {% if xml_dict['report_location'] -%}
+ <action>
+ <type>FileStoreAction</type>
+ <parameters>
+ <parameter value="{{ xml_dict['report_location'] }}\%START_DATE%_%START_TIME%_%SERVER_TOKEN%" name="dst"/>
+ <parameter value="true" name="overwrite"/>
+ </parameters>
+ </action>
+ {% endif %}
+ {% if xml_dict['diamonds_build_url'] -%}
+ <action>
+ <type>DiamondsAction</type>
+ {% if xml_dict['execution_blocks'] != [] and xml_dict['execution_blocks'][0]["ctc_enabled"] == "True" -%}
+ <parameters>
+ <parameter value="true" name="send-ctc-data" />
+ </parameters>
+ {%- endif %}
+ </action>
+ {%- endif %}
+ </postActions>
+
+</testrun>
--- a/buildframework/helium/sf/python/pythoncore/lib/ats3/templates/ats4_macros.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ats3/templates/ats4_macros.xml Mon Oct 18 10:23:52 2010 +0100
@@ -19,7 +19,7 @@
============================================================================
-->
-{% macro ctc_initialization() -%}
+{% macro ctc_initialization(test_plan) -%}
<task>
<type>CreateDirTask</type>
<parameters>
@@ -35,7 +35,7 @@
</task>
{%- endmacro %}
-{% macro ctc_finalization(setd) -%}
+{% macro ctc_finalization(test_plan) -%}
<task>
<type>NonTestExecuteTask</type>
<parameters>
@@ -68,6 +68,7 @@
{% macro generate_runsteps_stif(setd) -%}
{% set ini_file = atsself.stif_init_file(setd['src_dst']) %}
{% if ini_file -%}
+ {% set ini_file_module_name = atsself.stifmodulename(ini_file[0]) %}
{% if test_plan['hti'] == 'True' -%}
<task>
<type>StifRunCasesTask</type>
@@ -90,7 +91,8 @@
</parameters>
</task>
{%- endif %}
- {% else -%}
+ {%- endif %}
+
{% for file in setd['src_dst'] -%}
{% if setd["test_harness"] == "STIF" or setd["test_harness"] == "STIFUNIT" -%}
{% if file[2] == "conf" and ".dll" not in file[1].lower() -%}
@@ -98,10 +100,17 @@
<task>
<type>StifRunCasesTask</type>
<parameters>
+ {% if ini_file_module_name.upper() == 'TEFTESTMODULE' -%}
+ <parameter name="module" value="{{ ini_file_module_name }}"/>
+ {% else -%}
<parameter name="module" value="TESTSCRIPTER"/>
+ {%- endif %}
<parameter name="filter" value="*"/>
<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
<parameter name="testcase-file" value="{{ file[1] }}"/>
+ {% if ini_file_module_name.upper() == 'TEFTESTMODULE' and test_plan['ats_stf_enabled'].lower() == "true" -%}
+ <parameter name="result-file" value="{{ atsself.AtsInterface_LOG_DIR }}\{{ ini_file_module_name }}.xml" />
+ {%- endif %}
</parameters>
</task>
{% else -%}
@@ -110,8 +119,13 @@
<parameters>
<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
<parameter name="file" value="atsinterface.exe" />
+ {% if ini_file_module_name.upper() == 'TEFTESTMODULE' -%}
+ <parameter name="parameters" value="-testmodule {{ ini_file_module_name }}" />
+ <parameter name="result-file" value="{{ atsself.AtsInterface_LOG_DIR }}\{{ ini_file_module_name }}.xml" />
+ {% else -%}
<parameter name="parameters" value="-testmodule TESTSCRIPTER" />
<parameter name="result-file" value="{{ atsself.AtsInterface_LOG_DIR }}\TESTSCRIPTER.xml" />
+ {%- endif %}
<parameter name="result-download-retry-count" value="1" />
<parameter name="result-download-reboot-retry-count" value="1" />
</parameters>
@@ -123,7 +137,7 @@
<task>
<type>StifRunCasesTask</type>
<parameters>
- <parameter name="module" value="{{ os.path.basename(file[1]) }}"/>
+ <parameter name="module" value="{{ atspath.basename(file[1]) }}"/>
<parameter name="filter" value="*"/>
<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
</parameters>
@@ -144,11 +158,13 @@
{%- endif %}
{%- endif %}
{%- endfor %}
- {%- endif %}
{%- endmacro %}
{% macro generate_runsteps_stif_single_set(setd) -%}
{% if setd["engine_ini_file"] != None -%}
+
+ {% set ini_file_module_name = atsself.stifmodulename(setd["engine_ini_file"]) %}
+
{% if test_plan['hti'] == 'True' -%}
<task>
<type>StifRunCasesTask</type>
@@ -171,16 +187,24 @@
</parameters>
</task>
{%- endif %}
- {% elif setd["config_files"] != [] -%}
+ {%- endif %}
+ {% if setd["config_files"] != [] -%}
{% for config_file in setd["config_files"] -%}
{% if test_plan['hti'] == 'True' -%}
<task>
<type>StifRunCasesTask</type>
<parameters>
+ {% if ini_file_module_name.upper() == 'TEFTESTMODULE' -%}
+ <parameter name="module" value="{{ ini_file_module_name }}"/>
+ {% else -%}
<parameter name="module" value="TESTSCRIPTER"/>
+ {%- endif %}
<parameter name="filter" value="*"/>
<parameter name="timeout" value="{{ test_plan["test_timeout"] }}"/>
<parameter name="testcase-file" value="e:\testing\conf\{{ os.path.basename(config_file) }}"/>
+ {% if ini_file_module_name.upper() == 'TEFTESTMODULE' and test_plan['ats_stf_enabled'].lower() == "true" -%}
+ <parameter name="result-file" value="e:\testing\conf\{{ os.path.basename(config_file) }}.xml" />
+ {%- endif %}
</parameters>
</task>
{% else -%}
@@ -223,4 +247,4 @@
{%- endif %}
{%- endfor %}
{%- endif %}
-{%- endmacro %}
\ No newline at end of file
+{%- endmacro %}
--- a/buildframework/helium/sf/python/pythoncore/lib/atsant.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/atsant.py Mon Oct 18 10:23:52 2010 +0100
@@ -56,7 +56,7 @@
return None
if noncust:
return noncust
- raise Exception('iconfig not found in ' + self.imagesdir)
+ raise IOError('iconfig not found in ' + self.imagesdir)
def getimage(self, name):
"""get image"""
@@ -64,7 +64,7 @@
for fname in files:
if fname.lower() == name.lower():
return os.path.join(root, fname)
- raise Exception(name + ' not found in ' + self.imagesdir)
+ raise IOError(name + ' not found in ' + self.imagesdir)
def findimages(self):
"""find images"""
@@ -82,10 +82,10 @@
if os.path.exists(image):
output = output + image + ','
else:
- raise Exception(image + ' not found')
+ raise IOError(image + ' not found')
else:
if imagetype == 'core':
- raise Exception(imagetypename + '_FLASH not found in iconfig.xml in ' + self.imagesdir)
+ raise IOError(imagetypename + '_FLASH not found in iconfig.xml in ' + self.imagesdir)
print imagetypename + '_FLASH not found in iconfig.xml'
return output
@@ -120,7 +120,10 @@
for unit in component.unit:
if group not in modules:
modules[group] = []
- modules[group].append(builddrive + os.sep + unit.bldFile)
+ if os.sep == '\\':
+ modules[group].append(builddrive + os.sep + unit.bldFile)
+ else:
+ modules[group].append(unit.bldFile)
else:
sdf = sysdef.api.SystemDefinition(canonicalsysdeffile)
--- a/buildframework/helium/sf/python/pythoncore/lib/build/model.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/build/model.py Mon Oct 18 10:23:52 2010 +0100
@@ -199,13 +199,7 @@
""" Initialisation. """
self._ccm_project = ccm_project
self._baselines = {}
- #TODO : could querying release attribute return the ccm object? Or add a release attribute to Project
- # class
- release = self._ccm_project['release']
- _logger.debug("Project release: '%s'" % release)
- self._ccm_release = None
- if release != '':
- self._ccm_project.session.create(release)
+ _logger.debug("Project release: '%s'" % self._ccm_project.release)
# capturing the frozen baseline.
_logger.debug('Capture baselines')
@@ -309,8 +303,8 @@
def _getsupplier(self):
"""get supplier"""
- if self._ccm_release != None:
- component = self._ccm_release.component
+ if self._ccm_project.release != None:
+ component = self._ccm_project.release.component
comparisons = {'MC': '^mc',
'S60': 'S60',
'SPP/NCP': '^spp_config|spp_psw|spp_tools|ncp_sw$',
@@ -458,12 +452,12 @@
for name in folder.name:
folder_name = unicode(name)
_logger.debug('folder_name: %s' % folder_name)
- if not old_folders.has_key(unicode(folder_name)):
- old_folders[unicode(folder_name)] = {}
- if hasattr(name, 'xml_attributes'):
- for attr_name, _ in sorted(name.xml_attributes.iteritems()):
- _logger.debug('attr_name: %s' % attr_name)
- old_folders[unicode(folder_name)][unicode(attr_name)] = unicode(getattr(name, attr_name))
+ if not old_folders.has_key(unicode(folder_name)):
+ old_folders[unicode(folder_name)] = {}
+ if hasattr(name, 'xml_attributes'):
+ for attr_name, _ in sorted(name.xml_attributes.iteritems()):
+ _logger.debug('attr_name: %s' % attr_name)
+ old_folders[unicode(folder_name)][unicode(attr_name)] = unicode(getattr(name, attr_name))
for task in recursive_node_scan(bom_log.bom.content, u'task'):
_logger.debug('task: %s' % task)
_logger.debug('task: %s' % task.id)
@@ -629,6 +623,14 @@
fix_node = doc.xml_create_element(u'fix', content=(unicode(task)), attributes = {u'type': unicode(fix.__class__.__name__)})
project_node.xml_append(fix_node)
+ self.write_icd_icfs(doc)
+ self.write_release_info(doc)
+
+ out = open(path, 'w')
+ doc.xml(out, indent='yes')
+ out.close()
+
+ def write_icd_icfs(self, doc):
if self._bom.icd_icfs != []:
# Add ICD info to BOM
doc.bom.content.xml_append(doc.xml_create_element(u'input'))
@@ -642,12 +644,13 @@
doc.bom.content.input.xml_append(doc.xml_create_element(u'version', content=(unicode(empty_bom_str))))
doc.bom.content.input.xml_append(doc.xml_create_element(u'icds'))
-
- # pylint: disable=R0914
- for i, icd in enumerate(self._bom.icd_icfs):
- doc.bom.content.input.icds.xml_append(doc.xml_create_element(u'icd'))
- doc.bom.content.input.icds.icd[i].xml_append(doc.xml_create_element(u'name', content=(unicode(icd))))
- #If currentRelease.xml exists then send s60 <input> tag to diamonds
+
+ for i, icd in enumerate(self._bom.icd_icfs):
+ doc.bom.content.input.icds.xml_append(doc.xml_create_element(u'icd'))
+ doc.bom.content.input.icds.icd[i].xml_append(doc.xml_create_element(u'name', content=(unicode(icd))))
+
+ def write_release_info(self, doc):
+ # If currentRelease.xml exists then send s60 <input> tag to diamonds
current_release_xml_path = self._bom.config['currentRelease.xml']
# data from the metadata will go first as they must be safer than the one
# given by the user
@@ -730,12 +733,6 @@
s60_input_source.xml_append(doc.xml_create_element(u'type', content=(unicode("unknown"))))
s60_input_node.xml_append(s60_input_source)
doc.bom.content.xml_append(s60_input_node)
-
-
- out = open(path, 'w')
- doc.xml(out, indent='yes')
- out.close()
-
def parse_status_log(self, log):
"""parse status log"""
_log_array = log.split('\r')
--- a/buildframework/helium/sf/python/pythoncore/lib/ccm/__init__.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ccm/__init__.py Mon Oct 18 10:23:52 2010 +0100
@@ -202,10 +202,11 @@
if mresult != None:
project = self._session.create(mresult.group(1))
self._output[project] = []
- mresult = re.match(r"^(.*)\s+(\w+#\d+)\s+(.+)$", line)
+ mresult = re.match(r"^(.*?)\s+(\w+#\d+(?:,\s+\w+#\d+)*)\s+(.+)$", line)
if mresult != None and project != None:
- self._output[project].append({'object': self._session.create(mresult.group(1)),
- 'task': self._session.create("Task %s" % mresult.group(2)),
+ for task in mresult.group(2).split(','):
+ self._output[project].append({'object': self._session.create(mresult.group(1)),
+ 'task': self._session.create("Task %s" % task),
'comment': mresult.group(3)})
mresult = re.match(r"^(\w+#\d+)\s+(.+)$", line)
if mresult != None and project != None:
@@ -340,7 +341,6 @@
match_warning = re.compile(r"^Warning:(.*)")
match_failed = re.compile(r"(Update failed)")
- # TODO: cleanup the parsing to do that in a more efficient way.
for line in output.splitlines():
_logger.info(line)
res = match_object_update.match(line)
@@ -723,9 +723,6 @@
def __repr__(self):
return self.__str__()
-
- def __del__(self):
- self.close()
def purposes(self, role=None):
""" Returns available purposes. """
@@ -922,7 +919,7 @@
try:
for session in self._free_sessions:
- session.role = session._set_role(role)
+ session.role = role
finally:
self._lock_pool = False
self._pool_lock.notifyAll()
@@ -1349,11 +1346,13 @@
def _getrelease(self):
""" Get the release of the current object. Returns a Releasedef object. """
- self._release = Releasedef(self._session, self['release'])
+ if self._release == None and (self['release'] != None and self['release'] != ''):
+ self._release = Releasedef(self._session, self['release'])
return self._release
def _setrelease(self, release):
""" Set the release of the current object. """
+ self._release = release
self['release'] = release['displayname']
def refresh(self):
@@ -1381,7 +1380,7 @@
if result.status != None and result.status != 0:
raise CCMException("Error setting basline of project '%s'\n%s" % (self.objectname, result.output))
- def set_update_method(self, name, recurse = False):
+ def set_update_method(self, name, recurse=False):
""" Set the update method for the project (and subproject if recurse is True). """
assert name != None, "name must not be None."
assert len(name) > 0, "name must not be an empty string."
@@ -1392,7 +1391,7 @@
if result.status != None and result.status != 0:
raise CCMException("Error setting reconfigure properties to %s for project '%s'\nStatus: %s\n%s" % (name, self.objectname, result.status, result.output))
- def apply_update_properties(self, baseline = True, tasks_and_folders = True, recurse=True):
+ def apply_update_properties(self, baseline=True, tasks_and_folders=True, recurse=True):
""" Apply update properties to subprojects. """
args = ""
if not baseline:
@@ -1423,7 +1422,7 @@
return result.output
raise CCMException("Error creation snapshot of %s,\n%s" % (self.objectname, result.output), result)
- def checkout(self, release, version=None, purpose=None, subprojects=True):
+ def checkout(self, release, version=None, purpose=None, subprojects=True, path=None):
""" Create a checkout of this project.
This will only checkout the project in Synergy. It does not create a work area.
@@ -1448,6 +1447,9 @@
self._session.role = get_role_for_purpose(self._session, purpose)
args += " -purpose \"%s\"" % purpose
+ if path:
+ args += " -path \"%s\"" % path
+
if subprojects:
args += " -subprojects"
result = self._session.execute("checkout -project \"%s\" -release \"%s\" -no_wa %s" \
@@ -1456,47 +1458,7 @@
self._session.role = role
if result.project == None:
raise CCMException("Error checking out project %s,\n%s" % (self.objectname, result.output), result)
- return result
-
- def create_release_tag(self, release, new_tag):
- """ creates new release tag """
- role = self._session.role
-
- if role is None:
- self._session.role = "developer"
- role = self._session.role
-
- args = "release -create %s -from %s -bl %s -active -allow_parallel_check_out" % (new_tag, release, release)
- self._session.role = "build_mgr"
-
- result = self._session.execute(" %s" \
- % (args), Result(self._session))
- self._session.role = role
-
- return result.output
-
- def delete_release_tag(self, release, new_tag):
- """ deletes new release tag """
-
- role = self._session.role
- if role is None:
- self._session.role = "developer"
- role = self._session.role
-
-
- self._session.role = "build_mgr"
-
- result = self._session.execute("pg -l -r %s -u" \
- % (new_tag), Result(self._session))
- result = self._session.execute("pg -d \"%s\" -m" \
- % (result.output), Result(self._session))
- result = self._session.execute("release -d %s -force" \
- % (new_tag), Result(self._session))
-
- self._session.role = role
-
- return result.output
-
+ return result
def work_area(self, maintain, recursive=None, relative=None, path=None, pst=None, wat=False):
""" Configure the work area. This allow to enable it or disable it, set the path, recursion... """
@@ -1629,6 +1591,44 @@
return self.name
component = property(_getcomponent)
+
+ def create_tag(self, new_tag):
+ """ creates new release tag """
+ role = self._session.role
+
+ if role is None:
+ self._session.role = "developer"
+ role = self._session.role
+
+ args = "release -create %s -from %s -bl %s -active -allow_parallel_check_out" % (new_tag, self.objectname, self.objectname)
+ self._session.role = "build_mgr"
+
+ result = self._session.execute(" %s" \
+ % (args), Result(self._session))
+ self._session.role = role
+
+ return result.output
+
+ def delete_tag(self, new_tag):
+ """ deletes new release tag """
+
+ role = self._session.role
+ if role is None:
+ self._session.role = "developer"
+ role = self._session.role
+
+ self._session.role = "build_mgr"
+
+ result = self._session.execute("pg -l -r %s -u" \
+ % (new_tag), Result(self._session))
+ result = self._session.execute("pg -d \"%s\" -m" \
+ % (result.output), Result(self._session))
+ result = self._session.execute("release -d \"%s\" -force" \
+ % (new_tag), Result(self._session))
+
+ self._session.role = role
+
+ return result.output
class Folder(CCMObject):
@@ -1751,7 +1751,6 @@
objects = property(_getobjects)
def __unicode__(self):
- # TODO: use optimised query that makes only 1 ccm query with suitable format
if self.__unicode_str_text == None:
self.__unicode_str_text = u'%s: %s' % (self['displayname'], self['task_synopsis'])
return self.__unicode_str_text
@@ -1771,6 +1770,7 @@
release = property(get_release_tag, set_release_tag)
+
class UpdateTemplate:
""" Allow to access Update Template property using Release and Purpose. """
def __init__(self, releasedef, purpose):
--- a/buildframework/helium/sf/python/pythoncore/lib/ccm/extra.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ccm/extra.py Mon Oct 18 10:23:52 2010 +0100
@@ -105,7 +105,7 @@
_logger.error( "Exception occurred in request #%s: %s" % (request.requestID, exc_info[1]))
exceptions.append(exc_info[1])
- def handle_result(result):
+ def handle_result(_, result):
""" append the result"""
results.append(result)
@@ -133,7 +133,7 @@
_logger.error( "Exception occured in request #%s: %s\n%s" % (request.requestID, exc_info[1], traceback.format_exception(exc_info[0], exc_info[1], exc_info[2])))
exceptions.append(exc_info[1])
- def handle_result(request, result):
+ def handle_result(_, result):
"""append the result"""
results.append(result)
--- a/buildframework/helium/sf/python/pythoncore/lib/configuration.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/configuration.py Mon Oct 18 10:23:52 2010 +0100
@@ -558,10 +558,7 @@
A ConfigurationSet represents a number of Configuration objects
that all may need to be processed.
"""
- try:
- dom = xml.dom.minidom.parse(self.inputfile)
- except Exception, exc:
- raise Exception("XML file '%s' cannot be parsed properly: %s" % (self.inputfile, exc))
+ dom = xml.dom.minidom.parse(self.inputfile)
# The root element is typically <build> but can be anything
self.rootNode = dom.documentElement
--- a/buildframework/helium/sf/python/pythoncore/lib/convertpkg.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/convertpkg.py Mon Oct 18 10:23:52 2010 +0100
@@ -64,6 +64,8 @@
submmpfile.write('//rtest\n')
elif testtype == 'stif':
submmpfile.write('LIBRARY stiftestinterface.lib\n')
+ elif testtype == 'sut':
+ submmpfile.write('LIBRARY symbianunittestfw.lib\n')
else:
raise Exception('Test type unknown: ' + testtype)
submmpfile.close()
--- a/buildframework/helium/sf/python/pythoncore/lib/dependancygraph.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/dependancygraph.py Mon Oct 18 10:23:52 2010 +0100
@@ -139,17 +139,18 @@
if os.path.isfile(filename) and fname.endswith('.egg'):
eggfile = zipfile.ZipFile(filename, 'r', zipfile.ZIP_DEFLATED)
-
- data = eggfile.read('EGG-INFO/PKG-INFO')
-
- library = readPkgInfo(data.split('\n'))
-
- if 'EGG-INFO/requires.txt' in eggfile.namelist():
- requiresdata = eggfile.read('EGG-INFO/requires.txt')
- readRequiresFile(requiresdata.split('\n'), library)
+ if 'EGG-INFO/PKG-INFO' in eggfile.namelist():
+ data = eggfile.read('EGG-INFO/PKG-INFO')
+
+ library = readPkgInfo(data.split('\n'))
- libraries.addLibrary(notinsubcon, library)
-
+ if 'EGG-INFO/requires.txt' in eggfile.namelist():
+ requiresdata = eggfile.read('EGG-INFO/requires.txt')
+ readRequiresFile(requiresdata.split('\n'), library)
+
+ libraries.addLibrary(notinsubcon, library)
+ else:
+ print 'EGG-INFO/PKG-INFO not in ' + filename
eggfile.close()
def readRequiresFile(data, library):
@@ -326,8 +327,9 @@
if macro:
output.append("\"%s\" [fontname=\"Times-Italic\"];" % str(targ.name))
output.append('subgraph \"cluster%s\" {label = \"%s\"; \"%s\"}\n' % (str(proj.name), str(proj.name), str(targ.name)))
- splt = str(signal).split(',')
+ splt = str(signal).split('(')
if len(splt) > 1:
+ splt[1] = splt[1].replace(')', '')
if splt[1] == 'now':
color = 'red'
elif splt[1] == 'defer':
--- a/buildframework/helium/sf/python/pythoncore/lib/fileutils.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/fileutils.py Mon Oct 18 10:23:52 2010 +0100
@@ -310,7 +310,7 @@
except OSError:
if os.path.isdir(src):
if destinsrc(src, dst):
- raise Exception, "Cannot move a directory '%s' into itself '%s'." % (src, dst)
+ raise OSError, "Cannot move a directory '%s' into itself '%s'." % (src, dst)
shutil.copytree(src, dst, symlinks=True)
rmtree(src)
else:
@@ -376,10 +376,15 @@
except os.error:
continue
# Check if the path is a regular file
- if stat.S_ISREG(status[stat.ST_MODE]):
- mode = stat.S_IMODE(status[stat.ST_MODE])
- if mode & 0111:
+ if os.sep == '\\':
+ if os.path.isfile(filename):
return os.path.normpath(filename)
+ else:
+ # On Unix also check the executable rigths
+ if stat.S_ISREG(status[stat.ST_MODE]):
+ mode = stat.S_IMODE(status[stat.ST_MODE])
+ if mode & 0111:
+ return os.path.normpath(filename)
return None
@@ -407,8 +412,8 @@
def load_policy_content(filename):
""" Testing policy content loading. """
data = ''
+ fileh = codecs.open(filename, 'r', 'ascii')
try:
- fileh = codecs.open(filename, 'r', 'ascii')
data = fileh.read()
except ValueError:
raise IOError("Error loading '%s' as an ASCII file." % filename)
@@ -607,7 +612,7 @@
if drive_type == win32con.DRIVE_REMOTE:
win32wnet.WNetCancelConnection2(drive, win32netcon.CONNECT_UPDATE_PROFILE, 1)
else:
- raise Exception("%s couldn't be umount." % drive)
+ raise OSError("%s couldn't be umount." % drive)
else:
def rmdir(path):
@@ -653,14 +658,14 @@
p_subst = subprocess.Popen("subst %s %s" % (drive, path), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
errmsg = p_subst.communicate()[0]
if p_subst.returncode != 0:
- raise Exception("Error substing '%s' under '%s': %s" % (path, drive, errmsg))
+ raise OSError("Error substing '%s' under '%s': %s" % (path, drive, errmsg))
def unsubst(drive):
""" Unsubsting the drive. """
p_subst = subprocess.Popen("subst /D %s" % (drive), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
errmsg = p_subst.communicate()[0]
if p_subst.returncode != 0:
- raise Exception("Error unsubsting '%s': %s" % (drive, errmsg))
+ raise OSError("Error unsubsting '%s': %s" % (drive, errmsg))
def getSubstedDrives():
"""get substituted drive"""
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/fileutils.py.orig Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,698 @@
+#============================================================================
+#Name : fileutils.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""
+File manipulation related functionalities:
+ * Filescanner
+ * rmtree (fixed version)
+ * move (fixed version)
+"""
+import codecs
+import locale
+import logging
+import os
+import re
+import sys
+import shutil
+import hashlib
+import subprocess
+import string
+
+import pathaddition.match
+import stat
+
+if os.name == 'nt':
+ import win32api
+
+LOGGER = logging.getLogger('fileutils')
+LOGGER_LOCK = logging.getLogger('fileutils.lock')
+#LOGGER.addHandler(logging.FileHandler('default.log'))
+#logging.basicConfig(level=logging.DEBUG)
+#LOGGER.setLevel(logging.DEBUG)
+
+class AbstractScanner(object):
+ """ This class implements all the required infrastructure for filescanning. """
+
+ def __init__(self):
+ """ Initialization. """
+ self.includes = []
+ self.excludes = []
+ self.includes_files = []
+ self.excludes_files = []
+ self.selectors = []
+ self.filetypes = []
+
+ def add_include(self, include):
+ """ Adds an include path to the scanner. """
+ if include.endswith('/') or include.endswith('\\'):
+ include = include + '**'
+
+ self.includes.append(include)
+
+ def add_exclude(self, exclude):
+ """ Adds an exclude path to the scanner. """
+ if exclude.endswith('/') or exclude.endswith('\\'):
+ exclude = exclude + '**'
+
+ self.excludes.append(exclude)
+
+ def add_exclude_file(self, exclude):
+ """ Adds an exclude file to the scanner. """
+ self.excludes_files.append(exclude)
+
+ def add_selector(self, selector):
+ """ Add selector to the scanner. """
+ self.selectors.append(selector)
+
+ def add_filetype(self, filetype):
+ """ Adds a filetype selection to the scanner. """
+ self.filetypes.append(filetype)
+
+ def is_included(self, path):
+ """ Returns if path is included by the scanner. """
+ LOGGER.debug("is_included: path = " + path)
+ if path.replace('\\', '/') in self.includes_files or path in self.includes_files:
+ return True
+ for inc in self.includes:
+ if self.match(path, inc):
+ LOGGER.debug("Included: " + path + " by " + inc)
+ return True
+ return False
+
+ def is_excluded(self, path):
+ """ Returns if path is excluded by the scanner. """
+ LOGGER.debug("is_excluded: path = " + path)
+ if path.replace('\\', '/') in self.excludes_files or path in self.excludes_files:
+ return True
+ for ex in self.excludes:
+ if self.match(path, ex):
+ LOGGER.debug("Excluded: " + path + " by " + ex)
+ return True
+ return False
+
+ def is_selected(self, path):
+ """ Returns if path is selected by all selectors in the scanner. """
+ LOGGER.debug("is_selected: path = " + path)
+ for selector in self.selectors:
+ if not selector.is_selected(path):
+ return False
+ LOGGER.debug("Selected: " + path)
+ return True
+
+ def is_filetype(self, path):
+ """ Test if a file matches one filetype. """
+ if len(self.filetypes) == 0:
+ return True
+ LOGGER.debug("is_filetype: path = " + path)
+ for filetype in self.filetypes:
+ if self.match(path, filetype):
+ LOGGER.debug("Filetype: " + path + " by " + filetype)
+ return True
+ return False
+
+ def match(self, filename, pattern):
+ """ Is filename matching pattern? """
+ return pathaddition.match.ant_match(filename, pattern, casesensitive=(os.sep != '\\'))
+
+ def test_path(self, root, relpath):
+ """ Test if a path matches filetype, include, exclude, and selection process."""
+ return self.is_filetype(relpath) and self.is_included(relpath) \
+ and not self.is_excluded(relpath) and \
+ self.is_selected(os.path.join(root, relpath))
+
+ def __str__(self):
+ """ Returns a string representing this instance. """
+ content = []
+ for inc in self.includes:
+ content.append('include:' + os.path.normpath(inc))
+ for ex in self.excludes:
+ content.append('exclude:' + os.path.normpath(ex))
+ return ';'.join(content)
+
+ def __repr__(self):
+ """ Returns a string representing this instance. """
+ return self.__str__()
+
+ def scan(self):
+ """ Abstract method which much be overriden to implement the scanning process. """
+ raise Exception("scan method must be overriden")
+
+
+class FileScanner(AbstractScanner):
+ """Scans the filesystem for files that match the selection paths.
+
+ The scanner is configured with a root directory. Any number of include
+ and exclude paths can be added. The scan() method is a generator that
+ returns matching files one at a time when called as an iterator.
+
+ This is a revisited implementation of the filescanner. It now relies on
+ the module pathaddition.match that implements a Ant-like regular expression matcher.
+
+ Rules:
+ - Includes and excludes should not start with *
+ - Includes and excludes should not have wildcard searches ending with ** (e.g. wildcard**)
+
+ Supported includes and excludes:
+ - filename.txt
+ - filename.*
+ - dir/
+ - dir/*
+ - dir/**
+ """
+ def __init__(self, root_dir):
+ """ Initialization. """
+ AbstractScanner.__init__(self)
+ self.root_dir = os.path.normpath(root_dir)
+ if not self.root_dir.endswith(os.sep):
+ self.root_dir = self.root_dir + os.sep
+ # Add 1 so the final path separator is removed
+ #self.root_dirLength = len(self.root_dir) + 1
+
+ def scan(self):
+ """ Scans the files required to zip"""
+ #paths_cache = []
+
+ excludescopy = self.excludes[:]
+ for f_file in excludescopy:
+ if os.path.exists(os.path.normpath(os.path.join(self.root_dir, f_file))):
+ self.excludes_files.append(f_file)
+ self.excludes.remove(f_file)
+
+ includescopy = self.includes[:]
+ for f_file in includescopy:
+ if os.path.exists(os.path.normpath(os.path.join(self.root_dir, f_file))):
+ self.includes_files.append(f_file)
+ self.includes.remove(f_file)
+
+ LOGGER.debug('Scanning sub-root directories')
+ for root_dir in self.find_subroots():
+ for dirpath, subdirs, files in os.walk(unicode(root_dir)):
+ # Let's save the len before it's getting modified.
+ subdirsLen = len(subdirs)
+ subroot = dirpath[len(self.root_dir):]
+
+ dirs_to_remove = []
+ for subdir in subdirs:
+ if self.is_excluded(os.path.join(subroot, subdir)):
+ dirs_to_remove.append(subdir)
+
+ for dir_remove in dirs_to_remove:
+ subdirs.remove(dir_remove)
+
+ LOGGER.debug('Scanning directory: ' + dirpath)
+ for file_ in files:
+ path = os.path.join(subroot, file_)
+ if self.is_filetype(path) and self.is_included(path) and \
+ self.is_selected(os.path.join(dirpath, file_)) and not self.is_excluded(path):
+ ret_path = os.path.join(dirpath, file_)
+ yield ret_path
+
+ LOGGER.debug('Checking for empty directory: ' + dirpath)
+ # Check for including empty directories
+ if self.is_included(subroot) and not self.is_excluded(subroot):
+ if len(files) == 0 and subdirsLen == 0:
+ LOGGER.debug('Including empty dir: ' + dirpath)
+ yield dirpath
+
+
+ def find_subroots(self):
+ """Finds all the subdirectory roots based on the include paths.
+
+ Often large archive operations define a number of archives from the root
+ of the drive. Walking the tree from the root is very time-consuming, so
+ selecting more specific subdirectory roots improves performance.
+ """
+ def splitpath(path):
+ """ Returns the splitted path"""
+ return path.split(os.sep)
+
+ root_dirs = []
+
+ # Look for includes that start with wildcards.
+ subdirs_not_usable = False
+ for inc in self.includes + self.includes_files:
+ first_path_segment = splitpath(os.path.normpath(inc))[0]
+ if first_path_segment.find('*') != -1:
+ subdirs_not_usable = True
+
+ # Parse all includes for sub-roots
+ if not subdirs_not_usable:
+ for inc in self.includes + self.includes_files:
+ include = None
+ LOGGER.debug("===> inc %s" % inc)
+ contains_globs = False
+ for pathcomp in splitpath(os.path.normpath(inc)):
+ if pathcomp.find('*') != -1:
+ contains_globs = True
+ break
+ else:
+ if include == None:
+ include = pathcomp
+ else:
+ include = os.path.join(include, pathcomp)
+ if not contains_globs:
+ include = os.path.dirname(include)
+
+ LOGGER.debug("include %s" % include)
+ if include != None:
+ root_dir = os.path.normpath(os.path.join(self.root_dir, include))
+ is_new_root = True
+ for root in root_dirs[:]:
+ if destinsrc(root, root_dir):
+ LOGGER.debug("root contains include, skip it")
+ is_new_root = False
+ break
+ if destinsrc(root_dir, root):
+ LOGGER.debug("include contains root, so remove root")
+ root_dirs.remove(root)
+ if is_new_root:
+ root_dirs.append(root_dir)
+
+ if len(root_dirs) == 0:
+ root_dirs = [os.path.normpath(self.root_dir)]
+ LOGGER.debug('Roots = ' + str(root_dirs))
+ return root_dirs
+
+ def __str__(self):
+ return os.path.normpath(self.root_dir) + ';' + AbstractScanner.__str__(self)
+
+ def __repr__(self):
+ return self.__str__()
+
+
+def move(src, dst):
+ """Recursively move a file or directory to another location.
+
+ If the destination is on our current filesystem, then simply use
+ rename. Otherwise, copy src to the dst and then remove src.
+ A lot more could be done here... A look at a mv.c shows a lot of
+ the issues this implementation glosses over.
+
+ """
+ try:
+ os.rename(src, dst)
+ except OSError:
+ if os.path.isdir(src):
+ if destinsrc(src, dst):
+ raise Exception, "Cannot move a directory '%s' into itself '%s'." % (src, dst)
+ shutil.copytree(src, dst, symlinks=True)
+ rmtree(src)
+ else:
+ shutil.copy2(src, dst)
+ os.unlink(src)
+
+def rmtree(rootdir):
+ """ Catch shutil.rmtree failures on Windows when files are read-only. Thanks Google!"""
+ if sys.platform == 'win32':
+ rootdir = os.path.normpath(rootdir)
+ if not os.path.isabs(rootdir):
+ rootdir = os.path.join(os.path.abspath('.'), rootdir)
+ if not rootdir.startswith('\\\\'):
+ rootdir = u"\\\\?\\" + rootdir
+
+ def cb_handle_error(fcn, path, excinfo):
+ """ Error handler, removing readonly and deleting the file. """
+ os.chmod(path, 0666)
+ if os.path.isdir(path):
+ rmdir(path)
+ elif os.path.isfile(path):
+ remove(path)
+ else:
+ fcn(path)
+
+ if 'java' in sys.platform:
+ import java.io
+ import org.apache.commons.io.FileUtils
+ f_file = java.io.File(rootdir)
+ org.apache.commons.io.FileUtils.deleteDirectory(f_file)
+ else:
+ return shutil.rmtree(rootdir, onerror=cb_handle_error)
+
+def destinsrc(src, dst):
+ """ Fixed version of destinscr, that doesn't match dst with same root name."""
+ if os.sep == '\\':
+ src = src.lower()
+ dst = dst.lower()
+ src = os.path.abspath(src)
+ dst = os.path.abspath(dst)
+ if not src.endswith(os.path.sep):
+ src += os.path.sep
+ if not dst.endswith(os.path.sep):
+ dst += os.path.sep
+ return dst.startswith(src)
+
+
+def which(executable):
+ """ Search for executable in the PATH."""
+ pathlist = os.environ['PATH'].split(os.pathsep)
+ pathexts = ['']
+ if os.sep == '\\':
+ pathexts = os.environ['PATHEXT'].split(os.pathsep)
+
+ for folder in pathlist:
+ for pathext in pathexts:
+ exename = executable
+ if os.sep == '\\' and not exename.lower().endswith(pathext.lower()):
+ exename = exename + pathext
+ filename = os.path.join(folder, exename)
+ try:
+ status = os.stat(filename)
+ except os.error:
+ continue
+ # Check if the path is a regular file
+ if stat.S_ISREG(status[stat.ST_MODE]):
+ mode = stat.S_IMODE(status[stat.ST_MODE])
+ if mode & 0111:
+ return os.path.normpath(filename)
+ return None
+
+
+def read_policy_content(filename):
+ """ Read the policy number from the policy file.
+ strict allows to activate the new policy scanning.
+ """
+ value = None
+ error = ""
+ try:
+ LOGGER.debug('Opening policy file: ' + filename)
+ policy_data = load_policy_content(filename)
+ match = re.match(r'^((?:\d+)|(?:0842[0-9a-zA-Z]{3}))\s*$', policy_data, re.M|re.DOTALL)
+ if match != None:
+ value = match.group(1)
+ else:
+ error = "Content of '%s' doesn't match r'^\d+|0842[0-9a-zA-Z]{3}\s*$'." % filename
+ except Exception, exc:
+ error = str(exc)
+ if value is not None:
+ return value
+ # worse case....
+ raise Exception(error)
+
+def load_policy_content(filename):
+ """ Testing policy content loading. """
+ data = ''
+ try:
+ fileh = codecs.open(filename, 'r', 'ascii')
+ data = fileh.read()
+ except:
+ raise Exception("Error loading '%s' as an ASCII file." % filename)
+ finally:
+ fileh.close()
+ return data
+
+ENCODING_MATRIX = {
+ codecs.BOM_UTF8: 'utf_8',
+ codecs.BOM_UTF16: 'utf_16',
+ codecs.BOM_UTF16_BE: 'utf_16_be',
+ codecs.BOM_UTF16_LE: 'utf_16_le',
+}
+
+def guess_encoding(data):
+ """Given a byte string, guess the encoding.
+
+ First it tries for UTF8/UTF16 BOM.
+
+ Next it tries the standard 'UTF8', 'ISO-8859-1', and 'cp1252' encodings,
+ Plus several gathered from locale information.
+
+ The calling program *must* first call locale.setlocale(locale.LC_ALL, '')
+
+ If successful it returns (decoded_unicode, successful_encoding)
+ If unsuccessful it raises a ``UnicodeError``.
+
+ This was taken from http://www.voidspace.org.uk/python/articles/guessing_encoding.shtml
+ """
+ for bom, enc in ENCODING_MATRIX.items():
+ if data.startswith(bom):
+ return data.decode(enc), enc
+ encodings = ['ascii', 'UTF-8']
+ successful_encoding = None
+ try:
+ encodings.append(locale.getlocale()[1])
+ except (AttributeError, IndexError):
+ pass
+ try:
+ encodings.append(locale.getdefaultlocale()[1])
+ except (AttributeError, IndexError):
+ pass
+ # latin-1
+ encodings.append('ISO8859-1')
+ encodings.append('cp1252')
+ for enc in encodings:
+ if not enc:
+ continue
+ try:
+ decoded = unicode(data, enc)
+ successful_encoding = enc
+ break
+ except (UnicodeError, LookupError):
+ pass
+ if successful_encoding is None:
+ raise UnicodeError('Unable to decode input data. Tried the'
+ ' following encodings: %s.' %
+ ', '.join([repr(enc) for enc in encodings if enc]))
+ else:
+ if successful_encoding == 'ascii':
+ # our default ascii encoding
+ successful_encoding = 'ISO8859-1'
+ return (decoded, successful_encoding)
+
+def getmd5(fullpath, chunk_size=2**16):
+ """ returns the md5 value"""
+ file_handle = open(fullpath, "rb")
+ file_handle.seek(0, os.SEEK_END)
+ size = file_handle.tell()
+ file_handle.seek(0, os.SEEK_SET)
+ md5 = hashlib.md5()
+ while size > 0:
+ toread = chunk_size
+ if size < chunk_size:
+ toread = size
+ chunk = file_handle.read(toread)
+ size = size - len(chunk)
+ md5.update(chunk)
+ file_handle.close()
+ return md5.hexdigest()
+
+def read_symbian_policy_content(filename):
+ """ Read the policy category from the policy file. """
+ value = None
+ error = ""
+ try:
+ LOGGER.debug('Opening symbian policy file: ' + filename)
+ try:
+ fileh = codecs.open(filename, 'r', 'ascii')
+ except:
+ raise Exception("Error loading '%s' as an ASCII file." % filename)
+ for line in fileh:
+ match = re.match(r'^Category\s+([A-Z])\s*$', line, re.M|re.DOTALL)
+ if match != None:
+ value = match.group(1)
+ fileh.close()
+ return value
+ fileh.close()
+ if match == None:
+ error = "Content of '%s' doesn't match r'^Category\s+([A-Z])\s*$'." % filename
+ except Exception, exc:
+ error = str(exc)
+ if value is not None:
+ return value
+ # worse case....
+ raise Exception(error)
+
+
+class LockFailedException(Exception):
+ """ This class is used to indicate the failure in obtaining a Lock. """
+ pass
+
+if os.name == 'nt':
+ import win32file
+ import win32con
+ import winerror
+ import time
+ import win32netcon
+ import win32wnet
+
+ class Lock:
+ """ This object implement file locking for windows. """
+
+ def __init__(self, filename):
+ LOGGER_LOCK.debug("__init__")
+ self._filename = filename
+ self.f_desc = None
+
+ def lock(self, wait=False):
+ """lock the file"""
+ LOGGER_LOCK.debug("lock")
+ # Open the file
+ if self.f_desc == None:
+ self.f_desc = open(self._filename, "w+")
+ wfd = win32file._get_osfhandle(self.f_desc.fileno())
+ if not wait:
+ try:
+ win32file.LockFile(wfd, 0, 0, 0xffff, 0)
+ except:
+ raise LockFailedException()
+ else:
+ while True:
+ try:
+ win32file.LockFile(wfd, 0, 0, 0xffff, 0)
+ break
+ except win32file.error, exc:
+ if exc[0] != winerror.ERROR_LOCK_VIOLATION:
+ raise exc
+ LOGGER_LOCK.debug("waiting")
+ time.sleep(1)
+
+ def unlock(self):
+ """unlock the file"""
+ LOGGER_LOCK.debug("unlock")
+ if self.f_desc == None:
+ LOGGER_LOCK.debug("already unlocked")
+ return
+ wfd = win32file._get_osfhandle(self.f_desc.fileno())
+ try:
+ # pylint: disable-msg=E1101
+ win32file.UnlockFile(wfd, 0 , 0, 0xffff, 0)
+ self.f_desc.close()
+ self.f_desc = None
+ except win32file.error, exc:
+ if exc[0] != 158:
+ raise
+
+
+ def __del__(self):
+ LOGGER_LOCK.debug("__del__")
+ self.unlock()
+
+ def rmdir(path):
+ """ Catch os.rmdir failures on Windows when path is too long (more than 256 chars)."""
+ path = win32api.GetShortPathName(path)
+ win32file.RemoveDirectory(path)
+
+ def remove(filename):
+ """ Catch os.rmdir failures on Windows when path is too long (more than 256 chars)."""
+ filename = win32api.GetShortPathName(filename)
+ filename = filename.lstrip("\\\\?\\")
+ os.remove(filename)
+
+ def mount(drive, unc, username=None, password=None, persistent=False):
+ """ Windows helper function to map a network drive. """
+ flags = 0
+ if persistent:
+ flags = win32netcon.CONNECT_UPDATE_PROFILE
+ win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK, drive, unc, None, username, password, flags)
+
+
+ def umount(drive):
+ """ Windows helper function to map a network drive. """
+ drive_type = win32file.GetDriveType(drive)
+ if drive_type == win32con.DRIVE_REMOTE:
+ win32wnet.WNetCancelConnection2(drive, win32netcon.CONNECT_UPDATE_PROFILE, 1)
+ else:
+ raise Exception("%s couldn't be umount." % drive)
+
+else:
+ def rmdir(path):
+ """remove directory"""
+ return os.rmdir(path)
+
+ def remove(path):
+ """remove the files and folders"""
+ return os.remove(path)
+
+ class Lock:
+ """ This class represents a dummy lock """
+ def __init__(self, filename):
+ pass
+ def lock(self, wait=False):
+ """lock file - do nothing """
+ pass
+ def unlock(self):
+ """un lock file -do nothing """
+ pass
+
+if os.sep == '\\':
+ def get_next_free_drive():
+ """ Return the first free drive found else it raise an exception. """
+ if os.name == 'nt':
+ drive_labels = sorted(list(set(string.ascii_uppercase) - set(win32api.GetLogicalDriveStrings())), reverse=True)
+ if len(drive_labels) != 0 :
+ return drive_labels[0] + ":"
+ raise OSError("No free drive left.")
+ if 'java' in sys.platform:
+ import java.io
+ used = []
+ for _xx in java.io.File.listRoots():
+ used.append(str(_xx).replace(':\\', ''))
+ drive_labels = sorted(list(set(string.ascii_uppercase) - set(used)), reverse=True)
+ if len(drive_labels) != 0 :
+ return drive_labels[0] + ":"
+ raise OSError("No free drive left.")
+
+ def subst(drive, path):
+ """ Substing path as a drive. """
+ path = os.path.normpath(path)
+ p_subst = subprocess.Popen("subst %s %s" % (drive, path), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ errmsg = p_subst.communicate()[0]
+ if p_subst.returncode != 0:
+ raise Exception("Error substing '%s' under '%s': %s" % (path, drive, errmsg))
+
+ def unsubst(drive):
+ """ Unsubsting the drive. """
+ p_subst = subprocess.Popen("subst /D %s" % (drive), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ errmsg = p_subst.communicate()[0]
+ if p_subst.returncode != 0:
+ raise Exception("Error unsubsting '%s': %s" % (drive, errmsg))
+
+ def getSubstedDrives():
+ """get substituted drive"""
+ driveInformation = {}
+ subStedDriveList = []
+ p_subst = subprocess.Popen("subst", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ subStedDriveList = re.split('\\n', p_subst.communicate()[0])
+ del subStedDriveList[len(subStedDriveList)-1]
+ for path in subStedDriveList:
+ subStedDrivePath = []
+ if(re.search(r'UNC', path) is not None):
+ subStedDrivePath = re.split('=>', path)
+ (drive_to_unsubst, _) = os.path.splitdrive(os.path.normpath(subStedDrivePath[0]))
+ uncPath = re.sub('UNC', r'\\', subStedDrivePath[1].strip())
+ if(uncPath != subStedDrivePath[1].strip()):
+ driveInformation[drive_to_unsubst] = uncPath
+ else:
+ subStedDrivePath = re.split('=>', path)
+ (drive_to_unsubst, _) = os.path.splitdrive(os.path.normpath(subStedDrivePath[0]))
+ driveInformation[drive_to_unsubst] = os.path.normpath(subStedDrivePath[1].strip())
+
+ return driveInformation
+
+def touch(srcdir):
+ """
+ Recursively touches all the files in the source path mentioned.
+ It does not touch the directories.
+ """
+ srcnames = os.listdir(srcdir)
+ for name in srcnames:
+ srcfname = os.path.join(srcdir, name)
+ if os.path.isdir(srcfname):
+ touch(srcfname)
+ else:
+ if os.path.exists(srcfname):
+ os.utime(srcfname, None)
--- a/buildframework/helium/sf/python/pythoncore/lib/idoprep.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/idoprep.py Mon Oct 18 10:23:52 2010 +0100
@@ -28,23 +28,9 @@
logging.basicConfig(level=logging.INFO)
_logger = logging.getLogger("check_latest_release")
-
-def validate(grace, service, product, release):
- """ Validate s60 grace server, s60 grace service, s60 grace product and
- s60 grace release are set.
- """
- if not grace:
- raise EnvironmentError("Property 's60.grace.server' is not defined.")
- if not service:
- raise EnvironmentError("Property 's60.grace.service' is not defined.")
- if not product:
- raise EnvironmentError("Property 's60.grace.product' is not defined.")
- if not release:
- raise EnvironmentError("Property 's60.grace.release' is not defined.")
-def get_s60_env_details(grace, service, product, release, rev, cachefilename, s60gracecheckmd5, s60graceusetickler):
+def get_s60_env_details(server, service, product, release, rev, cachefilename, checkmd5, usetickler):
""" Return s60 environ details """
- validate(grace, service, product, release)
revision = r'(_\d{3})?'
if rev != None:
revision = rev
@@ -53,11 +39,11 @@
_logger.info(str("Using cache file: %s" % cachefilename))
checkmd5 = False
- if s60gracecheckmd5 != None:
- checkmd5 = str(s60gracecheckmd5).lower()
+ if checkmd5 != None:
+ checkmd5 = str(checkmd5).lower()
checkmd5 = ((checkmd5 == "true") or (checkmd5 == "1") or (checkmd5 == "on"))
- branch = os.path.join(grace, service, product)
+ branch = os.path.join(server, service, product)
if not os.path.exists(branch):
raise IOError("Error occurred: Could not find directory %s" % branch)
@@ -71,7 +57,7 @@
result.append(relpath)
result.sort(reverse=True)
use_tickler = False
- tickler_validation = str(s60graceusetickler).lower()
+ tickler_validation = str(usetickler).lower()
if tickler_validation != None:
use_tickler = ((tickler_validation == "true") or (tickler_validation == "1"))
validresults = []
@@ -99,7 +85,7 @@
result = validresults
if len(result) == 0:
- raise EnvironmentError("Error finding GRACE release.")
+ raise EnvironmentError("Error finding release.")
print result[0]
return result
@@ -117,11 +103,11 @@
_logger.info("Version file not found getting new environment...")
return version
-def create_ado_mapping(sysdefconfig, adomappingfile, adoqualitymappingfile, builddrive, adoqualitydirs):
+def create_ado_mapping(sysdefconfig, adomappingfile, qualityMapping, builddrive, adoqualitydirs):
""" Creates ado mapping and ado quality mapping files """
input_ = open(sysdefconfig, 'r')
output = open(adomappingfile, 'w')
- outputquality = open(adoqualitymappingfile, 'w')
+ print "ado mapping file: %s" % adomappingfile
for sysdef in input_.readlines():
sysdef = sysdef.strip()
if len(sysdef) > 0:
@@ -139,18 +125,11 @@
else:
component = os.path.normpath(os.path.join(builddrive, location)).replace('\\','/')
print "%s=%s\n" % (sysdef, component)
- output.write("%s=%s\n" % (sysdef, component))
- if adoqualitydirs == None:
- outputquality.write("%s=%s\n" % (sysdef, component))
+ if adoqualitydirs == None or qualityMapping == 'false':
+ output.write("%s=%s\n" % (sysdef, component))
else:
for dir_ in adoqualitydirs.split(','):
if os.path.normpath(dir_) == os.path.normpath(os.path.join(builddrive, os.environ['EPOCROOT'], location)):
- outputquality.write("%s=%s\n" % (sysdef, component))
-
-
- outputquality.close()
+ output.write("%s=%s\n" % (sysdef, component))
output.close()
- input_.close()
-
-
-
+ input_.close()
\ No newline at end of file
--- a/buildframework/helium/sf/python/pythoncore/lib/integration/quality.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/integration/quality.py Mon Oct 18 10:23:52 2010 +0100
@@ -33,6 +33,7 @@
import fileutils
import pathaddition.match
import logging
+import traceback
#logging.basicConfig(level=logging.DEBUG)
_logger = logging.getLogger("integration.quality")
@@ -111,7 +112,7 @@
class PolicyValidator(object):
""" Validate policy files on a hierarchy. """
- def __init__(self, policyfiles=None, csvfile=None, ignoreroot=False, excludes=None):
+ def __init__(self, policyfiles=None, ignoreroot=False, excludes=None):
"""The constructor """
if policyfiles is None:
policyfiles = ['distribution.policy.s60']
@@ -135,7 +136,16 @@
self._ids[row[0]] = row
if row[1].lower() != "yes" and row[1].lower() != "no" and row[1].lower() != "bin":
yield ["unknownstatus", row[0], row[2]]
-
+
+ def epl_load_policy_ids(self, csvfile):
+ """ Load the icds from the CSV file for epl check."""
+ self._ids = {}
+ reader = csv.reader(open(csvfile, "rU"))
+ for row in reader:
+ if len(row)>=3 and re.match(r"^\s*\d+\s*$", row[0]):
+ if row[1].lower() == "yes" or row[1].lower() == "bin":
+ self._ids[row[0]] = row
+
def validate_content(self, filename):
""" Validating the policy file content. If it cannot be decoded,
it reports an 'invalidencoding'.
@@ -151,6 +161,20 @@
if value not in self._ids:
yield ["notinidlist", filename, value]
+ def epl_validate_content(self, filename):
+ """ Validating the policy file content for epl"""
+ value = None
+ try:
+ value = fileutils.read_policy_content(filename)
+ except IOError, exc:
+ traceback.print_exc()
+ raise exc
+ if value is not None:
+ if self._ids != None:
+ if value not in self._ids:
+ return False
+ return True
+
def find_policy(self, path):
""" find the policy file under path using filenames under the list. """
for filename in self._policyfiles:
--- a/buildframework/helium/sf/python/pythoncore/lib/log2xml.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/log2xml.py Mon Oct 18 10:23:52 2010 +0100
@@ -174,9 +174,11 @@
print exc
-def convert(inputfile, outputfile, fulllogging=True, configuration=DEFAULT_CONFIGURATION):
+def convert(inputfile, outputfile, fulllogging=True, configuration=None):
""" Convert an input log into an XML log and write an outputfile. """
-
+ if configuration == None:
+ configuration = DEFAULT_CONFIGURATION
+
# Compiling the regexp
built_config = {}
for category in configuration.keys():
@@ -243,9 +245,11 @@
# end file
xmllog.close()
-def convert_old(inputfile, outputfile, fulllogging=True, configuration=DEFAULT_CONFIGURATION):
+def convert_old(inputfile, outputfile, fulllogging=True, configuration=None):
""" Convert an input log into an XML log and write an outputfile. """
-
+ if configuration == None:
+ configuration = DEFAULT_CONFIGURATION
+
# Compiling the regexp
built_config = {}
for category in configuration.keys():
--- a/buildframework/helium/sf/python/pythoncore/lib/nokia/gscm.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/nokia/gscm.py Mon Oct 18 10:23:52 2010 +0100
@@ -35,7 +35,7 @@
""" Runs a command and returns the result data. """
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = process.stdout.read()
- process.poll()
+ process.wait()
status = process.returncode
return (output, status)
@@ -53,9 +53,11 @@
_logger.debug("Status: %s" % status)
_logger.debug("Output: %s" % output)
if status == 0 or status == None and not ("Can't locate" in output):
+ _logger.debug("Returning output")
return output.strip()
if not 'HLM_SUBCON' in os.environ:
- raise Exception("Error retrieving get_db_path info for '%s' database.\nOUTPUT:%s" % (dbname, output.strip()))
+ _logger.debug("Raising exception")
+ raise IOError("Error retrieving get_db_path info for '%s' database.\nOUTPUT:%s" % (dbname, output.strip()))
return None
def get_db_path(dbname):
--- a/buildframework/helium/sf/python/pythoncore/lib/pkg2iby.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pkg2iby.py Mon Oct 18 10:23:52 2010 +0100
@@ -52,10 +52,16 @@
atsautoexec.write(r'md c:\logs\testresults' + '\n')
atsautoexec.write(r'md c:\logs\testexecute' + '\n')
+ for _, dst, _, _ in pkgfiles:
+ (_, dstsplit) = os.path.splitdrive(dst)
+ dst_nodrive = 'atsdata' + dstsplit
+ zdst = 'z:\\' + dst_nodrive
+ atsautoexec.write(r'md ' + os.path.dirname(dst) + '\n')
+ atsautoexec.write(r'copy ' + zdst + ' ' + dst + '\n')
+
for src, dst, filetype, _ in pkgfiles:
- (_, dst) = os.path.splitdrive(dst)
- dst_nodrive = 'atsdata' + dst
- dst = r'z:\atsdata' + dst
+ (_, dstsplit) = os.path.splitdrive(dst)
+ dst_nodrive = 'atsdata' + dstsplit
myiby.write('data=' + src + ' ' + dst_nodrive + '\n')
if 'testscript' in filetype and testtype == 'tef':
atsautoexec.write('testexecute.exe ' + dst + '\n')
@@ -75,7 +81,6 @@
atsautoexec.write(r'runtests \sys\bin\atsrtestexec.bat' + '\n')
myiby.write(r'data=' + rtestexecfilename + r' \sys\bin\atsrtestexec.bat' + '\n')
-
myiby.write(r'data=' + dummyexecfilename + r' z:\dummytest.txt' + '\n')
atsautoexec.write(r'RUNTESTS z:\dummytest.txt -p')
myiby.write("#endif\n")
--- a/buildframework/helium/sf/python/pythoncore/lib/preparation.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/preparation.py Mon Oct 18 10:23:52 2010 +0100
@@ -125,6 +125,10 @@
session = self.get_session()
project = session.create(self._config.name)
+ session.home = self._config['dir']
+ path = os.path.join(session.home, project.name)
+ project.work_area(False, True, True, path=path)
+
target_dir = os.path.normpath(os.path.join(self._config['dir'], project.name))
_logger.info("Deleting snapshot under %s." % target_dir)
if os.path.exists(target_dir):
@@ -209,13 +213,9 @@
for project in self.__get_subbaselines():
self._check_object(project)
-
- try:
- if (not os.path.exists(self._config['dir'])):
- os.makedirs(self._config['dir'])
- except Exception:
- _logger.info("ERROR: Not able to create the synergy workarea %s " % (self._config['dir']))
- raise Exception("ERROR: Not able to create the synergy workarea %s" % self._config.name)
+
+ if (not os.path.exists(self._config['dir'])):
+ os.makedirs(self._config['dir'])
# checking if the purpose exists
if self._config.has_key('purpose'):
@@ -241,6 +241,10 @@
session.home = self._config['dir']
result = self.__find_project(project)
+
+ path = os.path.join(session.home, project.name)
+ project.work_area(False, True, True, path=path)
+
if (result != None):
_logger.info("Project found: '%s'" % result)
role = session.role
@@ -308,9 +312,14 @@
_logger.info("Using version: '%s'" % version)
try:
+ if (not self._config.get_boolean('use.default_wa_path', True)):
+ wa_path = self._config['dir']
+ _logger.info("Using work area path to checkout directly")
+ result = project.checkout(session.create(self._config['release']), version=version, purpose=purpose, path=wa_path)
+ else:
+ result = project.checkout(session.create(self._config['release']), version=version, purpose=purpose)
+ ccm.log_result(result, ccm.CHECKOUT_LOG_RULES, _logger)
self.__setRole(session)
- result = project.checkout(session.create(self._config['release']), version=version, purpose=purpose)
- ccm.log_result(result, ccm.CHECKOUT_LOG_RULES, _logger)
except ccm.CCMException, exc:
ccm.log_result(exc.result, ccm.CHECKOUT_LOG_RULES, _logger)
raise exc
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_archive.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_archive.py Mon Oct 18 10:23:52 2010 +0100
@@ -266,13 +266,14 @@
content = [s.strip() for s in content]
content.sort()
- print content
if os.sep == '\\':
expected_paths = [s.strip().lower() for s in expected_paths]
else:
expected_paths = [s.strip() for s in expected_paths]
expected_paths.sort()
- print expected_paths
+
+ _logger.info("expected_paths:\n" + str("\n".join(expected_paths)))
+ _logger.info("content:\n" + str("\n".join(content)))
assert content == expected_paths
def test_split_manifest_file_unicode(self):
@@ -890,6 +891,66 @@
self.assert_(content == expectedPaths)
self.assert_(content1 == expectedPaths1)
self.assert_(content2 == expectedPaths2)
+
+ def test_split_on_uncompressed_size_enabled(self):
+ """ Testing the policy mapper with split on uncompressed size enabled. """
+ configDict = {'root.dir': root_test_dir,
+ 'temp.build.dir': os.path.abspath(os.path.join(root_test_dir, 'temp_build_files')),
+ 'archives.dir': root_test_dir,
+ 'name': 's60_policy_mapper_test',
+ 'include': 's60/',
+ 'archive.tool': '7za',
+ 'mapper': 'policy',
+ 'max.files.per.archive': '1',
+ 'split.on.uncompressed.size.enabled': 'true',
+ 'policy.csv': os.path.join(os.environ['TEST_DATA'], 'data/distribution.policy.id_status.csv'),
+ }
+ config = configuration.Configuration(configDict)
+
+ builder = archive.ArchivePreBuilder(configuration.ConfigurationSet([config]), "config", index=0)
+ manifest_file_path = builder.build_manifest(config)
+ cmds = builder.manifest_to_commands(config, manifest_file_path)
+
+ expectedPaths0 = ['s60' + os.sep + 'component_private' + os.sep + 'Distribution.Policy.S60\n']
+ expectedPaths1 = ['s60' + os.sep + 'component_private' + os.sep + 'component_private_file.txt\n']
+ expectedPaths2 = ['s60' + os.sep + 'Distribution.Policy.S60\n']
+ expectedPaths3 = ['s60' + os.sep + 'component_public' + os.sep + 'Distribution.Policy.S60\n']
+ expectedPaths4 = ['s60' + os.sep + 'component_public' + os.sep + 'component_public_file.txt\n']
+ expectedPaths5 = ['s60' + os.sep + 'missing' + os.sep + 'subdir' + os.sep + 'Distribution.Policy.S60\n']
+
+ includeFilePath0 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_part01_1.txt')
+ includeFilePath1 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_part02_1.txt')
+ includeFilePath2 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_part01_0.txt')
+ includeFilePath3 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_part02_0.txt')
+ includeFilePath4 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_part03_0.txt')
+ includeFilePath5 = os.path.join(root_test_dir, 'temp_build_files/s60_policy_mapper_test_part04_0.txt')
+
+ with open(includeFilePath0) as f_file:
+ content0 = f_file.readlines()
+ with open(includeFilePath1) as f_file:
+ content1 = f_file.readlines()
+ with open(includeFilePath2) as f_file:
+ content2 = f_file.readlines()
+ with open(includeFilePath3) as f_file:
+ content3 = f_file.readlines()
+ with open(includeFilePath4) as f_file:
+ content4 = f_file.readlines()
+ with open(includeFilePath5) as f_file:
+ content5 = f_file.readlines()
+
+ print "content0: ", content0
+ print "content1: ", content1
+ print "content2: ", content2
+ print "content3: ", content3
+ print "content4: ", content4
+ print "content5: ", content5
+
+ self.assert_(content0 == expectedPaths0 or content0 == expectedPaths1)
+ self.assert_(content1 == expectedPaths1 or content1 == expectedPaths0)
+ self.assert_(content2 == expectedPaths2)
+ self.assert_(content3 == expectedPaths3 or content3 == expectedPaths4)
+ self.assert_(content4 == expectedPaths4 or content4 == expectedPaths3)
+ self.assert_(content5 == expectedPaths5)
class CheckRootDirValueTest(unittest.TestCase):
"""test root drive value"""
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_ats3.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_ats3.py Mon Oct 18 10:23:52 2010 +0100
@@ -20,7 +20,6 @@
#===============================================================================
""" Testing ATS3 framework. """
-# pylint: disable=E1101,C0302,w0142,w0603,R0912,R0902,R0903,R0201,W0404, R0915
#w0142 => * and ** were used
#w0603 => global variables used TSRC_PATH etc
#R* => will be fixed while refactoring
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_ats3_aste.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_ats3_aste.py Mon Oct 18 10:23:52 2010 +0100
@@ -20,8 +20,6 @@
#===============================================================================
""" Testing ATS3 ASTE framework. """
-
-# pylint: disable=W0603,W0142,R0903,R0911,R0912,R0902,R0901,R0201
# pylint: disable=E1101
#E1101 => Mocker shows mockery
#R* remove during refactoring
@@ -61,6 +59,7 @@
self.__dict__.update(kwargs)
+# pylint: disable=R0911
def equal_xml(xml1, xml2):
"""Check the equality of the given XML snippets.
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_ats4.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_ats4.py Mon Oct 18 10:23:52 2010 +0100
@@ -20,7 +20,6 @@
#===============================================================================
""" Testing ats4 framework. """
-# pylint: disable=E1101, C0302, W0142, W0603, R0902,R0903,R0912,R0915
#E1101 => Mocker shows mockery
#C0302 => too many lines
#W0142 => used * or ** magic
@@ -271,6 +270,11 @@
TestReportFileName= TestReport
TestReportFormat= TXT # Possible values: TXT or HTML
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+[New_Module]
+ModuleName= testscripter
""")
@@ -294,7 +298,7 @@
assert params[0].get("value") == "writefile"
assert params[1].get("value") == path(r"z:\sys\bin\ctcman.exe")
-def check_ctc_log(steps, testtype=""):
+def check_ctc_log(steps):
"""Fetches CTC Log"""
#For the ctcdata.txt to be published on the ATS network drive
step = steps.next()
@@ -772,6 +776,7 @@
mocker.expect(test_plan["report_email"]).result(self.report_email)
mocker.expect(test_plan["ctc_run_process_params"]).result(self.ctc_run_process_params)
mocker.expect(test_plan["report_type"]).result("")
+ mocker.expect(test_plan["file_store"]).result("")
if self.trace_enabled.lower() == "true":
mocker.expect(test_plan["trace_enabled"]).result("True")
@@ -937,6 +942,20 @@
assert params[0].get("value") == "*"
assert params[1].get("value") == "60"
assert params[2].get("value") == "c:\\testframework\\" + ntpath.basename(self.engine_ini_file)
+ step = steps.next()
+ assert step.findtext("./type") == "StifRunCasesTask"
+ params = step.findall("./parameters/parameter")
+ assert params[0].get("value") == "TESTSCRIPTER"
+ assert params[1].get("value") == "*"
+ assert params[2].get("value") == "60"
+ assert params[3].get("value") == r"e:\testing\conf\file1.cfg"
+ step = steps.next()
+ assert step.findtext("./type") == "StifRunCasesTask"
+ params = step.findall("./parameters/parameter")
+ assert params[0].get("value") == "TESTSCRIPTER"
+ assert params[1].get("value") == "*"
+ assert params[2].get("value") == "60"
+ assert params[3].get("value") == r"e:\testing\conf\file2.cfg"
def test_steps_trace_enabled(self):
""" Test steps trace enabled. """
@@ -1113,8 +1132,9 @@
self.custom_files = None
self.component_path = None
self.ctc_run_process_params = None
+ self.ats_stf_enabled = None
- def generate_xml(self, harness, trace_enabled="False"):
+ def generate_xml(self, harness, trace_enabled="False", tef_test_module=None, ats_stf_enabled="False"):
"""Generates XML"""
def files(*paths):
"""generates paths for the files"""
@@ -1125,6 +1145,59 @@
self.config_files = files("conf/file1.cfg", "conf/file2.cfg")
self.testmodule_files = files("testmodules/file1.dll", "testmodules/file2.dll")
self.image_files = files("output/images/file1.fpsx", "output/images/file2.fpsx")
+ if tef_test_module:
+ TEST_PATH.joinpath(r"tsrc" + os.sep + "init" + os.sep + "TestFramework.ini").write_text(
+ r"""
+# - Sets a device reset module's dll name(Reboot).
+# + If Nokia specific reset module is not available or it is not correct one
+# StifHWResetStub module may use as a template for user specific reset
+# module.
+
+[Engine_Defaults]
+
+TestReportMode= FullReport # Possible values are: 'Empty', 'Summary', 'Environment',
+ 'TestCases' or 'FullReport'
+
+CreateTestReport= YES # Possible values: YES or NO
+
+TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT # Possible values: TXT or HTML
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+[New_Module]
+ModuleName= teftestmodule
+
+ """)
+ else:
+ TEST_PATH.joinpath(r"tsrc" + os.sep + "init" + os.sep + "TestFramework.ini").write_text(
+ r"""
+# - Sets a device reset module's dll name(Reboot).
+# + If Nokia specific reset module is not available or it is not correct one
+# StifHWResetStub module may use as a template for user specific reset
+# module.
+
+[Engine_Defaults]
+
+TestReportMode= FullReport # Possible values are: 'Empty', 'Summary', 'Environment',
+ 'TestCases' or 'FullReport'
+
+CreateTestReport= YES # Possible values: YES or NO
+
+TestReportFilePath= C:\LOGS\TestFramework\
+TestReportFileName= TestReport
+
+TestReportFormat= TXT # Possible values: TXT or HTML
+[End_Defaults]
+# -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+[New_Module]
+ModuleName= testscripter
+
+ """)
+
self.engine_ini_file = files("init/TestFramework.ini")[0]
self.report_email = "test.receiver@company.com"
self.file_store = path("path/to/reports")
@@ -1133,6 +1206,7 @@
self.pmd_files = TEST_FILES["pmd_file"]
self.trace_activation_files = files("trace_init/trace_activation_1.xml")
self.ctc_enabled = "True"
+ self.ats_stf_enabled = ats_stf_enabled
self.eunitexerunner_flags = "/E S60AppEnv /R Off"
self.custom_dir = "custom"
self.custom_files = files("custom/postpostaction.xml", "custom/prepostaction.xml")
@@ -1184,11 +1258,13 @@
mocker.expect(test_plan["device_hwid"]).result("5425")
mocker.expect(test_plan["trace_enabled"]).result(self.trace_enabled)
mocker.expect(test_plan["ctc_enabled"]).result(self.ctc_enabled)
+ mocker.expect(test_plan["ats_stf_enabled"]).result(self.ats_stf_enabled)
mocker.expect(test_plan["custom_dir"]).result("custom1A")
mocker.expect(test_plan.custom_dir).result(path(r"self.custom_dir"))
mocker.expect(test_plan["ctc_run_process_params"]).result(self.ctc_run_process_params)
mocker.expect(test_plan["report_email"]).result(self.report_email)
mocker.expect(test_plan["report_type"]).result("")
+ mocker.expect(test_plan["file_store"]).result("")
if self.trace_enabled == "False":
mocker.expect(test_plan.sets).result([
dict(name="set0", image_files=self.image_files, data_files=self.data_files,
@@ -1314,7 +1390,7 @@
self.check_install_step(steps, "EUNIT", set_count="1")
self.check_run_cases(steps, "EUNIT")
check_ctc_write(steps)
- check_ctc_log(steps, "withpkgfiles")
+ check_ctc_log(steps)
check_fetch_logs(steps, "EUNIT")
else:
self.check_install_step(steps, thar)
@@ -1322,6 +1398,66 @@
check_ctc_write(steps)
check_ctc_log(steps)
check_fetch_logs(steps, thar)
+
+ def test_case_steps_teftestmodule(self):
+ """Checks cases in steps in the test.xml file for TEFTESTMODULE"""
+ test_harness = ["STIF", "EUNIT", "MULTI_HARNESS"]
+ for thar in test_harness:
+ xml = self.generate_xml(thar, tef_test_module=True, ats_stf_enabled="True")
+ #print et.tostring(xml.getroot())
+ steps = iter(xml.findall(".//task"))
+ steps.next() # Flash images
+ check_ctc_start(steps)
+ check_log_dir(steps)
+ if "MULTI_HARNESS" in thar:
+ self.check_install_step(steps, "STIF")
+ self.check_run_cases(steps, "STIF", tef_test_module=True, ats_stf_enabled="True")
+ check_ctc_write(steps)
+ check_ctc_log(steps)
+ check_fetch_logs(steps, "STIF")
+
+ steps.next() # Flash images
+ check_ctc_start(steps)
+ check_log_dir(steps)
+ self.check_install_step(steps, "EUNIT", set_count="1")
+ self.check_run_cases(steps, "EUNIT")
+ check_ctc_write(steps)
+ check_ctc_log(steps)
+ check_fetch_logs(steps, "EUNIT")
+ else:
+ self.check_install_step(steps, thar)
+ self.check_run_cases(steps, thar, tef_test_module=True)
+ check_ctc_write(steps)
+ check_ctc_log(steps)
+ check_fetch_logs(steps, thar)
+ for thar in test_harness:
+ xml = self.generate_xml(thar, tef_test_module=True)
+ #print et.tostring(xml.getroot())
+ steps = iter(xml.findall(".//task"))
+ steps.next() # Flash images
+ check_ctc_start(steps)
+ check_log_dir(steps)
+ if "MULTI_HARNESS" in thar:
+ self.check_install_step(steps, "STIF")
+ self.check_run_cases(steps, "STIF", tef_test_module=True)
+ check_ctc_write(steps)
+ check_ctc_log(steps)
+ check_fetch_logs(steps, "STIF")
+
+ steps.next() # Flash images
+ check_ctc_start(steps)
+ check_log_dir(steps)
+ self.check_install_step(steps, "EUNIT", set_count="1")
+ self.check_run_cases(steps, "EUNIT")
+ check_ctc_write(steps)
+ check_ctc_log(steps)
+ check_fetch_logs(steps, "EUNIT")
+ else:
+ self.check_install_step(steps, thar)
+ self.check_run_cases(steps, thar, tef_test_module=True)
+ check_ctc_write(steps)
+ check_ctc_log(steps)
+ check_fetch_logs(steps, thar)
def check_install_step(self, steps, harness, set_count="0"):
"""Checks install steps in the test.xml file"""
@@ -1348,7 +1484,7 @@
assert ntpath.basename(dst) == filename
assert ntpath.dirname(dst) == drive + "\\sys\\bin"
- def check_run_cases(self, steps, harness="STIF"):
+ def check_run_cases(self, steps, harness="STIF", tef_test_module=None, ats_stf_enabled="False"):
"""Checks run cases in the test.xml file"""
step = steps.next()
if harness == "STIF":
@@ -1358,6 +1494,45 @@
assert params[0].get("value") == "*"
assert params[1].get("value") == "60"
assert params[2].get("value") == "c:\\sys\\bin\\" + ntpath.basename(self.engine_ini_file)
+ step = steps.next()
+ assert step.findtext("./type") == "StifRunCasesTask"
+ params = step.findall("./parameters/parameter")
+ assert params[0].get("value") == "file1.dll"
+ assert params[1].get("value") == "*"
+ assert params[2].get("value") == "60"
+ step = steps.next()
+ assert step.findtext("./type") == "StifRunCasesTask"
+ params = step.findall("./parameters/parameter")
+ assert params[0].get("value") == "file2.dll"
+ assert params[1].get("value") == "*"
+ assert params[2].get("value") == "60"
+ step = steps.next()
+ assert step.findtext("./type") == "StifRunCasesTask"
+ params = step.findall("./parameters/parameter")
+ if tef_test_module:
+ assert params[0].get("value") == "teftestmodule"
+ else:
+ assert params[0].get("value") == "TESTSCRIPTER"
+ assert params[1].get("value") == "*"
+ assert params[2].get("value") == "60"
+ assert params[3].get("value") == r"c:\sys\bin\file1.cfg"
+ if tef_test_module and ats_stf_enabled.lower() == "true":
+ assert params[4].get("value") == r"c:\spd_logs\xml\teftestmodule.xml"
+
+ step = steps.next()
+ assert step.findtext("./type") == "StifRunCasesTask"
+ params = step.findall("./parameters/parameter")
+ if tef_test_module:
+ assert params[0].get("value") == "teftestmodule"
+ else:
+ assert params[0].get("value") == "TESTSCRIPTER"
+ assert params[1].get("value") == "*"
+ assert params[2].get("value") == "60"
+ assert params[3].get("value") == r"c:\sys\bin\file2.cfg"
+ if tef_test_module and ats_stf_enabled.lower() == "true":
+ assert params[4].get("value") == r"c:\spd_logs\xml\teftestmodule.xml"
+
+
elif harness == "EUNIT":
_ = self.testmodule_files[0]
assert step.findtext("./type") == "EUnitTask"
@@ -1569,6 +1744,7 @@
mocker.expect(test_plan["ctc_run_process_params"]).result(self.ctc_run_process_params)
mocker.expect(test_plan["report_email"]).result(self.report_email)
mocker.expect(test_plan["report_type"]).result("")
+ mocker.expect(test_plan["file_store"]).result("")
mocker.expect(test_plan.sets).result([
dict(name="set0", image_files=self.image_files, sis_files=self.sis_files,
engine_ini_file=self.engine_ini_file, test_harness=self.harness, ctc_enabled="False", component_path=self.component_path, custom_dir=None),
@@ -1613,6 +1789,7 @@
assert params[-1].get("value") == "c:\\testframework\\" + ntpath.basename(filename)
def test_ats_sut():
+ """Test SymbianUnitTest"""
opts = Bunch(file_store='', flash_images='', diamonds_build_url='', testrun_name='', device_type='', report_email='', test_timeout='', drop_file='', config_file='', target_platform='', data_dir='', build_drive='', sis_files='', harness='', trace_enabled='', specific_pkg='', ats4_enabled='true', device_hwid='')
test_plan = ats3.Ats3TestPlan(opts)
@@ -1631,4 +1808,4 @@
step = steps.next()
assert step.findtext("./type") == "SymbianUnitTestTask"
params = step.findall("./parameters/parameter")
- assert params[1].get("value") == r"-tests=c:\sys\bin\file1.dll -noprompt"
\ No newline at end of file
+ assert params[1].get("value") == r"-tests=c:\sys\bin\file1.dll -noprompt"
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_ats4_aste.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_ats4_aste.py Mon Oct 18 10:23:52 2010 +0100
@@ -21,7 +21,6 @@
""" Testing ATS4 ASTE framework. """
-# pylint: disable=E1101, R0903, R0911, R0912, W0603, W0142, R0902, R0201
#E1101 => Mocker shows mockery
#C0302 => too many lines
#W0142 => used * or ** magic
@@ -44,6 +43,8 @@
import ats3.aste
+import pythoncorecpythontests.test_ats3_aste
+
TEST_PATH = None
TEST_FILES = {}
TEST_ASSET_FILES = {}
@@ -63,75 +64,7 @@
self.__dict__.update(kwargs)
def equal_xml(xml1, xml2):
- """Check the equality of the given XML snippets.
-
- Tag name equality:
-
- >>> equal_xml('<a/>', '<a/>')
- True
- >>> equal_xml('<a/>', '<b/>')
- False
-
- Attribute equality:
-
- >>> equal_xml('<a k="v"/>', '<a k="v"/>')
- True
- >>> equal_xml('<a k="v"/>', '<a k="w"/>')
- False
-
- Text content equality:
-
- >>> equal_xml('<a>v</a>', '<a>v</a>')
- True
- >>> equal_xml('<a>v</a>', '<a>w</a>')
- False
- >>> equal_xml('<a>v</a>', '<a></a>')
- False
-
- Text content equality when whitespace differs:
- >>> equal_xml('<a>v</a>', '<a>v </a>')
- True
-
- Equality of child elements:
-
- >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="v"/></b></a>')
- True
- >>> equal_xml('<a><b><c k="v"/></b></a>', '<a><b><c k="w"/></b></a>')
- False
- >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>w</b></a>')
- False
- >>> equal_xml('<a><b><c k="v"/>v</b></a>', '<a><b><c k="v"/>v </b></a>')
- True
-
- """
- if isinstance(xml1, basestring):
- xml1 = fromstring(xml1)
- if isinstance(xml2, basestring):
- xml2 = fromstring(xml2)
- if xml1.tag != xml2.tag:
- return False
- if xml1.attrib != xml2.attrib:
- return False
- if xml1.text:
- if not xml2.text:
- return False
- if xml2.text:
- if not xml1.text:
- return False
- if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
- return False
- if xml1.tail is not None and xml2.tail is not None:
- if xml1.tail.strip() != xml2.tail.strip():
- return False
- elif xml1.tail != xml2.tail:
- return False
- children1 = list(xml1.getchildren())
- children2 = list(xml2.getchildren())
- if len(children1) != len(children2):
- return False
- for child1, child2 in zip(children1, children2):
- return equal_xml(child1, child2)
- return True
+ return pythoncorecpythontests.test_ats3_aste.equal_xml(xml1, xml2)
def setup_module():
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_atsconfigparser.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_atsconfigparser.py Mon Oct 18 10:23:52 2010 +0100
@@ -100,3 +100,64 @@
self.assert_( '<property name="HARNESS2" value="STIF2"/>' in output)
self.assert_( '<property name="HARNESS2" value="STIF3"/>' not in output)
self.assert_( '<property name="HARNESS3" value="STIF2"/>' in output)
+
+
+ def test_converttestxml_ats4(self):
+ spectext = """<ATSConfigData>
+ <config name="common" abstract="true">
+
+ <!-- Properties to add/modify -->
+ <config type="properties">
+ <set name="HARNESS" value="STIFx" />
+ <set name="HARNESS2" value="STIF2"/>
+ <set name="HARNESS3" value="STIF2"/>
+ <set name="2" value="3" />
+ </config>
+
+ <!-- Attributes to modify -->
+ <config type="attributes">
+ <set name="xyz" value="2" />
+ <set name="significant" value="true" />
+ </config>
+
+ </config>
+</ATSConfigData>
+ """
+ testxmldataats4 = """<testrun>
+ <metadata>
+ <meta name="name">mybuild</meta>
+ </metadata>
+
+ <agents>
+ <agent alias="DEFAULT_GENERIC">
+ <property name="hardware" value="product"/>
+ </agent>
+ </agents>
+
+ <execution defaultAgent="DEFAULT_GENERIC">
+ <initialization>
+ </initialization>
+
+ <finalization>
+ </finalization>
+ </execution>
+
+ <postActions>
+ </postActions>
+</testrun>
+ """
+
+ (file_descriptor, filename) = tempfile.mkstemp()
+ file_handle = os.fdopen(file_descriptor, 'w')
+ file_handle.write(spectext)
+ file_handle.close()
+
+ output = ats3.atsconfigparser.converttestxml(filename, testxmldataats4)
+ os.remove(filename)
+
+ self.assert_( '<property name="2" value="3"/>' in output)
+ self.assert_( '<property name="HARNESS" value="STIFx"/>' in output)
+ self.assert_( '<property name="HARNESS" value="STIF"/>' not in output)
+ self.assert_( '<property name="HARNESS2" value="STIF2"/>' in output)
+ self.assert_( '<property name="HARNESS2" value="STIF3"/>' not in output)
+ self.assert_( '<property name="HARNESS3" value="STIF2"/>' in output)
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_bootup_testing.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,147 @@
+# -*- coding: latin-1 -*-
+
+#============================================================================
+#Name : test_bootup_testing.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing Bootup tests framework. """
+
+# pylint: disable=E1101
+
+import logging
+logging.getLogger().setLevel(logging.INFO)
+import os
+#import shutil
+from path import path
+import ats3.bootup_testing
+import tempfile
+import zipfile
+import platform
+
+TEST_PATH = None
+TEST_FILES = {}
+OUTPUT = None
+TOTAL_TESTS_COUNT = 3
+
+
+class Bunch(object):
+ """ Configuration object. Argument from constructor are converted into class attributes. """
+ def __init__(self, **kwargs):
+ self.__dict__.update(kwargs)
+
+class SetUp(object):
+ """ Setup the module. """
+
+ def __init__(self):
+ """ Setup test environment. """
+ global TEST_PATH, OUTPUT
+
+ TEST_PATH = path(tempfile.mkdtemp())
+ component = TEST_PATH
+ component.joinpath("ats_build_drive").makedirs()
+ for path_parts in (("output", "images", "image1.fpsx"),
+ ("output", "images", "image2.fpsx"),
+ ("output", "ats", "temp.txt")):
+ filepath = component.joinpath(*path_parts)
+ if not filepath.parent.exists():
+ filepath.parent.makedirs()
+ filepath.touch()
+ TEST_FILES.setdefault(path_parts[1], []).append(filepath)
+
+ OUTPUT = component.joinpath(r"output")
+
+ if not filepath.parent.exists():
+ filepath.parent.makedirs()
+ filepath.touch()
+
+
+def teardown_module(test_run_count):
+ """ stuff to do after running the tests """
+
+ if test_run_count == 0:
+ path(TEST_PATH).rmtree()
+
+class TestBootupTestPlan(SetUp):
+ """ test BootupTestDrop.py """
+
+ def __init__(self):
+ """initialize bootup Tests"""
+ SetUp.__init__(self)
+ self.file_store = OUTPUT
+ self.build_drive = "j:"
+ self.drop_file = path(r"%s/ats/ATSBootupDrop.zip" %OUTPUT).normpath()
+
+ image_files = r"%s/images/image1.fpsx, %s/images/image2.fpsx " % (OUTPUT, OUTPUT)
+ self.flash_images = image_files
+ self.config = None
+
+ def read_xml(self, file_location, zip_file=False):
+ """reads test.xml file if a path is given"""
+
+ xml_text = ""
+ file_location = path(file_location)
+ if zip_file:
+ if zipfile.is_zipfile(file_location):
+ myzip = zipfile.ZipFile(file_location, 'r')
+ xml_text = myzip.read('test.xml')
+ myzip.close()
+
+ else:
+ hnd = open(file_location, 'r')
+ for line in hnd.readlines():
+ xml_text = xml_text + line
+
+ return xml_text
+
+ def test_xml_file(self):
+ """ test bootup_testing.py generates correct test.xml file"""
+ global TOTAL_TESTS_COUNT
+ opts = Bunch(build_drive=self.build_drive,
+ drop_file=path(r"%s/ats/ATSBootupDrop.zip" %OUTPUT).normpath(),
+ flash_images=self.flash_images,
+ template_loc="",
+ file_store=self.file_store,
+ report_email="firstname.lastname@domain.com",
+ testrun_name="Bootup test run",
+ alias_name="alias",
+ device_type="new_device",
+ diamonds_build_url="http://diamonds.com/1234",
+ email_format="simplelogger",
+ email_subject="Bootup test report",
+ verbose="false")
+
+ self.config = ats3.bootup_testing.Configuration(opts)
+ ats3.bootup_testing.create_drop(self.config)
+
+ xml_loc = os.path.join(os.environ['TEST_DATA'], 'data/bootup_testing/test_bootup.xml')
+ stored_xml = self.read_xml(xml_loc, False).strip()
+ drop_loc = os.path.join(OUTPUT, 'ats/ATSBootupDrop.zip')
+ generated_xml = self.read_xml(drop_loc, True).strip()
+
+ if platform.system().lower() == "linux":
+ assert stored_xml.replace('\r', '') in generated_xml
+ else:
+ assert stored_xml in generated_xml
+
+ TOTAL_TESTS_COUNT -= 1
+ teardown_module(TOTAL_TESTS_COUNT)
+
+
+
+
+
\ No newline at end of file
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_buildmodel.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_buildmodel.py Mon Oct 18 10:23:52 2010 +0100
@@ -77,7 +77,7 @@
class BOMTest(unittest.TestCase):
""" Test BOM and related classes. """
-# TODO - removed until non-Synergy dependent tests can be provided.
+# Removed until non-Synergy dependent tests can be provided.
# def test_bom_output(self):
# """ Test basic BOM execution. Only new spec format will be covered!"""
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_logger.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_logger.py Mon Oct 18 10:23:52 2010 +0100
@@ -21,6 +21,7 @@
import logging
import os
import unittest
+import urllib2
import helium.logger
import helium.outputer
@@ -88,10 +89,13 @@
mclogger.WriteToFile('log.xml')
_logger.info(mclogger)
-
- out = helium.outputer.XML2XHTML('log.xml')
- out.generate()
- out.WriteToFile('log.html')
+
+ try:
+ out = helium.outputer.XML2XHTML('log.xml')
+ out.generate()
+ out.WriteToFile('log.html')
+ except urllib2.URLError, e:
+ _logger.warning('Test cannont run properly as the configuration url cannot be accessed properly.')
os.unlink('log.xml')
os.unlink('log.html')
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_matti.py Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +0,0 @@
-# -*- coding: latin-1 -*-
-
-#============================================================================
-#Name : test_matti.py
-#Part of : Helium
-
-#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 the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Testing MATTI framework. """
-
-# pylint: disable=E1101
-
-import logging
-logging.getLogger().setLevel(logging.ERROR)
-import os
-#import shutil
-from path import path
-import ats3.aste
-import ats3.matti.MattiDrops
-import tempfile
-
-TEST_FILE_NAME = 'test.xml'
-ZIP_FILE_NAME = os.path.join(tempfile.mkdtemp(), 'MATTIDrop.zip')
-
-class Bunch(object):
- """do something with the paramerters passed to it"""
- def __init__(self, **kwargs):
- self.__dict__.update(kwargs)
-
-
-def equal_xml(result, expect):
- """Check the equality of the given XML snippets. """
-# logging.info(" expect %s" % expect)
-# xml1 = objectify.fromstring(expect)
-# expect1 = etree.tostring(xml1)
-# logging.info(" expect1 %s" % expect1)
-# logging.info(" expect2 -------------%s" % expect2)
-#
-# xml2 = objectify.fromstring(result)
-# result2 = etree.tostring(xml2)
-# self.assertEquals(expect1, result1)
-#
-# if xml1.tag != xml2.tag:
-# return False
-# if xml1.attrib != xml2.attrib:
-# return False
-# if xml1.text:
-# if not xml2.text:
-# return False
-# if xml2.text:
-# if not xml1.text:
-# return False
-# if xml1.text and xml2.text and xml1.text.strip() != xml2.text.strip():
-# return False
-# if xml1.tail is not None and xml2.tail is not None:
-# if xml1.tail.strip() != xml2.tail.strip():
-# return False
-# elif xml1.tail != xml2.tail:
-# return False
-# children1 = list(xml1.getchildren())
-# children2 = list(xml2.getchildren())
-# if len(children1) != len(children2):
-# return False
-# for child1, child2 in zip(children1, children2):
-# return equal_xml(child1, child2)
-# return True
- if expect:
- return result
-
-
-def setup_module():
- """ stuff to do before running the tests """
- pass
-
-def teardown_module():
- """ stuff to do after running the tests """
- if os.path.exists(TEST_FILE_NAME):
- os.remove(TEST_FILE_NAME)
- if os.path.exists(ZIP_FILE_NAME):
- os.remove(ZIP_FILE_NAME)
-
-
-class TestPlanMatti():
- """ test MattiDrop.py """
- def __init__(self):
- self.config = None
- self.tp_result = None
-
- (_, self.image1) = tempfile.mkstemp()
- (_, self.image2) = tempfile.mkstemp()
- (_, self.image3) = tempfile.mkstemp()
- (_, self.sis1) = tempfile.mkstemp()
- (_, self.sis2) = tempfile.mkstemp()
-
- def test_all_present(self):
- """ test mattiDrops.py with all parameters present and correct"""
- teardown_module()
- opts = Bunch(build_drive="z:",
- matti_scripts=os.path.join(os.environ['TEST_DATA'], 'data/matti'),
- flash_images = '%s,%s,%s' % (self.image1, self.image2, self.image3),
- report_email="", harness="STIF",
- file_store=path(), testrun_name="testrun",
- device_type="product", device_hwid="5425", diamonds_build_url="", drop_file=ZIP_FILE_NAME,
- minimum_flash_images="2", plan_name="matti_test_plan",
- sis_files = '%s,%s' % (self.sis1, self.sis2),
- template_loc=os.path.join(os.path.dirname(__file__), '../ats3/matti/template/matti_demo.xml'),
- test_timeout="60", verbose="false")
-
- self.config = ats3.matti.MattiDrops.Configuration(opts)
- self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
- assert os.path.exists(ZIP_FILE_NAME)
- assert os.path.exists(TEST_FILE_NAME)
- #shutil.copy(TEST_FILE_NAME, os.path.join(TMPDIR, 'test_all_present.xml'))
- #equal_xml(TEST_FILE_NAME, os.path.join(TMPDIR, 'test_all_present.xml'))
-
- def test_no_sis_or_flash_files(self):
- """test mattiDrops.py with no sis or flash files in the parameters"""
- teardown_module()
- opts = Bunch(build_drive="z:",
- matti_scripts=os.path.join(os.environ['TEST_DATA'], 'data/matti'),
- flash_images = "",
- report_email="", harness="STIF",
- file_store=path(), testrun_name="testrun",
- device_type="product", device_hwid="5425", diamonds_build_url="", drop_file=ZIP_FILE_NAME,
- minimum_flash_images="2", plan_name="matti_test_plan",
- sis_files= "",
- template_loc=os.path.join(os.path.dirname(__file__), '../ats3/matti/template/matti_demo.xml'),
- test_timeout="60", verbose="true")
-
- self.config = ats3.matti.MattiDrops.Configuration(opts)
- self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
- assert os.path.exists(ZIP_FILE_NAME)
- assert os.path.exists(TEST_FILE_NAME)
- #shutil.copy(TEST_FILE_NAME, os.path.join(TMPDIR, 'test_no_sis_or_flash.xml'))
- #equal_xml(TEST_FILE_NAME, os.path.join(TMPDIR, 'test_no_sis_or_flash.xml'))
-
-
- def test_no_files(self):
- """ test mattiDtops.py with no filespresent at all"""
- teardown_module()
- opts = Bunch(build_drive="z:",
- matti_scripts=tempfile.mkdtemp(),
- flash_images = "",
- report_email="", harness="STIF",
- file_store=path(), testrun_name="testrun",
- device_type="product", device_hwid="5425", diamonds_build_url="", drop_file=ZIP_FILE_NAME,
- minimum_flash_images="2", plan_name="matti_test_plan",
- sis_files= "",
- template_loc=os.path.join(os.path.dirname(__file__), '../ats3/matti/template/matti_demo.xml'),
- test_timeout="60", verbose="true")
- self.config = ats3.matti.MattiDrops.Configuration(opts)
- self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
- assert not os.path.exists(ZIP_FILE_NAME)
- assert os.path.exists(TEST_FILE_NAME)
- #shutil.copy(TEST_FILE_NAME, os.path.join(TMPDIR, 'test_no_files.xml'))
- #equal_xml(TEST_FILE_NAME, os.path.join(TMPDIR, 'test_no_files.xml'))
-
- def test_no_params(self):
- """test MattiDrops.py with no parameters present at all"""
- teardown_module()
- opts = Bunch(build_drive="",
- matti_scripts="",
- flash_images = "",
- report_email="", harness="",
- file_store="", testrun_name="",
- device_type="", device_hwid="", diamonds_build_url="", drop_file="",
- minimum_flash_images="", plan_name="",
- sis_files= "",
- template_loc="",
- test_timeout="", verbose="true")
-
- self.config = ats3.matti.MattiDrops.Configuration(opts)
- self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
- assert not os.path.exists(ZIP_FILE_NAME)
- assert not os.path.exists(TEST_FILE_NAME)
-
- def test_some_not_present(self):
- """ test MattiDrops.py with an extra file not present in the dir"""
- teardown_module()
- opts = Bunch(build_drive="z:",
- matti_scripts=os.path.join(os.environ['TEST_DATA'], 'data/matti'),
- flash_images = '%s,%s,%s' % (self.image1, self.image2, self.image3),
- report_email="", harness="STIF",
- file_store=path(), testrun_name="testrun",
- device_type="product", device_hwid="5425", diamonds_build_url="", drop_file=ZIP_FILE_NAME,
- minimum_flash_images="2", plan_name="matti_test_plan",
- sis_files = '%s,%s' % (self.sis1, self.sis2),
- template_loc=os.path.join(os.path.dirname(__file__), '../ats3/matti/template/matti_demo.xml'),
- test_timeout="60", verbose="false")
-
- self.config = ats3.matti.MattiDrops.Configuration(opts)
- self.tp_result = ats3.matti.MattiDrops.create_drop(self.config)
- assert os.path.exists(ZIP_FILE_NAME)
- assert os.path.exists(TEST_FILE_NAME)
- #shutil.copy(TEST_FILE_NAME, os.path.join(TMPDIR, 'test_some_not_present.xml'))
- #equal_xml(TEST_FILE_NAME, os.path.join(TMPDIR, 'test_some_not_present.xml'))
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_matti2.py Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,294 +0,0 @@
-# -*- coding: latin-1 -*-
-
-#============================================================================
-#Name : test_matti2.py
-#Part of : Helium
-
-#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 the License "Eclipse Public License v1.0"
-#which accompanies this distribution, and is available
-#at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-#Initial Contributors:
-#Nokia Corporation - initial contribution.
-#
-#Contributors:
-#
-#Description:
-#===============================================================================
-
-""" Testing MATTI framework. """
-
-# pylint: disable=E1101
-
-import logging
-logging.getLogger().setLevel(logging.INFO)
-import os
-#import shutil
-from path import path
-import ats3.matti2
-import tempfile
-import zipfile
-import platform
-
-TEST_PATH = None
-TEST_FILES = {}
-MATTI = None
-OUTPUT = None
-SISFILES = None
-TOTAL_TESTS_COUNT = 3
-
-
-class Bunch(object):
- """ Configuration object. Argument from constructor are converted into class attributes. """
- def __init__(self, **kwargs):
- self.__dict__.update(kwargs)
-
-class SetUp(object):
- """ Setup the module. """
-
- def __init__(self):
- """ Setup test environment. """
- global TEST_PATH, MATTI, OUTPUT, SISFILES
-
- TEST_PATH = path(tempfile.mkdtemp())
- component = TEST_PATH
- component.joinpath("matti").makedirs()
- for path_parts in (("matti_testcases", "profile", "all.sip"),
- ("matti_testcases", "profile", "bat.sip"),
- ("matti_testcases", "profile", "fute.sip"),
- ("matti_testcases", "hwdata", "paths.pkg"),
- ("matti_testcases", "hwdata", "file1.txt"),
- ("matti_testcases", "hwdata", "settings.ini"),
- ("matti_testcases", "matti_parameters", "matti_parameters.xml"),
- ("matti_testcases", "unit_test1.rb"),
- ("matti_testcases", "unit_test2.rb"),
- ("output", "images", "image1.fpsx"),
- ("output", "images", "image2.fpsx"),
- ("sisfiles", "abc.sis"),
- ("sisfiles", "xyz.sis"),
- ("output", "ats", "temp.txt")):
- filepath = component.joinpath(*path_parts)
- if not filepath.parent.exists():
- filepath.parent.makedirs()
- filepath.touch()
- TEST_FILES.setdefault(path_parts[1], []).append(filepath)
-
- OUTPUT = component.joinpath(r"output")
- MATTI = component.joinpath("matti_testcases")
- SISFILES = component.joinpath(r"sisfiles")
-
- if not filepath.parent.exists():
- filepath.parent.makedirs()
- filepath.touch()
-
- #mtc => matti_testcases
- mtc = component.joinpath("matti_testcases")
- mtc.joinpath("unit_test1.rb").write_text("unit_tests")
- mtc.joinpath("unit_test2.rb").write_text("unit_tests")
-
- # profiles
- profiles = component.joinpath("matti_testcases", "profile")
- profiles.joinpath("all.sip").write_text("sip profile")
- profiles.joinpath("bat.sip").write_text("sip profile")
- profiles.joinpath("fute.sip").write_text("sip profile")
-
- #hwdata => hardware data
- profiles = component.joinpath("matti_testcases", "hwdata")
- profiles.joinpath("file1.txt").write_text("data file")
- profiles.joinpath("settings.ini").write_text("settings initialization file")
- profiles.joinpath("paths.pkg").write_text(
- r"""
- ;Language - standard language definitions
- &EN
-
- ; standard SIS file header
- #{"BTEngTestApp"},(0x04DA27D5),1,0,0
-
- ;Supports Series 60 v 3.0
- (0x101F7961), 0, 0, 0, {"Series60ProductID"}
-
- ;Localized Vendor Name
- %{"BTEngTestApp"}
-
- ;Unique Vendor name
- :"Nokia"
-
- ; Files to copy
-
- "[PKG_LOC]\file1.txt"-"C:\Private\10202BE9\PERSISTS\file1.txt"
- "[PKG_LOC]\settings.ini"-"c:\sys\settings.ini"
- """.replace('\\', os.sep))
-
-
-def teardown_module(test_run_count):
- """ stuff to do after running the tests """
-
- if test_run_count == 0:
- path(TEST_PATH).rmtree()
-
-class TestMattiTestPlan(SetUp):
- """ test MattiDrop.py """
- global OUTPUT, MATTI, SISFILES
-
- def __init__(self):
- """initialize Matti Tests"""
- SetUp.__init__(self)
- self.file_store = OUTPUT
- self.test_asset_path = MATTI
- self.matti_sis_files = r"%s/abc.sis#f:\data\abc.sis#c:\abc.sis, %s/xyz.sis#f:\data\abc.sis#f:\xyz.sis" % (SISFILES, SISFILES)
- self.build_drive = "j:"
- self.drop_file = path(r"%s/ats/ATSMattiDrop.zip" %OUTPUT).normpath()
-
- image_files = r"%s/images/image1.fpsx, %s/images/image2.fpsx " % (OUTPUT, OUTPUT)
- self.flash_images = image_files
-
- self.template_loc = os.path.join(os.environ['TEST_DATA'], 'data/matti/matti_template.xml')
- self.template_loc = os.path.normpath(self.template_loc)
- self.matti_parameters = ""
- self.config = None
-
- def read_xml(self, file_location, zip_file=False):
- """reads test.xml file if a path is given"""
-
- xml_text = ""
- file_location = path(file_location)
- if zip_file:
- if zipfile.is_zipfile(file_location):
- myzip = zipfile.ZipFile(file_location, 'r')
- xml_text = myzip.read('test.xml')
- myzip.close()
-
- else:
- hnd = open(file_location, 'r')
- for line in hnd.readlines():
- xml_text = xml_text + line
-
- return xml_text
-
- def test_xml_with_all_parameters(self):
- """ test Matti2.py with all parameters present and correct and sierra is enabled"""
- global TOTAL_TESTS_COUNT
- opts = Bunch(build_drive=self.build_drive,
- drop_file=path(r"%s/ats/ATSMattiDrop1.zip" %OUTPUT).normpath(),
- flash_images=self.flash_images,
- matti_sis_files=self.matti_sis_files,
- testasset_location=self.test_asset_path,
- template_loc=self.template_loc,
- sierra_enabled="True",
- test_profiles="bat, fute",
- matti_parameters="",
- matti_timeout="1200",
- sierra_parameters="--teardown",
- file_store=self.file_store,
- report_email="firstname.lastname@domain.com",
- testrun_name="matti test run",
- alias_name="alias",
- device_type="new_device",
- diamonds_build_url="http://diamonds.com/1234",
- email_format="simplelogger",
- email_subject="Matti test report",
- verbode="false")
-
- self.config = ats3.matti2.Configuration(opts)
- ats3.matti2.create_drop(self.config)
-
- xml_loc = os.path.join(os.environ['TEST_DATA'], 'data/matti/test_all_present.xml')
- stored_xml = self.read_xml(xml_loc, False).strip()
- drop_loc = os.path.join(OUTPUT, 'ats/ATSMattiDrop1.zip')
- generated_xml = self.read_xml(drop_loc, True).strip()
-
- if platform.system().lower() == "linux":
- assert stored_xml.replace('\r', '') in generated_xml
- else:
- assert stored_xml in generated_xml
-
- TOTAL_TESTS_COUNT -= 1
- teardown_module(TOTAL_TESTS_COUNT)
-
- def test_xml_if_sierra_is_not_enabled(self):
- """ test Matti2.py with all parameters present and correct and sierra is not enabled (or false)"""
- global TOTAL_TESTS_COUNT
- opts = Bunch(build_drive=self.build_drive,
- drop_file=path(r"%s/ats/ATSMattiDrop2.zip" %OUTPUT).normpath(),
- flash_images=self.flash_images,
- matti_sis_files=self.matti_sis_files,
- testasset_location=self.test_asset_path,
- template_loc=self.template_loc,
- sierra_enabled="False",
- test_profiles="bat, fute",
- matti_parameters="",
- matti_timeout="1200",
- sierra_parameters="--teardown",
- file_store=self.file_store,
- report_email="firstname.lastname@domain.com",
- testrun_name="matti test run",
- alias_name="alias",
- device_type="new_device",
- diamonds_build_url="http://diamonds.com/1234",
- email_format="simplelogger",
- email_subject="Matti test report",
- verbode="false")
-
- self.config = ats3.matti2.Configuration(opts)
- ats3.matti2.create_drop(self.config)
-
- xml_loc = os.path.join(os.environ['TEST_DATA'], 'data/matti/test_all_present_sierra_disabled.xml')
- stored_xml = self.read_xml(xml_loc, False).strip()
- drop_loc = os.path.join(OUTPUT, 'ats/ATSMattiDrop2.zip')
- generated_xml = self.read_xml(drop_loc, True).strip()
-
- if platform.system().lower() == "linux":
- assert stored_xml.replace('\r', '') in generated_xml
- else:
- assert stored_xml in generated_xml
-
- TOTAL_TESTS_COUNT -= 1
- teardown_module(TOTAL_TESTS_COUNT)
-
- def test_xml_if_sierra_is_enabled_template_location_is_missing(self):
- """ test Matti2.py with all parameters present and correct and if sierra is enabled but template location is used as default one"""
- global TOTAL_TESTS_COUNT
- opts = Bunch(build_drive=self.build_drive,
- drop_file=path(r"%s/ats/ATSMattiDrop3.zip" %OUTPUT).normpath(),
- flash_images=self.flash_images,
- matti_sis_files=self.matti_sis_files,
- testasset_location=self.test_asset_path,
- template_loc="",
- sierra_enabled="True",
- test_profiles="bat, fute",
- matti_parameters="",
- matti_timeout="1200",
- sierra_parameters="--teardown",
- file_store=self.file_store,
- report_email="firstname.lastname@domain.com",
- testrun_name="matti test run",
- alias_name="alias",
- device_type="new_device",
- diamonds_build_url="http://diamonds.com/1234",
- email_format="simplelogger",
- email_subject="Matti test report",
- verbode="false")
-
- self.config = ats3.matti2.Configuration(opts)
- ats3.matti2.create_drop(self.config)
-
- xml_loc = os.path.join(os.environ['TEST_DATA'], 'data/matti/test_all_present.xml')
- stored_xml = self.read_xml(xml_loc, False).strip()
- drop_loc = os.path.join(OUTPUT, 'ats/ATSMattiDrop3.zip')
- generated_xml = self.read_xml(drop_loc, True).strip()
-
- if platform.system().lower() == "linux":
- assert stored_xml.replace('\r', '') in generated_xml
- else:
- assert stored_xml in generated_xml
-
- TOTAL_TESTS_COUNT -= 1
- teardown_module(TOTAL_TESTS_COUNT)
-
-
-
-
-
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_quality.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,59 @@
+#============================================================================
+#Name : test_quality.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+"""Test the archive.py module."""
+
+from __future__ import with_statement
+import os
+import unittest
+import logging
+import fileutils
+import pythoncorecpythontests.test_fileutils
+import integration.quality
+
+_logger = logging.getLogger('test.quality')
+
+
+root_test_dir = pythoncorecpythontests.test_fileutils.root_test_dir
+
+def setup_module():
+ """ Creates some test data files for file-related testing. """
+ pythoncorecpythontests.test_fileutils.setup_module()
+
+def teardown_module():
+ """ Cleans up test data files for file-related testing. """
+ pythoncorecpythontests.test_fileutils.teardown_module()
+
+
+class QualityTest(unittest.TestCase):
+
+ def test_epl_validate_content(self):
+ """Tests loading policy ID's from CSV file for EPL"""
+ pattern = "distribution.policy.s60,distribution.policy,distribution.policy.pp"
+ ignoreroot = False
+ excludes = ".static_wa,_ccmwaid.inf"
+ validator = integration.quality.PolicyValidator(pattern, ignoreroot=ignoreroot, excludes=excludes)
+
+ validator.epl_load_policy_ids(os.path.join(os.environ['TEST_DATA'], 'data/distribution.policy.extended_for_sf.id_status.csv'))
+
+ assert validator.epl_validate_content(os.path.join(os.environ['TEST_DATA'], 'data/distribution.policy.S60')) == True
+ assert validator.epl_validate_content(os.path.join(os.environ['TEST_DATA'], 'data/Invalid_distribution.policy.S60')) == False
+
+if __name__ == "__main__":
+ unittest.main()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_sphinx_ext.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,121 @@
+#============================================================================
+#Name : test_sphinx_ext.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Test sphinx_ext module. """
+import re
+
+import logging
+import os
+import time
+import unittest
+import sys
+import mocker
+import sphinx_ext
+
+_logger = logging.getLogger('test.sphinx_ext')
+random_number = 10
+
+class SphinxTest(mocker.MockerTestCase):
+ """ Class for testing sphinx_ext module """
+ def __init__(self, methodName="runTest"):
+ mocker.MockerTestCase.__init__(self, methodName)
+
+ def setUp(self):
+ # some dummy input
+ self.inlineDocument = r'<document source="C:\helium-working\helium\build\temp\doc\api\helium\macros_list.rst"><section ids="macros-list" names="macros\ list"><title>Macros list</title></section></document>'
+ sphinx_ext.exit_with_failure = 0
+ sphinx_ext.database_path = os.path.join(os.environ['TEST_DATA'], "data", "test_database.xml")
+
+ def test_handle_hlm_role_callback(self):
+ """ Check roles and description unit."""
+ obj = _MockApp()
+ sphinx_ext.setup(obj)
+ assert 'hlm-t' in obj.dict.keys()
+ assert 'hlm-p' in obj.dict.keys()
+ assert 'hlm-m' in obj.dict.keys()
+ assert sphinx_ext.handle_hlm_role == obj.dict['hlm-t']
+ assert sphinx_ext.handle_hlm_role == obj.dict['hlm-p']
+ assert sphinx_ext.handle_hlm_role == obj.dict['hlm-m']
+ assert ['property', 'ant-prop', 'pair: %s; property'] in obj.descUnit
+ assert ['target', 'ant-target', 'pair: %s; target'] in obj.descUnit
+
+ def test_handle_hlm_role_target(self):
+ """ Check target to build the link """
+ obj = self.mocker.mock(count=False)
+ mocker.expect(obj.document).result(self.inlineDocument)
+ self.mocker.replay()
+ response = sphinx_ext.handle_hlm_role('hlm-t' , "", 'cmaker-install', random_number, obj)
+ assert "../../api/helium/project-compile.cmaker.html#cmaker-install" in response[0][0].children[0].attributes['refuri']
+
+ def test_handle_hlm_role_property(self):
+ """ Check property to build the link """
+ obj = self.mocker.mock(count=False)
+ mocker.expect(obj.document).result(self.inlineDocument)
+ self.mocker.replay()
+ response = sphinx_ext.handle_hlm_role('hlm-p' , "", 'cmaker-export', random_number, obj)
+ assert "../../api/helium/project-compile.cmaker.html#cmaker-export" in response[0][0].children[0].attributes['refuri']
+
+
+ def test_handle_hlm_role_macro(self):
+ """ Check macro to build the link """
+ obj = self.mocker.mock(count=False)
+ mocker.expect(obj.document).result(self.inlineDocument)
+ self.mocker.replay()
+ response = sphinx_ext.handle_hlm_role('hlm-m' , "", 'cmaker-export', random_number, obj)
+ assert "../../api/helium/project-compile.cmaker.html#cmaker-export" in response[0][0].children[0].attributes['refuri']
+
+ def test_handle_hlm_role_missing_api(self):
+ """ Check for failure when there are missing api's """
+ error = ""
+ line = ""
+ obj = self.mocker.mock(count=False)
+ mocker.expect(obj.document).result(self.inlineDocument)
+ mocker.expect(obj.reporter.error('Missing API doc for "cmaker-clean".', line=random_number)).result('Missing API doc for "cmaker-clean".')
+ self.mocker.replay()
+ sphinx_ext.handle_hlm_role('hlm-t' , "", 'cmaker-clean', random_number, obj)
+
+ def test_handle_hlm_role_missing_field_value(self):
+ """ Check for failure when there are missing fields for api's """
+ error = ""
+ line = ""
+ obj = self.mocker.mock(count=False)
+ mocker.expect(obj.document).result(self.inlineDocument)
+ mocker.expect(obj.reporter.error('Field value cannot be found for API field: "cmaker-export[summary]".', line=random_number)).result('Field value cannot be found for API field: "cmaker-export[summary]".')
+ self.mocker.replay()
+ sphinx_ext.handle_hlm_role('hlm-t' , "", 'cmaker-export[summary]', random_number, obj)
+
+ def test_handle_hlm_role_valid_field_value(self):
+ """ Check when there is '[' present """
+ obj = self.mocker.mock(count=False)
+ mocker.expect(obj.document).result(self.inlineDocument)
+ self.mocker.replay()
+ response = sphinx_ext.handle_hlm_role('hlm-t' , "", 'cmaker-export[location]', random_number, obj)
+ assert r"C:\Helium_svn\helium\tools\compile\cmaker.ant.xml:87:" in response[0][0].data
+
+class _MockApp:
+
+ def __init__(self):
+ self.dict = {}
+ self.descUnit = []
+
+ def add_role(self, role, ref):
+ self.dict[role] = ref
+
+ def add_description_unit(self, text1, text2, text3):
+ self.descUnit.append([text1, text2, text3])
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_tdriver.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,314 @@
+# -*- coding: latin-1 -*-
+
+#============================================================================
+#Name : test_tdriver.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" Testing TDriver framework. """
+
+# pylint: disable=E1101
+
+import logging
+logging.getLogger().setLevel(logging.INFO)
+import os
+#import shutil
+from path import path
+import ats3.tdriver
+import tempfile
+import zipfile
+import platform
+import unittest
+
+TEST_PATH = None
+TEST_FILES = {}
+TDRIVER = None
+OUTPUT = None
+SISFILES = None
+
+
+class Bunch(object):
+ """ Configuration object. Argument from constructor are converted into class attributes. """
+ def __init__(self, **kwargs):
+ self.__dict__.update(kwargs)
+
+def setup_module(_):
+ """ Setup the module. """
+ global TEST_PATH
+ global OUTPUT
+ global TDRIVER
+ global SISFILES
+
+ TEST_PATH = path(tempfile.mkdtemp())
+ component = TEST_PATH
+ component.joinpath("tdriver").makedirs()
+ for path_parts in (("tdriver_testcases", "profile", "all.sip"),
+ ("tdriver_testcases", "profile", "bat.sip"),
+ ("tdriver_testcases", "profile", "fute.sip"),
+ ("tdriver_testcases", "hwdata", "paths.pkg"),
+ ("tdriver_testcases", "hwdata", "file1.txt"),
+ ("tdriver_testcases", "hwdata", "settings.ini"),
+ ("tdriver_testcases", "tdriver_parameters", "tdriver_parameters.xml"),
+ ("tdriver_testcases", "unit_test1.rb"),
+ ("tdriver_testcases", "unit_test2.rb"),
+ ("output", "images", "image1.fpsx"),
+ ("output", "images", "image2.fpsx"),
+ ("sisfiles", "abc.sis"),
+ ("sisfiles", "xyz.sis"),
+ ("output", "ats", "temp.txt")):
+ filepath = component.joinpath(*path_parts)
+ if not filepath.parent.exists():
+ filepath.parent.makedirs()
+ filepath.touch()
+ TEST_FILES.setdefault(path_parts[1], []).append(filepath)
+
+ OUTPUT = component.joinpath(r"output")
+ TDRIVER = component.joinpath("tdriver_testcases")
+ SISFILES = component.joinpath(r"sisfiles")
+
+ if not filepath.parent.exists():
+ filepath.parent.makedirs()
+ filepath.touch()
+
+ #mtc => tdriver_testcases
+ mtc = component.joinpath("tdriver_testcases")
+ mtc.joinpath("unit_test1.rb").write_text("unit_tests")
+ mtc.joinpath("unit_test2.rb").write_text("unit_tests")
+
+ # profiles
+ profiles = component.joinpath("tdriver_testcases", "profile")
+ profiles.joinpath("all.sip").write_text("sip profile")
+ profiles.joinpath("bat.sip").write_text("sip profile")
+ profiles.joinpath("fute.sip").write_text("sip profile")
+
+ #hwdata => hardware data
+ profiles = component.joinpath("tdriver_testcases", "hwdata")
+ profiles.joinpath("file1.txt").write_text("data file")
+ profiles.joinpath("settings.ini").write_text("settings initialization file")
+ profiles.joinpath("paths.pkg").write_text(
+ r"""
+ ;Language - standard language definitions
+ &EN
+
+ ; standard SIS file header
+ #{"BTEngTestApp"},(0x04DA27D5),1,0,0
+
+ ;Supports Series 60 v 3.0
+ (0x101F7961), 0, 0, 0, {"Series60ProductID"}
+
+ ;Localized Vendor Name
+ %{"BTEngTestApp"}
+
+ ;Unique Vendor name
+ :"Nokia"
+
+ ; Files to copy
+
+ "[PKG_LOC]\file1.txt"-"C:\Private\10202BE9\PERSISTS\file1.txt"
+ "[PKG_LOC]\settings.ini"-"c:\sys\settings.ini"
+ """.replace('\\', os.sep))
+
+
+def teardown_module():
+ """ stuff to do after running the tests """
+ path(TEST_PATH).rmtree()
+
+class TestTDriverTestPlan(unittest.TestCase):
+ """ test TDriverDrop.py """
+
+ def setUp(self):
+ """initialize TDriver Tests"""
+ self.file_store = OUTPUT
+ self.test_asset_path = TDRIVER
+ self.tdriver_sis_files = r"%s/abc.sis#f:\data\abc.sis#c:\abc.sis, %s/xyz.sis#f:\data\abc.sis#f:\xyz.sis" % (SISFILES, SISFILES)
+ self.build_drive = "j:"
+ self.drop_file = path(r"%s/ats/ATSTDriverDrop.zip" %OUTPUT).normpath()
+
+ image_files = r"%s/images/image1.fpsx, %s/images/image2.fpsx " % (OUTPUT, OUTPUT)
+ self.flash_images = image_files
+
+ self.template_loc = os.path.join(os.environ['TEST_DATA'], 'data/tdriver/tdriver_template.xml')
+ self.template_loc = os.path.normpath(self.template_loc)
+ self.tdriver_parameters = ""
+ self.config = None
+
+ def read_xml(self, file_location, zip_file=False):
+ """reads test.xml file if a path is given"""
+
+ xml_text = ""
+ file_location = path(file_location)
+ if zip_file:
+ if zipfile.is_zipfile(file_location):
+ myzip = zipfile.ZipFile(file_location, 'r')
+ xml_text = myzip.read('test.xml')
+ myzip.close()
+ xml_text = xml_text.replace("\n", "")
+ xml_text = xml_text.replace("\t", "")
+
+ else:
+ hnd = open(file_location, 'r')
+ for line in hnd.readlines():
+ xml_text = xml_text + line.strip()
+
+ return xml_text
+
+ def test_xml_with_all_parameters(self):
+ """ test tdriver.py with all parameters present and correct and tdrunner is enabled"""
+ opts = Bunch(build_drive=self.build_drive,
+ drop_file=path(r"%s/ats/ATSTDriverDrop1.zip" %OUTPUT).normpath(),
+ flash_images=self.flash_images,
+ tdriver_sis_files=self.tdriver_sis_files,
+ testasset_location=self.test_asset_path,
+ template_loc=self.template_loc,
+ tdrunner_enabled="True",
+ test_profiles="bat, fute",
+ tdriver_parameters="",
+ tdriver_timeout="1200",
+ tdrunner_parameters="--teardown",
+ file_store="",
+ report_email="firstname.lastname@domain.com",
+ testrun_name="TDriver test run",
+ alias_name="alias",
+ device_type="new_device",
+ diamonds_build_url="http://diamonds.com/1234",
+ email_format="simplelogger",
+ email_subject="TDriver test report",
+ verbode="false")
+
+ self.config = ats3.tdriver.Configuration(opts)
+ ats3.tdriver.create_drop(self.config)
+
+ xml_loc = os.path.join(os.environ['TEST_DATA'], 'data/tdriver/test_all_present.xml')
+ stored_xml = self.read_xml(xml_loc, False).strip()
+ drop_loc = os.path.join(OUTPUT, 'ats/ATSTDriverDrop1.zip')
+ generated_xml = self.read_xml(drop_loc, True).strip()
+
+ if platform.system().lower() == "linux":
+ assert stored_xml.replace('\r', '') in generated_xml
+ else:
+ assert stored_xml in generated_xml
+
+
+ def test_xml_if_tdrunner_is_not_enabled(self):
+ """ test tdriver.py with all parameters present and correct and tdrunner is not enabled (or false)"""
+ opts = Bunch(build_drive=self.build_drive,
+ drop_file=path(r"%s/ats/ATSTDriverDrop2.zip" %OUTPUT).normpath(),
+ flash_images=self.flash_images,
+ tdriver_sis_files=self.tdriver_sis_files,
+ testasset_location=self.test_asset_path,
+ template_loc=self.template_loc,
+ tdrunner_enabled="False",
+ test_profiles="bat, fute",
+ tdriver_parameters="",
+ tdriver_timeout="1200",
+ tdrunner_parameters="--teardown",
+ file_store=r"\\network\drive",
+ report_email="firstname.lastname@domain.com",
+ testrun_name="TDriver test run",
+ alias_name="alias",
+ device_type="new_device",
+ diamonds_build_url="http://diamonds.com/1234",
+ email_format="simplelogger",
+ email_subject="TDriver test report",
+ verbode="false")
+
+ self.config = ats3.tdriver.Configuration(opts)
+ ats3.tdriver.create_drop(self.config)
+
+ xml_loc = os.path.join(os.environ['TEST_DATA'], 'data/tdriver/test_all_present_tdrunner_disabled.xml')
+ stored_xml = self.read_xml(xml_loc, False).strip()
+ drop_loc = os.path.join(OUTPUT, 'ats/ATSTDriverDrop2.zip')
+ generated_xml = self.read_xml(drop_loc, True).strip()
+
+ if platform.system().lower() == "linux":
+ assert stored_xml.replace('\r', '') in generated_xml
+ else:
+ assert stored_xml in generated_xml
+
+
+ def test_xml_if_tdrunner_is_enabled_template_location_is_missing(self):
+ """ test tdriver.py with all parameters present and correct and if tdrunner is enabled but template location is used as default one"""
+ opts = Bunch(build_drive=self.build_drive,
+ drop_file=path(r"%s/ats/ATSTDriverDrop3.zip" %OUTPUT).normpath(),
+ flash_images=self.flash_images,
+ tdriver_sis_files=self.tdriver_sis_files,
+ testasset_location=self.test_asset_path,
+ template_loc="",
+ tdrunner_enabled="True",
+ test_profiles="bat, fute",
+ tdriver_parameters="",
+ tdriver_timeout="1200",
+ tdrunner_parameters="--teardown",
+ file_store="",
+ report_email="firstname.lastname@domain.com",
+ testrun_name="TDriver test run",
+ alias_name="alias",
+ device_type="new_device",
+ diamonds_build_url="http://diamonds.com/1234",
+ email_format="simplelogger",
+ email_subject="TDriver test report",
+ verbode="false")
+
+ self.config = ats3.tdriver.Configuration(opts)
+ ats3.tdriver.create_drop(self.config)
+
+ xml_loc = os.path.join(os.environ['TEST_DATA'], 'data/tdriver/test_all_present.xml')
+ stored_xml = self.read_xml(xml_loc, False).strip()
+ drop_loc = os.path.join(OUTPUT, 'ats/ATSTDriverDrop3.zip')
+ generated_xml = self.read_xml(drop_loc, True).strip()
+
+ if platform.system().lower() == "linux":
+ assert stored_xml.replace('\r', '') in generated_xml
+ else:
+ assert stored_xml in generated_xml
+
+ def test_ctc(self):
+ """ test ctc """
+ opts = Bunch(build_drive=self.build_drive,
+ drop_file=path(r"%s/ats/ATSTDriverDrop3.zip" %OUTPUT).normpath(),
+ flash_images=self.flash_images,
+ tdriver_sis_files=self.tdriver_sis_files,
+ testasset_location=self.test_asset_path,
+ template_loc="",
+ tdrunner_enabled="True",
+ test_profiles="bat, fute",
+ tdriver_parameters="",
+ tdriver_timeout="1200",
+ tdrunner_parameters="--teardown",
+ file_store="",
+ report_email="firstname.lastname@domain.com",
+ testrun_name="TDriver test run",
+ alias_name="alias",
+ device_type="new_device",
+ diamonds_build_url="http://diamonds.com/1234",
+ email_format="simplelogger",
+ email_subject="TDriver test report",
+ verbode="false",
+ ctc_enabled=True)
+
+ self.config = ats3.tdriver.Configuration(opts)
+ ats3.tdriver.create_drop(self.config)
+
+ xml_loc = os.path.join(os.environ['TEST_DATA'], 'data/tdriver/test_ctc.xml')
+ stored_xml = self.read_xml(xml_loc, False).strip()
+ drop_loc = os.path.join(OUTPUT, 'ats/ATSTDriverDrop3.zip')
+ generated_xml = self.read_xml(drop_loc, True).strip()
+
+ if platform.system().lower() == "linux":
+ assert stored_xml.replace('\r', '') in generated_xml
+ else:
+ assert stored_xml in generated_xml
\ No newline at end of file
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_timeout_launcher.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncorecpythontests/test_timeout_launcher.py Mon Oct 18 10:23:52 2010 +0100
@@ -32,9 +32,9 @@
# Platform
WINDOWS = False
if sys.platform == "win32":
- import win32process
+# import win32process
import win32con
- import win32api
+# import win32api
WINDOWS = True
@@ -175,6 +175,6 @@
failed = False
try:
timeout_launcher.main()
- except Exception:
+ except (OSError, IOError):
failed = True
assert failed
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_amara.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_amara.py Mon Oct 18 10:23:52 2010 +0100
@@ -31,12 +31,16 @@
"""test amara"""
xxx = amara.parse(r'<commentLog><branchInfo category="" error="kkk" file="tests/data/comments_test.txt" originator="sanummel" since="07-03-22">Add rofsfiles for usage in paged images</branchInfo></commentLog>')
assert str(xxx.commentLog.branchInfo) == 'Add rofsfiles for usage in paged images'
+ print "xxx: '" + str(xxx) + "'"
+ print xxx.xml()
xxx = amara.parse(r'<commentLog><branchInfo>1</branchInfo><branchInfo>2</branchInfo></commentLog>')
for yyy in xxx.commentLog.branchInfo:
assert str(yyy) == '1'
break
-
+ print "xxx: '" + str(xxx) + "'"
+ print xxx.xml()
+
myxml = """<DpComponent DpType="File" name="dp.cfg.xml" fileType="Binary" fileSubType="1" fileIndex="1" owner="SwUpdate" extract="true" signed="true" optional="true" crc="true" useCases="Refurbish,BackupRestore" variantPackage="true" include="true" EnableCRCVerification="true" parameters="test"/>"""
xcf = amara.parse(myxml)
assert xcf.DpComponent['name'] == 'dp.cfg.xml'
@@ -118,6 +122,8 @@
newppxml = amara.parse(ppxml)
oldppxml = amara.parse(ppxml)
+ assert 'SettingsData' in newppxml.xml_child_elements
+
oldppdata = {}
for oldfeature in oldppxml.SettingsData.ProductProfile.Feature:
oldppdata[str(oldfeature.Index)] = oldfeature.Value
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_ccm_results.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_ccm_results.py Mon Oct 18 10:23:52 2010 +0100
@@ -332,6 +332,30 @@
assert len(result.output[subproj]) == 2, "%s should contain 2 conflicts" % subproj.objectname
+
+ def test_ConflictsResult_object_result(self):
+ """ Validating ConflictsResult with object checking output."""
+ behave = {'test_update' : """
+Project: Cartman-Release_v4
+
+header.h-8.1.1:incl:tr1test1#1 tr1test1#30010, tr1test1#42792 Implicitly required by multiple tasks - parallel
+header2.h-5.2.1:prj_spec:tr1test1#2 tr1test1#28554 Implicitly required but not included - parallel
+
+Project: Cartman_sub03-next
+
+ No conflicts detected.
+
+ """}
+ session = MockResultSession(behave)
+ result = session.execute('test_update', ccm.ConflictsResult(session))
+ #_logger.debug(result.output)
+ # pylint: disable=E1103
+ assert len(result.output.keys()) == 2, "Should detect 2 projects."
+ subproj = session.create("Cartman-Release_v4:project:%s#1" % session.database())
+ # 3 conflicts will be detected one per tasks.
+ assert len(result.output[subproj]) == 3, "%s should contain 3 conflicts" % subproj.objectname
+
+
def test_DataMapperListResult_result(self):
""" Validating DataMapperListResult."""
behave = {'test_query' : """>>>objectname>>>task5204-1:task:tr1test1>>>task_synopsis>>>Create Cartman_sub03>>>
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_ccmutil.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_ccmutil.py Mon Oct 18 10:23:52 2010 +0100
@@ -27,9 +27,8 @@
_logger = logging.getLogger('test.ccmutil')
logging.basicConfig(level=logging.INFO)
-def open_session(username=None, password=None, engine=None, dbpath=None, database=None, reuse=True):
+def open_session(username=None, password=None, engine=None, dbpath=None, database=None):
"""open session"""
- reuse = True #just for pylint
return MockSession(None, username, password, engine, dbpath, database)
nokia.nokiaccm.open_session = open_session
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_configuration.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_configuration.py Mon Oct 18 10:23:52 2010 +0100
@@ -157,8 +157,8 @@
<set name="root.dir" value="X:/rootdir" />
<set name="name" value="PF5250_200832_internal_code" />
<set name="include" value="**/internal/**" />
- <set name="grace.filters" value="tsrc" />
- <set name="grace.default" value="false" />
+ <set name="release.filters" value="tsrc" />
+ <set name="release.default" value="false" />
</config>
<config>
<set name="root.dir" value="X:/rootdir" />
@@ -166,8 +166,8 @@
<append name="include" value="**/doc/**" />
<set name="include" value="**/docs/**" />
<append name="exclude" value="**/internal/**" /> <!-- set changed to append -->
- <set name="grace.filters" value="tsrc" />
- <set name="grace.default" value="false" />
+ <set name="release.filters" value="tsrc" />
+ <set name="release.default" value="false" />
</config>
</config>
</build>
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_gscm.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_gscm.py Mon Oct 18 10:23:52 2010 +0100
@@ -53,7 +53,7 @@
try:
_logger.info("get_db_path('not_valid_db'): %s" % nokia.gscm.get_db_path('not_valid_db'))
assert False, "Should raise Exception when giving unexisting db.'"
- except Exception, exc:
+ except IOError, exc:
_logger.info(exc)
def test_get_engine_host(self):
@@ -66,7 +66,7 @@
try:
_logger.info("get_engine_host('not_valid_db'): %s" % nokia.gscm.get_engine_host('not_valid_db'))
assert False, "Should raise Exception when giving unexisting db.'"
- except Exception, exc:
+ except IOError, exc:
_logger.info(exc)
def test_get_router_address(self):
@@ -78,5 +78,5 @@
try:
_logger.info("get_router_address('not_valid_db'): %s" % nokia.gscm.get_router_address('not_valid_db'))
assert False, "Should raise Exception when giving unexisting db.'"
- except Exception, exc:
+ except IOError, exc:
_logger.info(exc)
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_idoprep.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_idoprep.py Mon Oct 18 10:23:52 2010 +0100
@@ -34,22 +34,6 @@
"""called before any of the tests are run"""
self.server = os.path.join(os.environ['TEST_DATA'], "data/symrec/GRACE/")
- def test_validate_grace(self):
- """Verifiying validate(grace) method"""
- self.assertRaises(Exception, idoprep.validate, None, 'test', 'test', 'test')
-
- def test_validate_service(self):
- """Verifiying validate(service) method"""
- self.assertRaises(Exception, idoprep.validate, 'test', None, 'test', 'test')
-
- def test_validate_product(self):
- """Verifiying validate(product) method"""
- self.assertRaises(Exception, idoprep.validate, 'test', 'test', None, 'test')
-
- def test_validate_release(self):
- """Verifiying validate(release) method"""
- self.assertRaises(Exception, idoprep.validate, 'test', 'test', 'test', None)
-
def test_get_s60_env_details_valid(self):
"""Verifiying get_s60_env_details(valid args) method"""
(fileDes, cacheFilename) = tempfile.mkstemp()
@@ -91,47 +75,16 @@
"""Verifiying create_ado_mapping method"""
(sysdefFileDes, sysdefConfig) = tempfile.mkstemp()
(adoFileDes, adoMappingFile) = tempfile.mkstemp()
- (adoqtyFileDes, adoQualityMappingFile) = tempfile.mkstemp()
buildDrive = tempfile.gettempdir()
adoQualityDirs = None
testSysdefFile = os.path.join(os.environ['TEST_DATA'], 'data', 'packageiad', 'layers.sysdef.xml')
os.write(sysdefFileDes, testSysdefFile)
os.close(sysdefFileDes)
- idoprep.create_ado_mapping(sysdefConfig, adoMappingFile, adoQualityMappingFile, buildDrive, adoQualityDirs)
+ idoprep.create_ado_mapping(sysdefConfig, adoMappingFile, 'false', buildDrive, adoQualityDirs)
os.unlink(sysdefConfig)
os.close(adoFileDes)
- os.close(adoqtyFileDes)
adoFile = open(adoMappingFile, 'r')
adoMappingFileContents = adoFile.readlines()
adoFile.close()
- adoQtyFile = open(adoQualityMappingFile, 'r')
- adoQualityMappingFileContents = adoQtyFile.readlines()
- adoQtyFile.close()
os.unlink(adoMappingFile)
- os.unlink(adoQualityMappingFile)
- assert len(adoMappingFileContents) >= 1 and len(adoQualityMappingFileContents) >= 1
-
- def test_create_ado_mapping_adoqualitydirs(self):
- """Verifiying create_ado_mapping (with valid adoqualitydirs) method"""
- (sysdefFileDes, sysdefConfig) = tempfile.mkstemp()
- (adoFileDes, adoMappingFile) = tempfile.mkstemp()
- (adoqtyFileDes, adoQualityMappingFile) = tempfile.mkstemp()
- buildDrive = tempfile.gettempdir()
- testSysdefFile = os.path.join(os.environ['TEST_DATA'], 'data', 'packageiad', 'layers.sysdef.xml')
- location = ido.get_sysdef_location(testSysdefFile)
- adoQualityDirs = (os.path.normpath(os.path.join(buildDrive, os.environ['EPOCROOT'], location)))
- os.write(sysdefFileDes, testSysdefFile)
- os.close(sysdefFileDes)
- idoprep.create_ado_mapping(sysdefConfig, adoMappingFile, adoQualityMappingFile, buildDrive, adoQualityDirs)
- os.unlink(sysdefConfig)
- os.close(adoFileDes)
- os.close(adoqtyFileDes)
- adoFile = open(adoMappingFile, 'r')
- adoMappingFileContents = adoFile.readlines()
- adoFile.close()
- adoQtyFile = open(adoQualityMappingFile, 'r')
- adoQualityMappingFileContents = adoQtyFile.readlines()
- adoQtyFile.close()
- os.unlink(adoMappingFile)
- os.unlink(adoQualityMappingFile)
- assert len(adoMappingFileContents) >= 1 and len(adoQualityMappingFileContents) >= 1
+ assert len(adoMappingFileContents) >= 1
\ No newline at end of file
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_preparation.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_preparation.py Mon Oct 18 10:23:52 2010 +0100
@@ -18,8 +18,6 @@
#===============================================================================
""" Testing preparation module """
-# pylint: disable=R0201
-
import tempfile
from shutil import rmtree
import os
@@ -496,9 +494,9 @@
"""Emulating project.exists method"""
return True
- def snapshot(self, target_dir, status):
+ def snapshot(self, target_dir, _):
"""Emulating project.snapshot method"""
- print "Snapshot created"
+ print "Snapshot created: target_dir = " + str(target_dir)
def update(self, status, replace_subprojects, update_keepgoing, result):
"""Emulating project.update method"""
--- a/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_sysdef_io.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/pythoncoretests/test_sysdef_io.py Mon Oct 18 10:23:52 2010 +0100
@@ -26,41 +26,45 @@
import unittest
from sysdef.io import FlashImageSizeWriter
+
_logger = logging.getLogger('test.sysdef.io')
logging.basicConfig(level=logging.INFO)
+
class FlashImageSizeWriterTest(unittest.TestCase):
"""Verifiying sysdef/io module"""
def test_write(self):
"""Verifiying write method"""
- (fileDes, filename) = tempfile.mkstemp()
- flashWriter = FlashImageSizeWriter(filename)
- oldOut = flashWriter._out
- flashWriter._out = duppedOut = StringIO()
+ output = StringIO()
+ flashWriter = FlashImageSizeWriter(output)
config_list = ("testconfig1","testconfig2")
flashWriter.write(_sysdef(), config_list)
- flashWriter._out = oldOut
+ assert len(output.getvalue().splitlines()) == 9
flashWriter.close()
- os.close(fileDes)
- os.unlink(filename)
- assert len(duppedOut.getvalue().splitlines()) == 9
+
# dummy classes to emulate sysdef configuration
class _sysdef():
"""Emulate sysdef """
def __init__(self):
self.configurations = {"name1": _config("testconfig1"), "name2" : _config("testconfig2")}
+
+
class _config():
"""Emulate config"""
def __init__(self, name):
self.name = name
self.units = (_unit(), _unit())
+
+
class _unit():
"""Emulate unit"""
def __init__(self):
self.name = "testUnit"
self.binaries = (_binary(), _binary())
+
+
class _binary():
"""Emulate binary"""
def __init__(self):
--- a/buildframework/helium/sf/python/pythoncore/lib/sphinx_ext.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/sphinx_ext.py Mon Oct 18 10:23:52 2010 +0100
@@ -1,7 +1,7 @@
#============================================================================
#Name : sphinx_ext.py
#Part of : Helium
-
+#
#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
#All rights reserved.
#This component and the accompanying materials are made available
@@ -16,61 +16,126 @@
#
#Description:
#===============================================================================
-""" aids to creating the API documentation"""
+""" Custom Sphinx operations to help with Helium doc linking. """
+
import os
import re
+import atexit
from docutils import nodes, utils
from docutils.parsers.rst import directives
import amara
+tree = None
treecache = None
+database_path = os.path.abspath(os.path.join(os.getcwd() + '/build', 'public_database.xml'))
+
+# Error count for custom sphinx operations
+exit_with_failure = 0
-def handle_hlm_role(role, rawtext, text, lineno, inliner,
- options=None, content=None):
+def check_cached_database():
+ """ Check the Ant database XML data is cached as needed. """
+ global tree
+ global treecache
+
+ if tree == None or treecache == None:
+ f = open(database_path)
+ tree = amara.parse(f)
+
+ treecache = {}
+ for project in tree.antDatabase.project:
+ for x in project.xml_children:
+ if hasattr(x, 'name'):
+ treecache[str(x.name)] = [str(project.name),'project']
+ if hasattr(tree.antDatabase, "antlib"):
+ for antlib in tree.antDatabase.antlib:
+ for x in antlib.xml_children:
+ if hasattr(x, 'name'):
+ treecache[str(x.name)] = [str(antlib.name),'antlib']
+
+def handle_hlm_role(role, _, text, lineno, inliner, options=None, content=None): # pylint: disable=W0613
""" Process a custom Helium ReStructuredText role to link to a target, property or macro. """
if options == None:
options = {}
if content == None:
content = []
+
+ # See if the role is used to embed a API element field
+ if '[' in text:
+ role_data = _embed_role_field(role, text, lineno, inliner)
+ else:
+ role_data = _build_link(text, lineno, inliner, options)
+
+ return role_data
+
+def _embed_role_field(role, text, lineno, inliner):
+ """ Insert the contents of an element field.
+
+ These take the form of e.g. hlm-p:`build.drive[summary]`
+ """
+ messages = []
+ node = nodes.Text('', '')
+
+ field_match = re.search("(.*?)\[(.*?)\]", text)
+ if field_match != None:
+ element_name = field_match.group(1)
+ field_name = field_match.group(2)
+ if field_name != None and len(field_name) > 0:
+ field_value = find_field_value(role, element_name, field_name)
+ if field_value != None and len(field_value) > 0:
+ node = nodes.Text(field_value, utils.unescape(field_value))
+ else:
+ messages.append(inliner.reporter.error(('Field value cannot be found for API field: "%s".' % text), line=lineno))
+ else:
+ messages.append(inliner.reporter.error(('Invalid field name for API value replacement: "%s".' % text), line=lineno))
+ return [node], messages
+
+def find_field_value(role, element_name, field_name):
+ """ Gets the value of a field from an API element. """
+ check_cached_database()
+
+ field_value = None
+ element = tree.xml_xpath('//' + roles[role] + "[name='" + element_name + "']")
+
+ if element != None and len(element) == 1:
+ field_value_list = element[0].xml_xpath(field_name)
+ if field_value_list != None and len(field_value_list) == 1:
+ field_value = str(field_value_list[0])
+ return field_value
+
+
+def _build_link(text, lineno, inliner, options):
+ """ Build an HTML link to the API doc location for API element. """
+ global exit_with_failure
full_path_match = re.search(r"<document source=\"(.*?)\"", str(inliner.document))
full_path = full_path_match.group(1)
path_segment = full_path[full_path.index('\\doc\\') + 5:]
dir_levels = path_segment.count('\\')
(parent_type, parent_name) = get_root_element_name(text)
messages = []
-# f = open('docs.log', 'a')
+
+ # See if link can be built
if parent_type != None and parent_name != None:
href_text = text.replace('.', '-').lower()
-# f.write(href_text + "\n")
api_path_segment = 'api/helium/' + parent_type + '-' + parent_name + '.html#' + href_text
relative_path = ('../' * dir_levels) + api_path_segment
api_doc_path = os.path.abspath(os.path.join(os.getcwd() + '/build/doc', api_path_segment))
node = nodes.reference(text, utils.unescape(text), refuri=relative_path, **options)
-# f.write(str(node) + "\n")
node = nodes.literal(text, '', node, **options)
+ # Or just insert the basic property text
else:
messages.append(inliner.reporter.error(('Missing API doc for "%s".' % text), line=lineno))
node = nodes.literal(text, utils.unescape(text))
-# f.close()
+ # Error occurred so record this in order to return the total number as a failure when exiting the program
+ exit_with_failure += 1
return [node], messages
def get_root_element_name(text):
- global treecache
- if treecache == None:
- database_path = os.path.abspath(os.path.join(os.getcwd() + '/build', 'public_database.xml'))
- f = open(database_path)
- tree = amara.parse(f)
-
- treecache = {}
- for project in tree.antDatabase.project:
- for x in project.xml_children:
- if hasattr(x, 'name'):
- treecache[str(x.name)] = str(project.name)
-
+ check_cached_database()
+
if text in treecache:
- return ('project', treecache[text])
+ return (treecache[text][1], treecache[text][0])
return (None, None)
roles = {'hlm-t': 'target',
@@ -87,5 +152,11 @@
app.add_description_unit('target', 'ant-target', 'pair: %s; target')
-
-
\ No newline at end of file
+def check_for_failure():
+ """ Check whether we need to exit the program with a failure due to one or more errors in a custom Sphinx operation. """
+ if exit_with_failure:
+ raise SystemExit("EXCEPTION: Found %d error(s) of type '(ERROR/3) Missing API doc for <property>'" % (exit_with_failure) )
+
+# Register a cleanup routine to handle exit with failure
+atexit.register(check_for_failure)
+
--- a/buildframework/helium/sf/python/pythoncore/lib/symrec.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/symrec.py Mon Oct 18 10:23:52 2010 +0100
@@ -306,7 +306,10 @@
result.append(ServicePack(spack))
return result
- filename = property(lambda self:self._filename)
+ @property
+ def filename(self):
+ return self._filename
+
service = property(lambda self:self.get_releasedetails_info('service'), lambda self, value:self.set_releasedetails_info('service', value))
product = property(lambda self:self.get_releasedetails_info('product'), lambda self, value:self.set_releasedetails_info('product', value))
release = property(lambda self:self.get_releasedetails_info('release'), lambda self, value:self.set_releasedetails_info('release', value))
@@ -346,6 +349,8 @@
def is_valid(self, checkmd5=True, checkPath=True):
""" Run the validation mechanism. """
+ valid = True
+
status = os.path.join(os.path.dirname(self._filename), 'HYDRASTATUS.xml')
if os.path.exists(status):
hydraxml = xml.dom.minidom.parse(open(status, "r"))
@@ -353,53 +358,63 @@
if t_name.nodeType == t_name.TEXT_NODE:
if t_name.nodeValue != 'Ready':
LOGGER.error("HYDRASTATUS.xml is not ready")
- return False
- if checkPath:
+ valid = False
+
+ if valid and checkPath:
if os.path.basename(self.location) != self.release:
LOGGER.error("Release doesn't match.")
- return False
+ valid = False
if os.path.basename(os.path.dirname(self.location)) != self.product:
LOGGER.error("Product doesn't match.")
- return False
+ valid = False
if os.path.basename(os.path.dirname(os.path.dirname(self.location))) != self.service:
LOGGER.error("Service doesn't match.")
- return False
+ valid = False
- for name in self.keys():
- path = os.path.join(self.location, name)
- if not os.path.exists(path):
- LOGGER.error("%s doesn't exist." % path)
- return False
- try:
- LOGGER.debug("Trying to open %s" % path)
- content_file = open(path)
- content_file.read(1)
- except IOError:
- LOGGER.error("%s is not available yet" % path)
- return False
-
- if checkmd5 and self[name].has_key('md5checksum'):
- if self[name]['md5checksum'] != None:
- if fileutils.getmd5(path).lower() != self[name]['md5checksum']:
- LOGGER.error("%s md5checksum missmatch." % path)
- return False
-
- for spack in self.servicepacks:
- for name in spack.files:
+ if valid:
+ for name in self.keys():
path = os.path.join(self.location, name)
if not os.path.exists(path):
LOGGER.error("%s doesn't exist." % path)
- return False
- for name in spack.instructions:
- path = os.path.join(self.location, name)
- if not os.path.exists(path):
- LOGGER.error("%s doesn't exist." % path)
- return False
+ valid = False
+ break
+ try:
+ LOGGER.debug("Trying to open %s" % path)
+ content_file = open(path)
+ content_file.read(1)
+ except IOError:
+ LOGGER.error("%s is not available yet" % path)
+ valid = False
+ break
+
+ if checkmd5 and self[name].has_key('md5checksum'):
+ if self[name]['md5checksum'] != None:
+ if fileutils.getmd5(path).lower() != self[name]['md5checksum']:
+ LOGGER.error("%s md5checksum missmatch." % path)
+ valid = False
+
+ if valid:
+ for spack in self.servicepacks:
+ if valid:
+ for name in spack.files:
+ path = os.path.join(self.location, name)
+ if not os.path.exists(path):
+ LOGGER.error("%s doesn't exist." % path)
+ valid = False
+ break
+ for name in spack.instructions:
+ path = os.path.join(self.location, name)
+ if not os.path.exists(path):
+ LOGGER.error("%s doesn't exist." % path)
+ valid = False
+ break
- dependency = self.get_dependsof()
- if dependency != None:
- return ValidateReleaseMetadata(dependency.filename).is_valid(checkmd5)
- return True
+ if valid:
+ dependency = self.get_dependsof()
+ if dependency != None:
+ return ValidateReleaseMetadata(dependency.filename).is_valid(checkmd5)
+
+ return valid
class MetadataMerger(object):
@@ -549,11 +564,11 @@
ValidateReleaseMetadataCached.__init__(self, filename)
self.location = os.path.dirname(filename)
- def is_valid(self, checkmd5=True):
+ def is_valid(self, checkmd5=True, checkPath=True):
""" Run the validation mechanism. """
tickler_path = os.path.join(self.location,"TICKLER")
if not os.path.exists(tickler_path):
LOGGER.error("Release not available yet")
return False
else:
- return ValidateReleaseMetadataCached.is_valid(self, checkmd5)
+ return ValidateReleaseMetadataCached.is_valid(self, checkmd5, checkPath)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/lib/symrec.py.orig Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,564 @@
+#============================================================================
+#Name : symrec.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+
+""" SYMREC metadata file generation. """
+import xml.dom.minidom
+import codecs
+import os
+import re
+import logging
+import fileutils
+import csv
+
+LOGGER = logging.getLogger("symrec")
+logging.basicConfig(level=logging.INFO)
+
+def _cleanup_list(input):
+ """cleanup list"""
+ result = []
+ for chars in input:
+ if chars is not None and chars.strip() != "":
+ result.append(chars)
+ return result
+
+def xml_setattr(node, attr, value):
+ """ Create the attribute if needed. """
+ node.setAttribute(attr, value)
+
+def is_child_text_only(node):
+ """ Returns true if child node are all from TEXT_NODE type. """
+ for child in node.childNodes:
+ if child.nodeType != xml.dom.minidom.Node.TEXT_NODE:
+ return False
+ return True
+
+
+def ignore_whitespace_writexml(self, writer, indent="", addindent="", newl=""):
+ """ This version of writexml will ignore whitespace text to alway render
+ the output in a structure way.
+ indent = current indentation
+ addindent = indentation to add to higher levels
+ newl = newline string
+ """
+ writer.write(indent + "<" + self.tagName)
+
+ attrs = self._get_attributes()
+ a_names = attrs.keys()
+ a_names.sort()
+
+ for a_name in a_names:
+ writer.write(" %s=\"" % a_name)
+ xml.dom.minidom._write_data(writer, attrs[a_name].value)
+ writer.write("\"")
+ if self.childNodes:
+ writer.write(">")
+ if is_child_text_only(self):
+ for node in self.childNodes:
+ node.writexml(writer, '', '', '')
+ writer.write("</%s>%s" % (self.tagName, newl))
+ else:
+ writer.write(newl)
+ for node in self.childNodes:
+ if node.nodeType == xml.dom.minidom.Node.TEXT_NODE and node.data.isspace():
+ pass
+ else:
+ node.writexml(writer, indent + addindent, addindent, newl)
+ writer.write("%s</%s>%s" % (indent, self.tagName, newl))
+ else:
+ writer.write("/>%s" % (newl))
+
+xml.dom.minidom.Element.writexml = ignore_whitespace_writexml
+
+
+class ServicePack(object):
+ """ Create a ServicePack """
+ def __init__(self, node):
+ self.__xml = node
+
+ @property
+ def name(self):
+ """name"""
+ return self.__xml.getAttribute('name')
+
+ @property
+ def files(self):
+ """files"""
+ result = []
+ for filen in self.__xml.getElementsByTagName('file'):
+ result.append(filen.getAttribute('name'))
+ return result
+
+ @property
+ def instructions(self):
+ """instructions"""
+ result = []
+ for instr in self.__xml.getElementsByTagName('instructions'):
+ result.append(instr.getAttribute('name'))
+ return result
+
+class ReleaseMetadata(object):
+ """ Create or read Metadata XML from SYMREC/SYMDEC. """
+
+ def __init__(self, filename, service=None, product=None, release=None):
+ self._filename = filename
+ if filename and os.path.exists(filename):
+ self._xml = xml.dom.minidom.parse(open(filename, "r"))
+ releaseInformation = self._xml.getElementsByTagName(u"releaseInformation")
+ if releaseInformation != []:
+ self._releaseInformation = releaseInformation[0]
+ else:
+ self._releaseInformation = self._xml.createElement(u"releaseInformation")
+ releaseDetails = self._xml.getElementsByTagName(u'releaseDetails')
+ if releaseDetails != []:
+ self._releaseDetails = releaseDetails[0]
+ else:
+ self._releaseDetails = self._xml.createElement(u'releaseDetails')
+ releaseFiles = self._xml.getElementsByTagName(u'releaseFiles')
+ if releaseFiles != []:
+ self._releaseFiles = releaseFiles[0]
+ else:
+ self._releaseFiles = self._xml.createElement(u'releaseFiles')
+
+ if service != None:
+ self.service = service
+ if product != None:
+ self.product = product
+ if release != None:
+ self.release = release
+ elif service!=None and product!=None and release!=None:
+ self._xml = xml.dom.minidom.Document()
+ self._releaseInformation = self._xml.createElement(u"releaseInformation")
+ self._xml.appendChild(self._releaseInformation)
+ self._releaseDetails = self._xml.createElement(u'releaseDetails')
+ self._releaseInformation.appendChild(self._releaseDetails)
+ releaseID = self._xml.createElement(u'releaseID')
+ self._releaseDetails.appendChild(releaseID)
+
+ # service
+ serv = self._xml.createElement(u'service')
+ xml_setattr(serv, 'name', unicode(service))
+ releaseID.appendChild(serv)
+ # product
+ prod = self._xml.createElement(u'product')
+ xml_setattr(prod, 'name', unicode(product))
+ releaseID.appendChild(prod)
+ # release
+ rel = self._xml.createElement(u'release')
+ xml_setattr(rel, 'name', unicode(release))
+ releaseID.appendChild(rel)
+
+ # releaseFiles
+ self._releaseFiles = self._xml.createElement(u'releaseFiles')
+ self._releaseInformation.appendChild(self._releaseFiles)
+
+ # releaseFiles
+ self._releaseInformation.appendChild(self._xml.createElement(u'externalFiles'))
+ else:
+ raise Exception("Error metadata file doesn't exists.")
+
+
+ def get_dependsof(self):
+ """ Return a ReleaseMetada object pointing to the dependency release. """
+ if self.dependsof_service != None and self.dependsof_product != None and self.dependsof_release != None:
+ filename = os.path.join(os.path.dirname(self._filename), "../../..",
+ self.dependsof_service,
+ self.dependsof_product,
+ self.dependsof_release)
+ return ReleaseMetadata(find_latest_metadata(filename))
+ else:
+ return None
+
+
+ def set_dependsof(self, filename):
+ """ Setting the dependency release. """
+ metadata = ReleaseMetadata(filename)
+ self.dependsof_service = metadata.service
+ self.dependsof_product = metadata.product
+ self.dependsof_release = metadata.release
+
+ def add_package(self, name, type=None, default=True, filters=None, extract="single", md5checksum=None, size=None):
+ """ Adding a package to the metadata file. """
+ # check if update mode
+ package = None
+
+ for pkg in self._xml.getElementsByTagName('package'):
+ if (pkg.getAttribute('name').lower() == os.path.basename(name).lower()):
+ package = pkg
+ break
+
+ # if not found create new package.
+ if package is None:
+ package = self._xml.createElement(u'package')
+ self._releaseFiles.appendChild(package)
+
+ xml_setattr(package, 'name', os.path.basename(name))
+ if type != None:
+ xml_setattr(package, 'type', type)
+ else:
+ xml_setattr(package, 'type', os.path.splitext(name)[1].lstrip('.'))
+ xml_setattr(package, 'default', str(default).lower())
+ xml_setattr(package, 'extract', extract)
+ if filters and len(filters)>0:
+ xml_setattr(package, 'filters', ','.join(filters))
+ xml_setattr(package, 's60filter', ','.join(filters))
+ else:
+ xml_setattr(package, 'filters', '')
+ xml_setattr(package, 's60filter', '')
+ if md5checksum != None:
+ xml_setattr(package, unicode("md5checksum"), unicode(md5checksum))
+ if size != None:
+ xml_setattr(package, unicode("size"), unicode(size))
+
+
+ def keys(self):
+ """keys"""
+ keys = []
+ for pkg in self._releaseFiles.getElementsByTagName('package'):
+ keys.append(pkg.getAttribute('name'))
+ return keys
+
+ def __getitem__(self, key):
+ for pkg in self._releaseFiles.getElementsByTagName('package'):
+ if pkg.getAttribute('name').lower() == key.lower():
+ filters = []
+ s60filters = []
+ md5checksum = None
+ size = None
+ if pkg.hasAttribute(u'filters'):
+ filters = _cleanup_list(pkg.getAttribute('filters').split(','))
+ if pkg.hasAttribute(u's60filter'):
+ s60filters = _cleanup_list(pkg.getAttribute('s60filter').split(','))
+ if pkg.hasAttribute(u'md5checksum'):
+ md5checksum = pkg.getAttribute('md5checksum')
+ if pkg.hasAttribute(u'size'):
+ size = pkg.getAttribute('size')
+ return {'type': pkg.getAttribute('type'), 'extract': pkg.getAttribute('extract'), 'default': (pkg.getAttribute('default')=="true"), \
+ 'filters': filters, 's60filter': s60filters, 'md5checksum': md5checksum, 'size': size}
+ raise Exception("Key '%s' not found." % key)
+
+ def __setitem__(self, key, value):
+ self.add_package(key, value['type'], value['default'], value['filters'], value['extract'], value['md5checksum'], value['size'])
+
+ def set_releasedetails_info(self, name, value, details="releaseID"):
+ """ Generic function to set releaseid info. """
+ detailsnode = None
+ if self._releaseDetails.getElementsByTagName(details) == []:
+ detailsnode = self._xml.createElement(details)
+ self._releaseDetails.appendChild(detailsnode)
+ else:
+ detailsnode = self._releaseDetails.getElementsByTagName(details)[0]
+ namenode = None
+ if detailsnode.getElementsByTagName(name) == []:
+ namenode = self._xml.createElement(name)
+ namenode.setAttribute(u'name', unicode(value))
+ detailsnode.appendChild(namenode)
+ else:
+ namenode = detailsnode.getElementsByTagName(name)[0]
+ namenode.setAttribute('name', value)
+
+
+ def get_releasedetails_info(self, name, details="releaseID"):
+ """ Generic function to extract releaseid info. """
+ for group in self._releaseDetails.getElementsByTagName(details):
+ for i in group.getElementsByTagName(name):
+ return i.getAttribute('name')
+ return None
+
+ def getVariantPackage(self, variant_name):
+ """get variant package"""
+ for variant in self._xml.getElementsByTagName('variant'):
+ if variant.getAttribute('name').lower() == variant_name.lower():
+ for xxx in variant.getElementsByTagName('file'):
+ return xxx.getAttribute('name')
+
+ def xml(self):
+ """ Returning the XML as a string. """
+ return self._xml.toprettyxml()
+
+ def save(self, filename = None):
+ """ Saving the XML into the provided filename. """
+ if filename == None:
+ filename = self._filename
+ file_object = codecs.open(os.path.join(filename), 'w', "utf_8")
+ file_object.write(self.xml())
+ file_object.close()
+
+ @property
+ def servicepacks(self):
+ """ Getting the service pack names. """
+ result = []
+ for spack in self._releaseInformation.getElementsByTagName('servicePack'):
+ result.append(ServicePack(spack))
+ return result
+
+ filename = property(lambda self:self._filename)
+ service = property(lambda self:self.get_releasedetails_info('service'), lambda self, value:self.set_releasedetails_info('service', value))
+ product = property(lambda self:self.get_releasedetails_info('product'), lambda self, value:self.set_releasedetails_info('product', value))
+ release = property(lambda self:self.get_releasedetails_info('release'), lambda self, value:self.set_releasedetails_info('release', value))
+ dependsof_service = property(lambda self:self.get_releasedetails_info('service', 'dependsOf'), lambda self, value:self.set_releasedetails_info('service', value, 'dependsOf'))
+ dependsof_product = property(lambda self:self.get_releasedetails_info('product', 'dependsOf'), lambda self, value:self.set_releasedetails_info('product', value, 'dependsOf'))
+ dependsof_release = property(lambda self:self.get_releasedetails_info('release', 'dependsOf'), lambda self, value:self.set_releasedetails_info('release', value, 'dependsOf'))
+ baseline_service = property(lambda self:self.get_releasedetails_info('service', 'previousBaseline'), lambda self, value:self.set_releasedetails_info('service', value, 'previousBaseline'))
+ baseline_product = property(lambda self:self.get_releasedetails_info('product', 'previousBaseline'), lambda self, value:self.set_releasedetails_info('product', value, 'previousBaseline'))
+ baseline_release = property(lambda self:self.get_releasedetails_info('release', 'previousBaseline'), lambda self, value:self.set_releasedetails_info('release', value, 'previousBaseline'))
+
+
+class MD5Updater(ReleaseMetadata):
+ """ Update Metadata XML already created from SYMREC/SYMDEC. """
+ def __init__(self, filename):
+ ReleaseMetadata.__init__(self, filename)
+ self._filepath = os.path.dirname(filename)
+
+ def update(self):
+ """ Update each existing package md5checksum and size attribute."""
+ for name in self.keys():
+ fullname = os.path.join(self._filepath, name)
+ if os.path.exists(fullname):
+ LOGGER.info("Updating %s MD5." % fullname)
+ md5value = None
+ for trial in range(3):
+ try:
+ md5value = fileutils.getmd5(fullname)
+ result = self[name]
+ result['md5checksum'] = unicode(md5value)
+ result['size'] = unicode(os.path.getsize(fullname))
+ self[name] = result
+ break
+ except Exception, e:
+ LOGGER.warning(str(e))
+ else:
+ raise Exception('Error determining %s MD5' % fullname)
+
+class ValidateReleaseMetadata(ReleaseMetadata):
+ """ This class validate if a metadata file is stored in the correct location and
+ if all deps exists.
+ """
+ def __init__(self, filename):
+ ReleaseMetadata.__init__(self, filename)
+ self.location = os.path.dirname(filename)
+
+ def is_valid(self, checkmd5=True, checkPath=True):
+ """ Run the validation mechanism. """
+ status = os.path.join(os.path.dirname(self._filename), 'HYDRASTATUS.xml')
+ if os.path.exists(status):
+ hydraxml = xml.dom.minidom.parse(open(status, "r"))
+ for t_name in hydraxml.getElementsByTagName('state')[0].childNodes:
+ if t_name.nodeType == t_name.TEXT_NODE:
+ if t_name.nodeValue != 'Ready':
+ LOGGER.error("HYDRASTATUS.xml is not ready")
+ return False
+ if checkPath:
+ if os.path.basename(self.location) != self.release:
+ LOGGER.error("Release doesn't match.")
+ return False
+ if os.path.basename(os.path.dirname(self.location)) != self.product:
+ LOGGER.error("Product doesn't match.")
+ return False
+ if os.path.basename(os.path.dirname(os.path.dirname(self.location))) != self.service:
+ LOGGER.error("Service doesn't match.")
+ return False
+
+ for name in self.keys():
+ path = os.path.join(self.location, name)
+ if not os.path.exists(path):
+ LOGGER.error("%s doesn't exist." % path)
+ return False
+ try:
+ LOGGER.debug("Trying to open %s" % path)
+ content_file = open(path)
+ content_file.read(1)
+ except IOError:
+ LOGGER.error("%s is not available yet" % path)
+ return False
+
+ if checkmd5 and self[name].has_key('md5checksum'):
+ if self[name]['md5checksum'] != None:
+ if fileutils.getmd5(path).lower() != self[name]['md5checksum']:
+ LOGGER.error("%s md5checksum missmatch." % path)
+ return False
+
+ for spack in self.servicepacks:
+ for name in spack.files:
+ path = os.path.join(self.location, name)
+ if not os.path.exists(path):
+ LOGGER.error("%s doesn't exist." % path)
+ return False
+ for name in spack.instructions:
+ path = os.path.join(self.location, name)
+ if not os.path.exists(path):
+ LOGGER.error("%s doesn't exist." % path)
+ return False
+
+ dependency = self.get_dependsof()
+ if dependency != None:
+ return ValidateReleaseMetadata(dependency.filename).is_valid(checkmd5)
+ return True
+
+class MetadataMerger(object):
+ """ Merge packages definition to the root metadata. """
+
+ def __init__(self, metadata):
+ """ Construct a metadata merger providing root metadata filename. """
+ self._metadata = ReleaseMetadata(metadata)
+
+ def merge(self, filename):
+ """ Merge the content of filename into the root metadata. """
+ metadata = ReleaseMetadata(filename)
+ for name in metadata.keys():
+ if name in self._metadata.keys():
+ LOGGER.warning('Package %s already declared, overriding previous definition!' % name)
+ self._metadata[name] = metadata[name]
+
+ def xml(self):
+ """ Returning the XML as a string. """
+ return self._metadata.xml()
+
+ def save(self, filename = None):
+ """ Saving the XML into the provided filename. """
+ return self._metadata.save(filename)
+
+class Metadata2TDD(ReleaseMetadata):
+ """ Convert Metadata to a TDD file """
+ def __init__(self, filename, includes=None, excludes=None):
+ ReleaseMetadata.__init__(self, filename)
+ if includes is None:
+ includes = []
+ if excludes is None:
+ excludes = []
+ self.location = os.path.dirname(filename)
+ self.includes = includes
+ self.excludes = excludes
+
+ def archives_to_tdd(self, metadata):
+ """archives"""
+ tdd = "\t[\n"
+ for name in metadata.keys():
+ path_ = os.path.join(os.path.dirname(metadata.filename), name)
+ if (((len(self.includes) == 0) and metadata[name]['extract']) or (self.includes in metadata[name]['s60filter'])) and self.excludes not in metadata[name]['s60filter']:
+ tdd += "\t\t{\n"
+ tdd += "\t\t\t\"command\": \"unzip_%s\",\n" % metadata[name]['extract']
+ tdd += "\t\t\t\"src\": \"%s\",\n" % os.path.normpath(path_).replace('\\', '/')
+ tdd += "\t\t},\n"
+ tdd += "\t],\n"
+ return tdd
+
+ def to_tdd(self):
+ """ Generating a TDD file that contains a list of list of filenames. """
+ tdd = "[\n"
+ # generates unarchiving steps for dependency
+ dependency = self.get_dependsof()
+ if dependency != None:
+ tdd += self.archives_to_tdd(dependency)
+ # generates unarchiving steps
+ tdd += self.archives_to_tdd(self)
+ tdd += "]\n"
+ return tdd
+
+
+
+def find_latest_metadata(releasedir):
+ """ Finding the release latest release metadata file. """
+ try:
+ metadatas = []
+ for filename in os.listdir(releasedir):
+ if re.match(r'^release_metadata(_\d+)?\.xml$', filename, re.I) is not None:
+ LOGGER.debug("Found %s" % filename)
+ metadatas.append(filename)
+ # reverse the order...
+ metadatas.sort(reverse=True)
+ if len(metadatas) > 0:
+ return os.path.normpath(os.path.join(releasedir, metadatas[0]))
+ except Exception, exc:
+ LOGGER.error(exc)
+ return None
+ return None
+
+class ValidateReleaseMetadataCached(ValidateReleaseMetadata):
+ """ Cached version of the metadata validation. """
+ def __init__(self, filename, cachefile=None):
+ ValidateReleaseMetadata.__init__(self, filename)
+ self.__cachefile = cachefile
+
+ def is_valid(self, checkmd5=True, checkPath=True):
+ """ Check if file is in the local cache.
+ Add valid release to the cache.
+ """
+ metadatas = self.load_cache()
+ if self.in_cache(metadatas, os.path.normpath(self._filename)):
+ LOGGER.debug("Release found in cache.")
+ return self.value_from_cache(metadatas, os.path.normpath(self._filename))
+ else:
+ result = ValidateReleaseMetadata.is_valid(self, checkmd5, checkPath)
+ LOGGER.debug("Updating the cache.")
+ metadatas.append([os.path.normpath(self._filename), result])
+ self.update_cache(metadatas)
+ return result
+
+ def in_cache(self, metadatas, key):
+ """in cache"""
+ for metadata in metadatas:
+ if metadata[0] == key:
+ return True
+ return False
+
+ def value_from_cache(self, metadatas, key):
+ """value from cache"""
+ for metadata in metadatas:
+ if metadata[0] == key:
+ return metadata[1]
+ return None
+
+ def load_cache(self):
+ """load cache"""
+ metadatas = []
+ if self.__cachefile is not None and os.path.exists(self.__cachefile):
+ f_file = open(self.__cachefile, "rb")
+ for row in csv.reader(f_file):
+ if len(row) == 2:
+ metadatas.append([os.path.normpath(row[0]), row[1].lower() == "true"])
+ elif len(row) == 1:
+ # backward compatibility with old cache.
+ metadatas.append([os.path.normpath(row[0]), True])
+ f_file.close()
+ return metadatas
+
+ def update_cache(self, metadatas):
+ """update cache"""
+ if self.__cachefile is not None and os.path.exists(os.path.dirname(self.__cachefile)):
+ f_file = open(self.__cachefile, "wb")
+ writer = csv.writer(f_file)
+ writer.writerows(metadatas)
+ f_file.close()
+
+class ValidateTicklerReleaseMetadata(ValidateReleaseMetadataCached):
+ """ This class validate if a metadata file is stored in the correct location and
+ if all deps exists.
+ """
+ def __init__(self, filename):
+ ReleaseMetadata.__init__(self, filename)
+ self.location = os.path.dirname(filename)
+
+ def is_valid(self, checkmd5=True):
+ """ Run the validation mechanism. """
+ tickler_path = os.path.join(self.location,"TICKLER")
+ if not os.path.exists(tickler_path):
+ LOGGER.error("Release not available yet")
+ return False
+ else:
+ return ValidateReleaseMetadataCached.is_valid(self, checkmd5)
--- a/buildframework/helium/sf/python/pythoncore/lib/sysdef/api.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/sysdef/api.py Mon Oct 18 10:23:52 2010 +0100
@@ -382,7 +382,6 @@
reason = filter_out(self.filters, unit.filters)
if reason == None:
# Get the unit object from the cache if this is a string
- # TODO - remove once unitlist returns list of Unit objects
if isinstance(unit, types.UnicodeType):
unit = self._sysDef[unit]
result.append(unit)
@@ -458,7 +457,6 @@
""" Initialisation """
self.__xml = xml.dom.minidom.parse(open(filename, "r"))
self._cache = {}
- #TODO - why store these as hashes?
self._units = {}
self._layers = {}
self._modules = {}
@@ -551,7 +549,6 @@
def addElement(self, element):
""" Adds SysDef element to cache. """
- #TODO - handle duplicate names of different types
if not self._cache.has_key(element.get_id()):
self._cache[element.get_id()] = element
#_logger.info('Adding SysDef element to cache: %s' % str(element))
--- a/buildframework/helium/sf/python/pythoncore/lib/sysdef/io.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/sysdef/io.py Mon Oct 18 10:23:52 2010 +0100
@@ -26,8 +26,11 @@
def __init__(self, output):
""" Initialisation. """
self.output = output
- self._out = file(output, 'w')
-
+ if isinstance(output, basestring):
+ self._out = file(output, 'w')
+ else:
+ self._out = output
+
def write(self, sys_def, config_list):
""" Write the .csv data to a file for the given System Definition and configuration name. """
self._out.write('component,binary,rom,rofs1,rofs2,rofs3\n')
--- a/buildframework/helium/sf/python/pythoncore/lib/timeout_launcher.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/timeout_launcher.py Mon Oct 18 10:23:52 2010 +0100
@@ -61,14 +61,15 @@
print "e.g: timeout_launcher.py --timeout=1 -- cmd /c sleep 10"
sys.exit(-1)
else:
- _logger.debug("Start command")
+ command = ' '.join(cmdline)
+ _logger.debug("Start command: " + command)
shell = True
if _windows:
shell = False
if timeout != None:
finish = time.time() + timeout
timedout = False
- p_file = subprocess.Popen(' '.join(cmdline), stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=shell)
+ p_file = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=shell)
while (p_file.poll() == None):
if time.time() > finish:
timedout = True
@@ -82,12 +83,12 @@
handle = win32api.OpenProcess(True, win32con.PROCESS_TERMINATE, p_file.pid)
win32process.TerminateProcess(handle, -1)
print "ERROR: Process killed..."
- except Exception, exc:
+ except Exception, exc: # pylint: disable=W0703
print "ERROR: %s" % exc
else:
os.kill(p_file.pid, 9) # pylint: disable=E1101
print "ERROR: exiting..."
- raise Exception("Timeout exception.")
+ raise IOError("Timeout exception.")
else:
print p_file.communicate()[0]
sys.exit(p_file.returncode)
--- a/buildframework/helium/sf/python/pythoncore/lib/unittestadditions.py Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/unittestadditions.py Mon Oct 18 10:23:52 2010 +0100
@@ -41,7 +41,7 @@
def __call__(self, f_file):
""" Returns the function f_file if shouldSkip is False. Else a stub function is returned. """
- def __skiptest(*args, **kargs):
+ def __skiptest(*args, **kargs): # pylint: disable=W0613
"""skip test"""
_logger.warning("Skipping test %s" % f_file.__name__)
return self.returns
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/tests/data/Invalid_distribution.policy.S60 Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1 @@
+1
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/tests/data/bootup_testing/test_bootup.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<testrun>
+ <metadata>
+ <meta name="diamonds-buildid">http://diamonds.com/1234</meta>
+ <meta name="diamonds-testtype">Smoke</meta>
+ <meta name="name">Bootup test run</meta>
+ </metadata>
+ <agents>
+ <agent alias="alias">
+ <property name="hardware" value="new_device"/>
+ </agent>
+ </agents>
+ <execution defaultAgent="alias">
+ <initialization>
+ <task agents="alias">
+ <type>FlashTask</type>
+ <parameters>
+ <parameter name="image-1" value="exe1\images\image1.fpsx"/>
+ <parameter name="image-2" value="exe1\images\image2.fpsx"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>RebootTask</type>
+ <parameters/>
+ </task>
+ <task agents="alias">
+ <type>CreateDirTask</type>
+ <parameters>
+ <parameter name="dir" value="c:\logs\testability"/>
+ </parameters>
+ </task>
+ </initialization>
+ <finalization>
+ <task agents="alias">
+ <type>CleanupTask</type>
+ <parameters>
+ <parameter name="upload-files" value="true"/>
+ </parameters>
+ </task>
+ </finalization>
+ </execution>
+ <postActions>
+ <action>
+ <type>EmailAction</type>
+ <parameters>
+ <parameter name="subject" value="Bootup test report"/>
+ <parameter name="to" value="firstname.lastname@domain.com"/>
+ <parameter name="format" value="simplelogger"/>
+ </parameters>
+ </action>
+ </postActions>
+</testrun>
\ No newline at end of file
--- a/buildframework/helium/sf/python/pythoncore/tests/data/matti/matti_template.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
-<!--
-============================================================================
-Name : matti_template.xml
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-Contains the template for the test.xml file output. The test.xml file contains
-information on the files used to create the drop file.
-============================================================================
--->
-
-<testrun>
- <metadata>
- {% if xml_dict['diamonds_build_url'] -%}
- <meta name="diamonds-buildid">{{ xml_dict['diamonds_build_url'] }}</meta>
- <meta name="diamonds-testtype">Smoke</meta>
- {% endif %}
- <meta name="name">{{ xml_dict['testrun_name'] }}</meta>
- </metadata>
-
- <agents>
- <agent alias="{{ xml_dict['alias_name'] }}">
- <property name="hardware" value="{{ xml_dict["device_type"] }}"/>
- </agent>
- </agents>
-
-
- {% for exe_block in xml_dict['execution_blocks'] -%}
- <execution defaultAgent="{{ xml_dict['alias_name'] }}">
- <initialization>
-
- {% if exe_block['image_files'] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>FlashTask</type>
- <parameters>
- {% set i = 1 %}
- {% for img in exe_block['image_files'] -%}
- <parameter name="image-{{ i }}" value="images\{{ os.path.basename(img) }}" />
- {% set i = i + 1 %}
- {% endfor -%}
- </parameters>
- </task>
- {% endif %}
-
-
- {% if exe_block['install_files'] != [] -%}
- {% for file in exe_block['install_files'] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="{{exe_block['name']}}{{ atspath.normpath(atspath.normpath(file[0]).replace(atspath.normpath(exe_block['asset_path']).rsplit("\\", 1)[0], "")) }}"/>
- <parameter name="dst" value="{{ atspath.normpath(file[1]) }}"/>
- </parameters>
- </task>
- {% endfor -%}
- {% endif %}
-
- {% if exe_block['matti_sis_files'] != [] -%}
- {% for sisfile in exe_block['matti_sis_files'] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="sisfiles\{{ os.path.basename(sisfile[0]) }}"/>
- <parameter name="dst" value="{{ sisfile[2] }}"/>
- </parameters>
- </task>
- {% endfor -%}
- {% endif %}
-
- {% for sis_file in exe_block["matti_sis_files"] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>InstallSisTask</type>
- <parameters>
- <parameter name="software-package" value="{{ sis_file[2] }}"/>
- <parameter name="timeout" value="{{ exe_block["test_timeout"] }}"/>
- <parameter name="upgrade-data " value="true"/>
- <parameter name="ignore-ocsp-warnings" value="true"/>
- <parameter name="ocsp-done" value="true"/>
- <parameter name="install-drive" value="{{ sis_file[2].split(":")[0] }}"/>
- <parameter name="overwrite-allowed" value="true"/>
- <parameter name="download-allowed" value="false"/>
- <parameter name="download-username" value="user"/>
- <parameter name="download-password" value="passwd"/>
- <parameter name="upgrade-allowed" value="true"/>
- <parameter name="optional-items-allowed" value="true"/>
- <parameter name="untrusted-allowed" value="true"/>
- <parameter name="package-info-allowed" value="true"/>
- <parameter name="user-capabilities-granted" value="true"/>
- <parameter name="kill-app" value="true"/>
- </parameters>
- </task>
- {%- endfor -%}
-
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>RebootTask</type>
- <parameters/>
- </task>
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>CreateDirTask</type>
- <parameters>
- <parameter value="c:\logs\testability" name="dir"/>
- </parameters>
- </task>
- </initialization>
-
- {% for task_file in exe_block["matti_task_files"] -%}
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>MATTITask</type>
- <parameters>
- <parameter value="{{ exe_block["name"] }}\matti_testcases\" name="script"/>
- <parameter value="{{ exe_block["name"] }}\matti_testcases\mattiparameters\{{ os.path.basename(exe_block["matti_parameters"][0]) }}" name="xml"/>
- <parameter value="{{ exe_block['test_timeout'] }}" name="timeout"/>
- <parameter value="{{ exe_block["sierra_enabled"] }}" name="sierra"/>
- <parameter value="{{ exe_block["sierra_parameters"] }} -e %TEST_RUN_SANDBOX%/{{ exe_block["name"] }}/{{ task_file }} test_unit" name="executable-parameters"/>
- </parameters>
- </task>
- {% endfor -%}
-
- <finalization>
- <task agents="{{ xml_dict['alias_name'] }}">
- <type>CleanupTask</type>
- <parameters>
- <parameter value="true" name="upload-files"/>
- </parameters>
- </task>
- </finalization>
- </execution>
- {% endfor -%}
-
- <postActions>
- <action>
- <type>EmailAction</type>
- <parameters>
- <parameter value="{{ xml_dict['email_subject'] }}" name="subject"/>
- <parameter value="{{ xml_dict['report_email'] }}" name="to"/>
- <parameter value="{{ xml_dict['email_format'] }}" name="format"/>
- </parameters>
- </action>
- </postActions>
-
-</testrun>
--- a/buildframework/helium/sf/python/pythoncore/tests/data/matti/test.rb Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-# require needed Ruby, MATTI and Orbit files
-require 'test/unit'
-require 'otest/testcase'
-
-
- #TODO: Give suitable name for test class
-class TestClassName < Test::Unit::TestCase
-
- #no need to do anything for initialize method
- def initialize (args)
- super(args)
- # TODO define application name
- app_path("hbinputtest.exe")
- end
-
- # Test case method
- #TODO: name test method with suitable name
- # Must: Test method must start test_
- # Recomended: really descriping name
- def test_do_something
-
- # create test object app from defined sut
- app = @sut.run(:name => @app_name)
- sleep(10)
-
- #Application is closed after test
- app.close
- #Verifies it is closed
-
- end #End of test case test_do_something
-
-
-end#Testsuite
-
--- a/buildframework/helium/sf/python/pythoncore/tests/data/matti/test_all_present.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<testrun>
- <metadata>
- <meta name="diamonds-buildid">http://diamonds.com/1234</meta>
- <meta name="diamonds-testtype">Smoke</meta>
- <meta name="name">matti test run</meta>
- </metadata>
- <agents>
- <agent alias="alias">
- <property name="hardware" value="new_device"/>
- </agent>
- </agents>
- <execution defaultAgent="alias">
- <initialization>
- <task agents="alias">
- <type>FlashTask</type>
- <parameters>
- <parameter name="image-1" value="images\image1.fpsx"/>
- <parameter name="image-2" value="images\image2.fpsx"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="exe1\matti_testcases\hwdata\file1.txt"/>
- <parameter name="dst" value="C:\Private\10202BE9\PERSISTS\file1.txt"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="exe1\matti_testcases\hwdata\settings.ini"/>
- <parameter name="dst" value="c:\sys\settings.ini"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="sisfiles\abc.sis"/>
- <parameter name="dst" value="c:\abc.sis"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="sisfiles\xyz.sis"/>
- <parameter name="dst" value="f:\xyz.sis"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>InstallSisTask</type>
- <parameters>
- <parameter name="software-package" value="c:\abc.sis"/>
- <parameter name="timeout" value="1200"/>
- <parameter name="upgrade-data " value="true"/>
- <parameter name="ignore-ocsp-warnings" value="true"/>
- <parameter name="ocsp-done" value="true"/>
- <parameter name="install-drive" value="c"/>
- <parameter name="overwrite-allowed" value="true"/>
- <parameter name="download-allowed" value="false"/>
- <parameter name="download-username" value="user"/>
- <parameter name="download-password" value="passwd"/>
- <parameter name="upgrade-allowed" value="true"/>
- <parameter name="optional-items-allowed" value="true"/>
- <parameter name="untrusted-allowed" value="true"/>
- <parameter name="package-info-allowed" value="true"/>
- <parameter name="user-capabilities-granted" value="true"/>
- <parameter name="kill-app" value="true"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>InstallSisTask</type>
- <parameters>
- <parameter name="software-package" value="f:\xyz.sis"/>
- <parameter name="timeout" value="1200"/>
- <parameter name="upgrade-data " value="true"/>
- <parameter name="ignore-ocsp-warnings" value="true"/>
- <parameter name="ocsp-done" value="true"/>
- <parameter name="install-drive" value="f"/>
- <parameter name="overwrite-allowed" value="true"/>
- <parameter name="download-allowed" value="false"/>
- <parameter name="download-username" value="user"/>
- <parameter name="download-password" value="passwd"/>
- <parameter name="upgrade-allowed" value="true"/>
- <parameter name="optional-items-allowed" value="true"/>
- <parameter name="untrusted-allowed" value="true"/>
- <parameter name="package-info-allowed" value="true"/>
- <parameter name="user-capabilities-granted" value="true"/>
- <parameter name="kill-app" value="true"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>RebootTask</type>
- <parameters/>
- </task>
- <task agents="alias">
- <type>CreateDirTask</type>
- <parameters>
- <parameter name="dir" value="c:\logs\testability"/>
- </parameters>
- </task>
- </initialization>
- <task agents="alias">
- <type>MATTITask</type>
- <parameters>
- <parameter name="script" value="exe1\matti_testcases\"/>
- <parameter name="xml" value="exe1\matti_testcases\mattiparameters\."/>
- <parameter name="timeout" value="1200"/>
- <parameter name="sierra" value="true"/>
- <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/matti_testcases/profile/bat.sip test_unit"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>MATTITask</type>
- <parameters>
- <parameter name="script" value="exe1\matti_testcases\"/>
- <parameter name="xml" value="exe1\matti_testcases\mattiparameters\."/>
- <parameter name="timeout" value="1200"/>
- <parameter name="sierra" value="true"/>
- <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/matti_testcases/profile/fute.sip test_unit"/>
- </parameters>
- </task>
- <finalization>
- <task agents="alias">
- <type>CleanupTask</type>
- <parameters>
- <parameter name="upload-files" value="true"/>
- </parameters>
- </task>
- </finalization>
- </execution>
- <postActions>
- <action>
- <type>EmailAction</type>
- <parameters>
- <parameter name="subject" value="Matti test report"/>
- <parameter name="to" value="firstname.lastname@domain.com"/>
- <parameter name="format" value="simplelogger"/>
- </parameters>
- </action>
- </postActions>
-</testrun>
\ No newline at end of file
--- a/buildframework/helium/sf/python/pythoncore/tests/data/matti/test_all_present_sierra_disabled.xml Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<testrun>
- <metadata>
- <meta name="diamonds-buildid">http://diamonds.com/1234</meta>
- <meta name="diamonds-testtype">Smoke</meta>
- <meta name="name">matti test run</meta>
- </metadata>
- <agents>
- <agent alias="alias">
- <property name="hardware" value="new_device"/>
- </agent>
- </agents>
- <execution defaultAgent="alias">
- <initialization>
- <task agents="alias">
- <type>FlashTask</type>
- <parameters>
- <parameter name="image-1" value="images\image1.fpsx"/>
- <parameter name="image-2" value="images\image2.fpsx"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="exe1\matti_testcases\hwdata\file1.txt"/>
- <parameter name="dst" value="C:\Private\10202BE9\PERSISTS\file1.txt"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="exe1\matti_testcases\hwdata\settings.ini"/>
- <parameter name="dst" value="c:\sys\settings.ini"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="sisfiles\abc.sis"/>
- <parameter name="dst" value="c:\abc.sis"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>FileUploadTask</type>
- <parameters>
- <parameter name="src" value="sisfiles\xyz.sis"/>
- <parameter name="dst" value="f:\xyz.sis"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>InstallSisTask</type>
- <parameters>
- <parameter name="software-package" value="c:\abc.sis"/>
- <parameter name="timeout" value="1200"/>
- <parameter name="upgrade-data " value="true"/>
- <parameter name="ignore-ocsp-warnings" value="true"/>
- <parameter name="ocsp-done" value="true"/>
- <parameter name="install-drive" value="c"/>
- <parameter name="overwrite-allowed" value="true"/>
- <parameter name="download-allowed" value="false"/>
- <parameter name="download-username" value="user"/>
- <parameter name="download-password" value="passwd"/>
- <parameter name="upgrade-allowed" value="true"/>
- <parameter name="optional-items-allowed" value="true"/>
- <parameter name="untrusted-allowed" value="true"/>
- <parameter name="package-info-allowed" value="true"/>
- <parameter name="user-capabilities-granted" value="true"/>
- <parameter name="kill-app" value="true"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>InstallSisTask</type>
- <parameters>
- <parameter name="software-package" value="f:\xyz.sis"/>
- <parameter name="timeout" value="1200"/>
- <parameter name="upgrade-data " value="true"/>
- <parameter name="ignore-ocsp-warnings" value="true"/>
- <parameter name="ocsp-done" value="true"/>
- <parameter name="install-drive" value="f"/>
- <parameter name="overwrite-allowed" value="true"/>
- <parameter name="download-allowed" value="false"/>
- <parameter name="download-username" value="user"/>
- <parameter name="download-password" value="passwd"/>
- <parameter name="upgrade-allowed" value="true"/>
- <parameter name="optional-items-allowed" value="true"/>
- <parameter name="untrusted-allowed" value="true"/>
- <parameter name="package-info-allowed" value="true"/>
- <parameter name="user-capabilities-granted" value="true"/>
- <parameter name="kill-app" value="true"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>RebootTask</type>
- <parameters/>
- </task>
- <task agents="alias">
- <type>CreateDirTask</type>
- <parameters>
- <parameter name="dir" value="c:\logs\testability"/>
- </parameters>
- </task>
- </initialization>
- <task agents="alias">
- <type>MATTITask</type>
- <parameters>
- <parameter name="script" value="exe1\matti_testcases\"/>
- <parameter name="xml" value="exe1\matti_testcases\mattiparameters\."/>
- <parameter name="timeout" value="1200"/>
- <parameter name="sierra" value="false"/>
- <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/matti_testcases/unit_test1.rb test_unit"/>
- </parameters>
- </task>
- <task agents="alias">
- <type>MATTITask</type>
- <parameters>
- <parameter name="script" value="exe1\matti_testcases\"/>
- <parameter name="xml" value="exe1\matti_testcases\mattiparameters\."/>
- <parameter name="timeout" value="1200"/>
- <parameter name="sierra" value="false"/>
- <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/matti_testcases/unit_test2.rb test_unit"/>
- </parameters>
- </task>
- <finalization>
- <task agents="alias">
- <type>CleanupTask</type>
- <parameters>
- <parameter name="upload-files" value="true"/>
- </parameters>
- </task>
- </finalization>
- </execution>
- <postActions>
- <action>
- <type>EmailAction</type>
- <parameters>
- <parameter name="subject" value="Matti test report"/>
- <parameter name="to" value="firstname.lastname@domain.com"/>
- <parameter name="format" value="simplelogger"/>
- </parameters>
- </action>
- </postActions>
-</testrun>
Binary file buildframework/helium/sf/python/pythoncore/tests/data/packageiad/sis/testPackage.zip has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/tests/data/tdriver/tdriver_template.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
+<!--
+============================================================================
+Name : tdriver_template.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+Contains the template for the test.xml file output. The test.xml file contains
+information on the files used to create the drop file.
+============================================================================
+-->
+
+<testrun>
+ <metadata>
+ {% if xml_dict['diamonds_build_url'] -%}
+ <meta name="diamonds-buildid">{{ xml_dict['diamonds_build_url'] }}</meta>
+ <meta name="diamonds-testtype">Smoke</meta>
+ {% endif %}
+ <meta name="name">{{ xml_dict['testrun_name'] }}</meta>
+ </metadata>
+
+ <agents>
+ <agent alias="{{ xml_dict['alias_name'] }}">
+ <property name="hardware" value="{{ xml_dict["device_type"] }}"/>
+ </agent>
+ </agents>
+
+
+ {% for exe_block in xml_dict['execution_blocks'] -%}
+ <execution defaultAgent="{{ xml_dict['alias_name'] }}">
+ <initialization>
+
+ {% if exe_block['image_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FlashTask</type>
+ <parameters>
+ {% set i = 1 %}
+ {% for img in exe_block['image_files'] -%}
+ <parameter name="image-{{ i }}" value="images\{{ os.path.basename(img) }}" />
+ {% set i = i + 1 %}
+ {% endfor -%}
+ </parameters>
+ </task>
+ {% endif %}
+
+
+ {% if exe_block['install_files'] != [] -%}
+ {% for file in exe_block['install_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="{{exe_block['name']}}{{ atspath.normpath(atspath.normpath(file[0]).replace(atspath.normpath(exe_block['asset_path']).rsplit("\\", 1)[0], "")) }}"/>
+ <parameter name="dst" value="{{ atspath.normpath(file[1]) }}"/>
+ </parameters>
+ </task>
+ {% endfor -%}
+ {% endif %}
+
+ {% if exe_block['tdriver_sis_files'] != [] -%}
+ {% for sisfile in exe_block['tdriver_sis_files'] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="sisfiles\{{ os.path.basename(sisfile[0]) }}"/>
+ <parameter name="dst" value="{{ sisfile[2] }}"/>
+ </parameters>
+ </task>
+ {% endfor -%}
+ {% endif %}
+
+ {% for sis_file in exe_block["tdriver_sis_files"] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>InstallSisTask</type>
+ <parameters>
+ <parameter name="software-package" value="{{ sis_file[2] }}"/>
+ <parameter name="timeout" value="{{ exe_block["test_timeout"] }}"/>
+ <parameter name="upgrade-data" value="true"/>
+ <parameter name="ignore-ocsp-warnings" value="true"/>
+ <parameter name="ocsp-done" value="true"/>
+ <parameter name="install-drive" value="{{ sis_file[2].split(":")[0] }}"/>
+ <parameter name="overwrite-allowed" value="true"/>
+ <parameter name="download-allowed" value="false"/>
+ <parameter name="download-username" value="user"/>
+ <parameter name="download-password" value="passwd"/>
+ <parameter name="upgrade-allowed" value="true"/>
+ <parameter name="optional-items-allowed" value="true"/>
+ <parameter name="untrusted-allowed" value="true"/>
+ <parameter name="package-info-allowed" value="true"/>
+ <parameter name="user-capabilities-granted" value="true"/>
+ <parameter name="kill-app" value="true"/>
+ </parameters>
+ </task>
+ {%- endfor -%}
+
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>RebootTask</type>
+ <parameters/>
+ </task>
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>CreateDirTask</type>
+ <parameters>
+ <parameter value="c:\logs\testability" name="dir"/>
+ </parameters>
+ </task>
+ </initialization>
+
+ {% for task_file in exe_block["tdriver_task_files"] -%}
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>TestabilityTask</type>
+ <parameters>
+ <parameter value="{{ exe_block["name"] }}\tdriver_testcases\" name="script"/>
+ <parameter value="{{ exe_block["name"] }}\tdriver_testcases\tdriverparameters\{{ os.path.basename(exe_block["tdriver_parameters"][0]) }}" name="xml"/>
+ <parameter value="{{ exe_block['test_timeout'] }}" name="timeout"/>
+ <parameter value="{{ exe_block["tdrunner_enabled"] }}" name="tdrunner"/>
+ <parameter value="{{ exe_block["tdrunner_parameters"] }} -e %TEST_RUN_SANDBOX%/{{ exe_block["name"] }}/{{ task_file }} test_unit" name="executable-parameters"/>
+ </parameters>
+ </task>
+ {% endfor -%}
+
+ <finalization>
+ <task agents="{{ xml_dict['alias_name'] }}">
+ <type>CleanupTask</type>
+ <parameters>
+ <parameter value="true" name="upload-files"/>
+ </parameters>
+ </task>
+ </finalization>
+ </execution>
+ {% endfor -%}
+
+ <postActions>
+ <action>
+ <type>EmailAction</type>
+ <parameters>
+ <parameter value="{{ xml_dict['email_subject'] }}" name="subject"/>
+ <parameter value="{{ xml_dict['report_email'] }}" name="to"/>
+ <parameter value="{{ xml_dict['email_format'] }}" name="format"/>
+ </parameters>
+ </action>
+ {% if xml_dict['report_location'] -%}
+ <action>
+ <type>FileStoreAction</type>
+ <parameters>
+ <parameter value="{{ xml_dict['report_location'] }}\%START_DATE%_%START_TIME%_%SERVER_TOKEN%" name="dst"/>
+ <parameter value="true" name="overwrite"/>
+ </parameters>
+ </action>
+ {% endif %}
+ {% if xml_dict['diamonds_build_url'] -%}
+ <action>
+ <type>DiamondsAction</type>
+ </action>
+ {% endif %}
+ </postActions>
+
+</testrun>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/tests/data/tdriver/test.rb Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,34 @@
+# require needed Ruby, MATTI and Orbit files
+require 'test/unit'
+require 'otest/testcase'
+
+
+ #TODO: Give suitable name for test class
+class TestClassName < Test::Unit::TestCase
+
+ #no need to do anything for initialize method
+ def initialize (args)
+ super(args)
+ # TODO define application name
+ app_path("hbinputtest.exe")
+ end
+
+ # Test case method
+ #TODO: name test method with suitable name
+ # Must: Test method must start test_
+ # Recomended: really descriping name
+ def test_do_something
+
+ # create test object app from defined sut
+ app = @sut.run(:name => @app_name)
+ sleep(10)
+
+ #Application is closed after test
+ app.close
+ #Verifies it is closed
+
+ end #End of test case test_do_something
+
+
+end#Testsuite
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/tests/data/tdriver/test_all_present.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<testrun>
+ <metadata>
+ <meta name="diamonds-buildid">http://diamonds.com/1234</meta>
+ <meta name="diamonds-testtype">Smoke</meta>
+ <meta name="name">TDriver test run</meta>
+ </metadata>
+ <agents>
+ <agent alias="alias">
+ <property name="hardware" value="new_device"/>
+ </agent>
+ </agents>
+ <execution defaultAgent="alias">
+ <initialization>
+ <task agents="alias">
+ <type>FlashTask</type>
+ <parameters>
+ <parameter name="image-1" value="images\image1.fpsx"/>
+ <parameter name="image-2" value="images\image2.fpsx"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="exe1\tdriver_testcases\hwdata\file1.txt"/>
+ <parameter name="dst" value="C:\Private\10202BE9\PERSISTS\file1.txt"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="exe1\tdriver_testcases\hwdata\settings.ini"/>
+ <parameter name="dst" value="c:\sys\settings.ini"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="sisfiles\abc.sis"/>
+ <parameter name="dst" value="c:\abc.sis"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="sisfiles\xyz.sis"/>
+ <parameter name="dst" value="f:\xyz.sis"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>InstallSisTask</type>
+ <parameters>
+ <parameter name="software-package" value="c:\abc.sis"/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="upgrade-data" value="true"/>
+ <parameter name="ignore-ocsp-warnings" value="true"/>
+ <parameter name="ocsp-done" value="true"/>
+ <parameter name="install-drive" value="c"/>
+ <parameter name="overwrite-allowed" value="true"/>
+ <parameter name="download-allowed" value="false"/>
+ <parameter name="download-username" value="user"/>
+ <parameter name="download-password" value="passwd"/>
+ <parameter name="upgrade-allowed" value="true"/>
+ <parameter name="optional-items-allowed" value="true"/>
+ <parameter name="untrusted-allowed" value="true"/>
+ <parameter name="package-info-allowed" value="true"/>
+ <parameter name="user-capabilities-granted" value="true"/>
+ <parameter name="kill-app" value="true"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>InstallSisTask</type>
+ <parameters>
+ <parameter name="software-package" value="f:\xyz.sis"/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="upgrade-data" value="true"/>
+ <parameter name="ignore-ocsp-warnings" value="true"/>
+ <parameter name="ocsp-done" value="true"/>
+ <parameter name="install-drive" value="f"/>
+ <parameter name="overwrite-allowed" value="true"/>
+ <parameter name="download-allowed" value="false"/>
+ <parameter name="download-username" value="user"/>
+ <parameter name="download-password" value="passwd"/>
+ <parameter name="upgrade-allowed" value="true"/>
+ <parameter name="optional-items-allowed" value="true"/>
+ <parameter name="untrusted-allowed" value="true"/>
+ <parameter name="package-info-allowed" value="true"/>
+ <parameter name="user-capabilities-granted" value="true"/>
+ <parameter name="kill-app" value="true"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>RebootTask</type>
+ <parameters/>
+ </task>
+ <task agents="alias">
+ <type>CreateDirTask</type>
+ <parameters>
+ <parameter name="dir" value="c:\logs\testability"/>
+ </parameters>
+ </task>
+ </initialization>
+ <task agents="alias">
+ <type>TestabilityTask</type>
+ <parameters>
+ <parameter name="script" value="exe1\tdriver_testcases\"/>
+ <parameter name="xml" value="exe1\tdriver_testcases\tdriverparameters\."/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="tdrunner" value="true"/>
+ <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/tdriver_testcases/profile/bat.sip test_unit"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>TestabilityTask</type>
+ <parameters>
+ <parameter name="script" value="exe1\tdriver_testcases\"/>
+ <parameter name="xml" value="exe1\tdriver_testcases\tdriverparameters\."/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="tdrunner" value="true"/>
+ <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/tdriver_testcases/profile/fute.sip test_unit"/>
+ </parameters>
+ </task>
+ <finalization>
+ <task agents="alias">
+ <type>CleanupTask</type>
+ <parameters>
+ <parameter name="upload-files" value="true"/>
+ </parameters>
+ </task>
+ </finalization>
+ </execution>
+ <postActions>
+ <action>
+ <type>EmailAction</type>
+ <parameters>
+ <parameter name="subject" value="TDriver test report"/>
+ <parameter name="to" value="firstname.lastname@domain.com"/>
+ <parameter name="format" value="simplelogger"/>
+ </parameters>
+ </action>
+ <action>
+ <type>DiamondsAction</type>
+ </action>
+ </postActions>
+</testrun>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/tests/data/tdriver/test_all_present_tdrunner_disabled.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<testrun>
+ <metadata>
+ <meta name="diamonds-buildid">http://diamonds.com/1234</meta>
+ <meta name="diamonds-testtype">Smoke</meta>
+ <meta name="name">TDriver test run</meta>
+ </metadata>
+ <agents>
+ <agent alias="alias">
+ <property name="hardware" value="new_device"/>
+ </agent>
+ </agents>
+ <execution defaultAgent="alias">
+ <initialization>
+ <task agents="alias">
+ <type>FlashTask</type>
+ <parameters>
+ <parameter name="image-1" value="images\image1.fpsx"/>
+ <parameter name="image-2" value="images\image2.fpsx"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="exe1\tdriver_testcases\hwdata\file1.txt"/>
+ <parameter name="dst" value="C:\Private\10202BE9\PERSISTS\file1.txt"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="exe1\tdriver_testcases\hwdata\settings.ini"/>
+ <parameter name="dst" value="c:\sys\settings.ini"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="sisfiles\abc.sis"/>
+ <parameter name="dst" value="c:\abc.sis"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="sisfiles\xyz.sis"/>
+ <parameter name="dst" value="f:\xyz.sis"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>InstallSisTask</type>
+ <parameters>
+ <parameter name="software-package" value="c:\abc.sis"/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="upgrade-data" value="true"/>
+ <parameter name="ignore-ocsp-warnings" value="true"/>
+ <parameter name="ocsp-done" value="true"/>
+ <parameter name="install-drive" value="c"/>
+ <parameter name="overwrite-allowed" value="true"/>
+ <parameter name="download-allowed" value="false"/>
+ <parameter name="download-username" value="user"/>
+ <parameter name="download-password" value="passwd"/>
+ <parameter name="upgrade-allowed" value="true"/>
+ <parameter name="optional-items-allowed" value="true"/>
+ <parameter name="untrusted-allowed" value="true"/>
+ <parameter name="package-info-allowed" value="true"/>
+ <parameter name="user-capabilities-granted" value="true"/>
+ <parameter name="kill-app" value="true"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>InstallSisTask</type>
+ <parameters>
+ <parameter name="software-package" value="f:\xyz.sis"/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="upgrade-data" value="true"/>
+ <parameter name="ignore-ocsp-warnings" value="true"/>
+ <parameter name="ocsp-done" value="true"/>
+ <parameter name="install-drive" value="f"/>
+ <parameter name="overwrite-allowed" value="true"/>
+ <parameter name="download-allowed" value="false"/>
+ <parameter name="download-username" value="user"/>
+ <parameter name="download-password" value="passwd"/>
+ <parameter name="upgrade-allowed" value="true"/>
+ <parameter name="optional-items-allowed" value="true"/>
+ <parameter name="untrusted-allowed" value="true"/>
+ <parameter name="package-info-allowed" value="true"/>
+ <parameter name="user-capabilities-granted" value="true"/>
+ <parameter name="kill-app" value="true"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>RebootTask</type>
+ <parameters/>
+ </task>
+ <task agents="alias">
+ <type>CreateDirTask</type>
+ <parameters>
+ <parameter name="dir" value="c:\logs\testability"/>
+ </parameters>
+ </task>
+ </initialization>
+ <task agents="alias">
+ <type>TestabilityTask</type>
+ <parameters>
+ <parameter name="script" value="exe1\tdriver_testcases\"/>
+ <parameter name="xml" value="exe1\tdriver_testcases\tdriverparameters\."/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="tdrunner" value="false"/>
+ <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/tdriver_testcases/unit_test1.rb test_unit"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>TestabilityTask</type>
+ <parameters>
+ <parameter name="script" value="exe1\tdriver_testcases\"/>
+ <parameter name="xml" value="exe1\tdriver_testcases\tdriverparameters\."/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="tdrunner" value="false"/>
+ <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/tdriver_testcases/unit_test2.rb test_unit"/>
+ </parameters>
+ </task>
+ <finalization>
+ <task agents="alias">
+ <type>CleanupTask</type>
+ <parameters>
+ <parameter name="upload-files" value="true"/>
+ </parameters>
+ </task>
+ </finalization>
+ </execution>
+ <postActions>
+ <action>
+ <type>EmailAction</type>
+ <parameters>
+ <parameter name="subject" value="TDriver test report"/>
+ <parameter name="to" value="firstname.lastname@domain.com"/>
+ <parameter name="format" value="simplelogger"/>
+ </parameters>
+ </action>
+ <action>
+ <type>FileStoreAction</type>
+ <parameters>
+ <parameter name="dst" value="\\network\drive\%START_DATE%_%START_TIME%_%SERVER_TOKEN%"/>
+ <parameter name="overwrite" value="true"/>
+ </parameters>
+ </action>
+ <action>
+ <type>DiamondsAction</type>
+ </action>
+ </postActions>
+</testrun>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/python/pythoncore/tests/data/tdriver/test_ctc.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<testrun>
+ <metadata>
+ <meta name="diamonds-buildid">http://diamonds.com/1234</meta>
+ <meta name="diamonds-testtype">Smoke</meta>
+ <meta name="name">TDriver test run</meta>
+ </metadata>
+ <agents>
+ <agent alias="alias">
+ <property name="hardware" value="new_device"/>
+ </agent>
+ </agents>
+ <execution defaultAgent="alias">
+ <initialization>
+ <task agents="alias">
+ <type>FlashTask</type>
+ <parameters>
+ <parameter name="image-1" value="images\image1.fpsx"/>
+ <parameter name="image-2" value="images\image2.fpsx"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="exe1\tdriver_testcases\hwdata\file1.txt"/>
+ <parameter name="dst" value="C:\Private\10202BE9\PERSISTS\file1.txt"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="exe1\tdriver_testcases\hwdata\settings.ini"/>
+ <parameter name="dst" value="c:\sys\settings.ini"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="sisfiles\abc.sis"/>
+ <parameter name="dst" value="c:\abc.sis"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>FileUploadTask</type>
+ <parameters>
+ <parameter name="src" value="sisfiles\xyz.sis"/>
+ <parameter name="dst" value="f:\xyz.sis"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>InstallSisTask</type>
+ <parameters>
+ <parameter name="software-package" value="c:\abc.sis"/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="upgrade-data" value="true"/>
+ <parameter name="ignore-ocsp-warnings" value="true"/>
+ <parameter name="ocsp-done" value="true"/>
+ <parameter name="install-drive" value="c"/>
+ <parameter name="overwrite-allowed" value="true"/>
+ <parameter name="download-allowed" value="false"/>
+ <parameter name="download-username" value="user"/>
+ <parameter name="download-password" value="passwd"/>
+ <parameter name="upgrade-allowed" value="true"/>
+ <parameter name="optional-items-allowed" value="true"/>
+ <parameter name="untrusted-allowed" value="true"/>
+ <parameter name="package-info-allowed" value="true"/>
+ <parameter name="user-capabilities-granted" value="true"/>
+ <parameter name="kill-app" value="true"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>InstallSisTask</type>
+ <parameters>
+ <parameter name="software-package" value="f:\xyz.sis"/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="upgrade-data" value="true"/>
+ <parameter name="ignore-ocsp-warnings" value="true"/>
+ <parameter name="ocsp-done" value="true"/>
+ <parameter name="install-drive" value="f"/>
+ <parameter name="overwrite-allowed" value="true"/>
+ <parameter name="download-allowed" value="false"/>
+ <parameter name="download-username" value="user"/>
+ <parameter name="download-password" value="passwd"/>
+ <parameter name="upgrade-allowed" value="true"/>
+ <parameter name="optional-items-allowed" value="true"/>
+ <parameter name="untrusted-allowed" value="true"/>
+ <parameter name="package-info-allowed" value="true"/>
+ <parameter name="user-capabilities-granted" value="true"/>
+ <parameter name="kill-app" value="true"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>RebootTask</type>
+ <parameters/>
+ </task>
+ <task agents="alias">
+ <type>CreateDirTask</type>
+ <parameters>
+ <parameter name="dir" value="c:\logs\testability"/>
+ </parameters>
+ </task>
+ <task>
+ <type>CreateDirTask</type>
+ <parameters>
+ <parameter name="dir" value="c:\data\ctc"/>
+ </parameters>
+ </task>
+ <task>
+ <type>NonTestExecuteTask</type>
+ <parameters>
+ <parameter name="file" value="z:\sys\bin\ctcman.exe"/>
+ <parameter name="timeout" value="1200"/>
+ </parameters>
+ </task>
+ </initialization>
+ <task agents="alias">
+ <type>TestabilityTask</type>
+ <parameters>
+ <parameter name="script" value="exe1\tdriver_testcases\"/>
+ <parameter name="xml" value="exe1\tdriver_testcases\tdriverparameters\."/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="tdrunner" value="true"/>
+ <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/tdriver_testcases/profile/bat.sip test_unit"/>
+ </parameters>
+ </task>
+ <task agents="alias">
+ <type>TestabilityTask</type>
+ <parameters>
+ <parameter name="script" value="exe1\tdriver_testcases\"/>
+ <parameter name="xml" value="exe1\tdriver_testcases\tdriverparameters\."/>
+ <parameter name="timeout" value="1200"/>
+ <parameter name="tdrunner" value="true"/>
+ <parameter name="executable-parameters" value="--teardown -e %TEST_RUN_SANDBOX%/exe1/tdriver_testcases/profile/fute.sip test_unit"/>
+ </parameters>
+ </task>
+ <finalization>
+ <task>
+ <type>NonTestExecuteTask
+ </type>
+ <parameters>
+ <parameter name="parameters" value="writelocal"/>
+ <parameter name="file" value="z:\sys\bin\ctcman.exe"/>
+ <parameter name="timeout" value="1200"/>
+ </parameters>
+ </task>
+ <task>
+ <type>NonTestExecuteTask</type>
+ <parameters>
+ <parameter name="parameters" value="writefile"/>
+ <parameter name="file" value="z:\sys\bin\ctcman.exe"/>
+ <parameter name="timeout" value="1200"/>
+ </parameters>
+ </task>
+ <task>
+ <metadata>
+ <meta name="file-type">CTCDATA</meta>
+ </metadata>
+ <type>FileDownloadTask</type>
+ <parameters>
+ <parameter name="src" value="c:\data\ctc\ctcdata.txt"/>
+ <parameter name="reboot-retry-count" value="1"/>
+ <parameter name="retry-count" value="1"/>
+ </parameters>
+ </task>
+
+ <task agents="alias">
+ <type>CleanupTask</type>
+ <parameters>
+ <parameter name="upload-files" value="true"/>
+ </parameters>
+ </task>
+ </finalization>
+ </execution>
+ <postActions>
+ <action>
+ <type>EmailAction</type>
+ <parameters>
+ <parameter name="subject" value="TDriver test report"/>
+ <parameter name="to" value="firstname.lastname@domain.com"/>
+ <parameter name="format" value="simplelogger"/>
+ </parameters>
+ </action>
+ <action>
+ <type>DiamondsAction</type>
+ <parameters>
+ <parameter name="send-ctc-data" value="true"/>
+ </parameters>
+ </action>
+ </postActions>
+</testrun>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/diamonds/build_roms_sample.log Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,281 @@
+Starting build: 75090
+mkdir epoc32\rombuild\temp
+Number of threads: 4
+
+++ Started at Thu May 6 13:08:38 2010
++++ HiRes Start 1273147718
+-- cmd /c imaker WORKDIR=epoc32\rombuild\temp/config_482 -f /epoc32/rom/config/platform/productexample/image_conf_productexample_ui.mk TYPE=prd rofs3-dir
+iMaker 10.12.01, 23-Mar-2010.
+===============================================================================
+Target: rofs3-dir Duration: 00:02 Status: OK
+iMaker log = `Y:/output/release_flash_images/productexample/prd/customer/vanilla/rofs3/RM-XXX_010.014_00.01_79.92_prd_imaker_rofs3-dir.log'
+ROFS3 dir = `y:/output/release_flash_images/productexample/prd/customer/vanilla/rofs3'
+ROFS3 image = `y:/output/release_flash_images/productexample/prd/customer/vanilla/rofs3/RM-XXX_010.014_00.01_79.92_prd.rofs3.img' - DOESN'T EXIST
+ROFS3 symbols = `y:/output/release_flash_images/productexample/prd/customer/vanilla/rofs3/RM-XXX_010.014_00.01_79.92_prd.rofs3.symbol' - DOESN'T EXIST
+ROFS3 flash = `y:/output/release_flash_images/productexample/prd/customer/vanilla/RM-XXX_010.014_00.01_79.92_prd.rofs3.fpsx' - DOESN'T EXIST
+-------------------------------------------------------------------------------
+Total duration: 00:03 Status: OK
+===============================================================================
++++ HiRes End 1273147721
+++ Finished at Thu May 6 13:08:41 2010
+++ Started at Thu May 6 13:08:41 2010
++++ HiRes Start 1273147721
+-- cmd /c imaker WORKDIR=epoc32\rombuild\temp/config_484 -f /epoc32/rom/config/platform/productexample/image_conf_productexample_ui.mk TYPE=rnd udaerase-dir
+iMaker 10.12.01, 23-Mar-2010.
+===============================================================================
+Target: udaerase-dir Duration: 00:01 Status: OK
+iMaker log = `Y:/output/release_flash_images/productexample/rnd/uda/udaerase/udadata/RM-XXX_010.014_79.92.2010.15_rnd_imaker_udaerase-dir.log'
+UDA Erase flash = `y:/output/release_flash_images/productexample/rnd/uda/RM-XXX_010.014_79.92.2010.15_rnd.udaerase.fpsx' - DOESN'T EXIST
+-------------------------------------------------------------------------------
+Total duration: 00:02 Status: OK
+===============================================================================
++++ HiRes End 1273147723
+++ Finished at Thu May 6 13:08:43 2010
+++ Started at Thu May 6 13:08:41 2010
++++ HiRes Start 1273147721
+-- cmd /c imaker WORKDIR=epoc32\rombuild\temp/config_485 -f /epoc32/rom/config/platform/productexample/image_conf_productexample_ui.mk TYPE=prd udaerase-dir
+iMaker 10.12.01, 23-Mar-2010.
+===============================================================================
+Target: udaerase-dir Duration: 00:01 Status: OK
+iMaker log = `Y:/output/release_flash_images/productexample/prd/uda/udaerase/udadata/RM-XXX_010.014_79.92_prd_imaker_udaerase-dir.log'
+UDA Erase flash = `y:/output/release_flash_images/productexample/prd/uda/RM-XXX_010.014_79.92_prd.udaerase.fpsx' - DOESN'T EXIST
+-------------------------------------------------------------------------------
+Total duration: 00:02 Status: OK
+===============================================================================
++++ HiRes End 1273147723
+++ Finished at Thu May 6 13:08:43 2010
+++ Started at Thu May 6 13:08:41 2010
++++ HiRes Start 1273147721
+-- cmd /c imaker WORKDIR=epoc32\rombuild\temp/config_486 -f /epoc32/rom/config/platform/productexample/image_conf_productexample_ui.mk TYPE=subcon udaerase-dir
+iMaker 10.12.01, 23-Mar-2010.
+===============================================================================
+Target: udaerase-dir Duration: 00:01 Status: OK
+iMaker log = `Y:/output/release_flash_images/productexample/subcon/uda/udaerase/udadata/RM-XXX_010.014_79.92_subcon_imaker_udaerase-dir.log'
+UDA Erase flash = `y:/output/release_flash_images/productexample/subcon/uda/RM-XXX_010.014_79.92_subcon.udaerase.fpsx' - DOESN'T EXIST
+-------------------------------------------------------------------------------
+Total duration: 00:02 Status: OK
+===============================================================================
++++ HiRes End 1273147723
+++ Finished at Thu May 6 13:08:43 2010
+++ Started at Thu May 6 13:08:40 2010
++++ HiRes Start 1273147720
+-- cmd /c imaker WORKDIR=epoc32\rombuild\temp/config_483 -f /epoc32/rom/config/platform/productexample/image_conf_productexample_ui.mk TYPE=subcon rofs3-dir
+iMaker 10.12.01, 23-Mar-2010.
+===============================================================================
+Target: rofs3-dir Duration: 00:02 Status: OK
+iMaker log = `Y:/output/release_flash_images/productexample/subcon/customer/vanilla/rofs3/RM-XXX_010.014_00.01_79.92_subcon_imaker_rofs3-dir.log'
+ROFS3 dir = `y:/output/release_flash_images/productexample/subcon/customer/vanilla/rofs3'
+ROFS3 image = `y:/output/release_flash_images/productexample/subcon/customer/vanilla/rofs3/RM-XXX_010.014_00.01_79.92_subcon.rofs3.img' - DOESN'T EXIST
+ROFS3 symbols = `y:/output/release_flash_images/productexample/subcon/customer/vanilla/rofs3/RM-XXX_010.014_00.01_79.92_subcon.rofs3.symbol' - DOESN'T EXIST
+ROFS3 flash = `y:/output/release_flash_images/productexample/subcon/customer/vanilla/RM-XXX_010.014_00.01_79.92_subcon.rofs3.fpsx' - DOESN'T EXIST
+-------------------------------------------------------------------------------
+Total duration: 00:03 Status: OK
+===============================================================================
++++ HiRes End 1273147724
+++ Finished at Thu May 6 13:08:44 2010
+-- imaker -f /epoc32/rom/config/platform/productexample/image_conf_productexample_ui.mk TYPE=rnd core-image
+++ Started at Thu May 6 13:08:45 2010
++++ HiRes Start 1273147725.83
+imaker WORKDIR=epoc32\rombuild\temp/config_16 -f /epoc32/rom/config/platform/productexample/image_conf_productexample_ui.mk TYPE=rnd core-image
+iMaker 10.12.01, 23-Mar-2010.
+Generating file(s) for Core (ROM & ROFS1) image creation
+Generating Feature manager file(s)
+Creating Core (ROM & ROFS1) SOS image
+
+Missing file(s):
+1) y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_core_master.oby(1686): Missing file: '/epoc32/data/Z/resource/apps/MPSettingsROPModel.rsc' in statement 'data='
+2) y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_core_master.oby(1824): Missing file: '/epoc32/data/Z/private/20021377/backup_registration.xml' in statement 'data='
+3) y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_core_master.oby(2596): Missing file: '/epoc32/data/z/data/system/application/licenses/product/data.xml' in statement 'data='
+4) y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_core_master.oby(2597): Missing file: '/epoc32/data/z/data/system/application/licenses/product/key' in statement 'data='
+5) y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_core_master.oby(2614): Missing file: '/epoc32/data/Z/Resource/wappush/si.dtd' in statement 'data='
+6) y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_core_master.oby(2615): Missing file: '/epoc32/data/Z/Resource/wappush/sl.dtd' in statement 'data='
+7) y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_core_master.oby(2616): Missing file: '/epoc32/data/Z/Resource/wappush/si10.tok' in statement 'data='
+8) y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_core_master.oby(2617): Missing file: '/epoc32/data/Z/Resource/wappush/sl10.tok' in statement 'data='
+9) y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_core_master.oby(4905): Missing file: '/epoc32/data/Z/resource/help/juicehelp.hlp' in statement 'data='
+
+Warning(s):
+ 1) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x000003f5
+ 2) WARNING: the value of attribute statusflags has been overridden in original feature 0x000003f5
+ 3) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x0000000b
+ 4) WARNING: the value of attribute statusflags has been overridden in original feature 0x0000000b
+ 5) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x00000584
+ 6) WARNING: the value of attribute statusflags has been overridden in original feature 0x00000584
+ 7) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x0000019b
+ 8) WARNING: the value of attribute statusflags has been overridden in original feature 0x0000019b
+ 9) WARNING: the value of attribute statusflags has been overridden in original feature 0x00000007
+ 10) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x000005ff
+ 11) WARNING: the value of attribute statusflags has been overridden in original feature 0x000005ff
+ 12) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x000001f8
+ 13) WARNING: the value of attribute statusflags has been overridden in original feature 0x000001f8
+ 14) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x0000000c
+ 15) WARNING: the value of attribute statusflags has been overridden in original feature 0x0000000c
+ 16) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x0000007a
+ 17) WARNING: the value of attribute statusflags has been overridden in original feature 0x0000007a
+ 18) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x00000059
+ 19) WARNING: the value of attribute statusflags has been overridden in original feature 0x00000059
+ 20) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x00000003
+ 21) WARNING: the value of attribute statusflags has been overridden in original feature 0x00000003
+ 22) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x00000126
+ 23) WARNING: the value of attribute statusflags has been overridden in original feature 0x00000126
+ 24) WARNING: the value of attribute statusflags has been overridden in original feature 0x0000005b
+ 25) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x00000066
+ 26) WARNING: the value of attribute statusflags has been overridden in original feature 0x00000066
+ 27) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x00000001
+ 28) WARNING: the value of attribute statusflags has been overridden in original feature 0x00000001
+ 29) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x0000006b
+ 30) WARNING: the value of attribute statusflags has been overridden in original feature 0x0000006b
+ 31) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x000005f9
+ 32) WARNING: the value of attribute statusflags has been overridden in original feature 0x000005f9
+ 33) WARNING: the value of attribute statusflags has been overridden in original feature 0x00000072
+ 34) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x0000000d
+ 35) WARNING: the value of attribute statusflags has been overridden in original feature 0x0000000d
+ 36) WARNING: the value of attribute hrhmacro has been overridden in original feature 0x000006a9
+ 37) WARNING: the value of attribute statusflags has been overridden in original feature 0x000006a9
+ 38) WARNING: Error in reading features database file "/epoc32/include/s60customswfeatures.xml"
+ 39) WARNING: Unknown keyword 'LOCALISE_ALL_RESOURCES_BEGIN'. Line 2133 ignored
+ 40) WARNING: Unknown keyword 'LOCALISE_ALL_RESOURCES_END'. Line 2134 ignored
+ 41) WARNING: Unknown keyword '-----------------------------------------------------------'. Line 2210 ignored
+ 42) WARNING: Unknown keyword '-----------------------------------------------------------'. Line 2337 ignored
+ 43) WARNING: Unknown keyword '-----------------------------------------------------------'. Line 2338 ignored
+ 44) WARNING: Unknown keyword '***'. Line 2602 ignored
+ 45) WARNING: Unknown keyword 'LOCALISE_ALL_RESOURCES_BEGIN'. Line 2133 ignored
+ 46) WARNING: Unknown keyword 'LOCALISE_ALL_RESOURCES_END'. Line 2134 ignored
+ 47) WARNING: Unknown keyword '-----------------------------------------------------------'. Line 2210 ignored
+ 48) WARNING: Unknown keyword '-----------------------------------------------------------'. Line 2337 ignored
+ 49) WARNING: Unknown keyword '-----------------------------------------------------------'. Line 2338 ignored
+ 50) WARNING: Unknown keyword '***'. Line 2602 ignored
+ 51) WARNING: Kernel/variant/extension
+ 52) WARNING: Kernel/variant/extension
+ 53) WARNING: Kernel/variant/extension
+ 54) Warning: Can't open "\epoc32\release\ARMV5\urel\AR_LServer.exe.map" or "\epoc32\release\ARMV5\urel\AR_LServer.map"
+ 55) Warning: Can't open "\epoc32\release\ARMV5\urel\AP_CES_CoreComponents.dll.map" or "\epoc32\release\ARMV5\urel\AP_CES_CoreComponents.map"
+ 56) Warning: Can't open "\epoc32\release\ARMV5\urel\AP_HDMetafile2.dll.map" or "\epoc32\release\ARMV5\urel\AP_HDMetafile2.map"
+ 57) Warning: Can't open "\epoc32\release\ARMV5\urel\AP_HDOfficeCommon2.dll.map" or "\epoc32\release\ARMV5\urel\AP_HDOfficeCommon2.map"
+ 58) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_QORecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_QORecognizer.map"
+ 59) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_S60_CoreComponents.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_S60_CoreComponents.map"
+ 60) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_DeviceTransport.DLL.map" or "\epoc32\release\ARMV5\urel\ap_CES_DeviceTransport.map"
+ 61) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_zip.dll.map" or "\epoc32\release\ARMV5\urel\ap_zip.map"
+ 62) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_syb_XMLarchive.dll.map" or "\epoc32\release\ARMV5\urel\ap_syb_XMLarchive.map"
+ 63) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_FMPluginBase.dll.map" or "\epoc32\release\ARMV5\urel\ap_FMPluginBase.map"
+ 64) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_FILELISTFMPLUGIN.DLL.map" or "\epoc32\release\ARMV5\urel\ap_CES_FILELISTFMPLUGIN.map"
+ 65) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_QO_FileManager.exe.map" or "\epoc32\release\ARMV5\urel\ap_QO_FileManager.map"
+ 66) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_ces_ziprecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_ces_ziprecognizer.map"
+ 67) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_PptRecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_PptRecognizer.map"
+ 68) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_PptXRecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_PptXRecognizer.map"
+ 69) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_XlsRecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_XlsRecognizer.map"
+ 70) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_XlsXRecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_XlsXRecognizer.map"
+ 71) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_TxtRecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_TxtRecognizer.map"
+ 72) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_WrdRecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_WrdRecognizer.map"
+ 73) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_WrdXRecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_WrdXRecognizer.map"
+ 74) Warning: Can't open "\epoc32\release\ARMV5\urel\AP_CES_QPDFDescriptor.DLL.map" or "\epoc32\release\ARMV5\urel\AP_CES_QPDFDescriptor.map"
+ 75) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_PdfRecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_PdfRecognizer.map"
+ 76) Warning: Can't open "\epoc32\release\ARMV5\urel\AP_CES_PDFFILTERINFO.DLL.map" or "\epoc32\release\ARMV5\urel\AP_CES_PDFFILTERINFO.map"
+ 77) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_applicationStub.exe.map" or "\epoc32\release\ARMV5\urel\ap_applicationStub.map"
+ 78) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_quickpdf.exe.map" or "\epoc32\release\ARMV5\urel\ap_quickpdf.map"
+ 79) WARNING: File \epoc32\data\Z\Resource\APPS\ap_registration.rom does not exist or is 0 bytes in length.
+ 80) Warning: Can't open "\epoc32\release\ARMV5\urel\ap_CES_HTTP.dll.map" or "\epoc32\release\ARMV5\urel\ap_CES_HTTP.map"
+ 81) WARNING: File \epoc32\data\Z\private\102033E6\installer\inst_plugins.cfg does not exist or is 0 bytes in length.
+ 82) Warning: Can't open "\epoc32\release\ARMV5\urel\arcimagefundamental.dll.map" or "\epoc32\release\ARMV5\urel\arcimagefundamental.map"
+ 83) Warning: Can't open "\epoc32\release\ARMV5\urel\arcplatform.dll.map" or "\epoc32\release\ARMV5\urel\arcplatform.map"
+ 84) Warning: Can't open "\epoc32\release\ARMV5\urel\arcimagecodecs.dll.map" or "\epoc32\release\ARMV5\urel\arcimagecodecs.map"
+ 85) Warning: Can't open "\epoc32\release\ARMV5\urel\photoeditor.exe.map" or "\epoc32\release\ARMV5\urel\photoeditor.map"
+ 86) Warning: Can't open "\epoc32\release\ARMV5\urel\arcamui.dll.map" or "\epoc32\release\ARMV5\urel\arcamui.map"
+ 87) Warning: Can't open "\epoc32\release\ARMV5\urel\arcpebasictool.dll.map" or "\epoc32\release\ARMV5\urel\arcpebasictool.map"
+ 88) Warning: Can't open "\epoc32\release\ARMV5\urel\arcpebase.dll.map" or "\epoc32\release\ARMV5\urel\arcpebase.map"
+ 89) Warning: Can't open "\epoc32\release\ARMV5\urel\arcpemanager.dll.map" or "\epoc32\release\ARMV5\urel\arcpemanager.map"
+ 90) Warning: Can't open "\epoc32\release\ARMV5\urel\arcampe.dll.map" or "\epoc32\release\ARMV5\urel\arcampe.map"
+ 91) Warning: Can't open "\epoc32\release\ARMV5\urel\photoeditoraiwplugin.dll.map" or "\epoc32\release\ARMV5\urel\photoeditoraiwplugin.map"
+ 92) WARNING: File \epoc32\data\Z\Resource\APPS\registration.rom does not exist or is 0 bytes in length.
+ 93) Warning: Can't open "\epoc32\release\ARMV5\urel\QO_LServer.exe.map" or "\epoc32\release\ARMV5\urel\QO_LServer.map"
+ 94) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_devicetransport.dll.map" or "\epoc32\release\ARMV5\urel\ces_devicetransport.map"
+ 95) Warning: Can't open "\epoc32\release\ARMV5\urel\CES_CoreComponents.dll.map" or "\epoc32\release\ARMV5\urel\CES_CoreComponents.map"
+ 96) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_pdfrecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_pdfrecognizer.map"
+ 97) Warning: Can't open "\epoc32\release\ARMV5\urel\CES_OGLES_Charts.dll.map" or "\epoc32\release\ARMV5\urel\CES_OGLES_Charts.map"
+ 98) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_filelistfmplugin.dll.map" or "\epoc32\release\ARMV5\urel\ces_filelistfmplugin.map"
+ 99) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_pptfilterinfo.dll.map" or "\epoc32\release\ARMV5\urel\ces_pptfilterinfo.map"
+100) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_pptfilter.dll.map" or "\epoc32\release\ARMV5\urel\ces_pptfilter.map"
+101) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_pptrecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_pptrecognizer.map"
+102) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_pptxfilterinfo.dll.map" or "\epoc32\release\ARMV5\urel\ces_pptxfilterinfo.map"
+103) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_ziprecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_ziprecognizer.map"
+104) Warning: Can't open "\epoc32\release\ARMV5\urel\QO_PPTX_Engine_Conv.dll.map" or "\epoc32\release\ARMV5\urel\QO_PPTX_Engine_Conv.map"
+105) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_pptxrecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_pptxrecognizer.map"
+106) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_qorecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_qorecognizer.map"
+107) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_qshdescriptor.dll.map" or "\epoc32\release\ARMV5\urel\ces_qshdescriptor.map"
+108) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_qwddescriptor.dll.map" or "\epoc32\release\ARMV5\urel\ces_qwddescriptor.map"
+109) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_qptdescriptor.dll.map" or "\epoc32\release\ARMV5\urel\ces_qptdescriptor.map"
+110) Warning: Can't open "\epoc32\release\ARMV5\urel\CES_PPTXFILTER.DLL.map" or "\epoc32\release\ARMV5\urel\CES_PPTXFILTER.map"
+111) Warning: Can't open "\epoc32\release\ARMV5\urel\CES_QWS_SpellChecker.dll.map" or "\epoc32\release\ARMV5\urel\CES_QWS_SpellChecker.map"
+112) Warning: Can't open "\epoc32\release\ARMV5\urel\CES_RichText_Engine.dll.map" or "\epoc32\release\ARMV5\urel\CES_RichText_Engine.map"
+113) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_txtfilter.dll.map" or "\epoc32\release\ARMV5\urel\ces_txtfilter.map"
+114) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_txtfilterinfo.dll.map" or "\epoc32\release\ARMV5\urel\ces_txtfilterinfo.map"
+115) Warning: Can't open "\epoc32\release\ARMV5\urel\CES_S60_CoreComponents.dll.map" or "\epoc32\release\ARMV5\urel\CES_S60_CoreComponents.map"
+116) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_txtrecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_txtrecognizer.map"
+117) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_wrdfilter.dll.map" or "\epoc32\release\ARMV5\urel\ces_wrdfilter.map"
+118) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_wrdfilterinfo.dll.map" or "\epoc32\release\ARMV5\urel\ces_wrdfilterinfo.map"
+119) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_wrdrecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_wrdrecognizer.map"
+120) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_wrdxfilterinfo.dll.map" or "\epoc32\release\ARMV5\urel\ces_wrdxfilterinfo.map"
+121) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_wrdxrecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_wrdxrecognizer.map"
+122) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_wrdxfilter.dll.map" or "\epoc32\release\ARMV5\urel\ces_wrdxfilter.map"
+123) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_xlsfilter.dll.map" or "\epoc32\release\ARMV5\urel\ces_xlsfilter.map"
+124) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_xlsfilterinfo.dll.map" or "\epoc32\release\ARMV5\urel\ces_xlsfilterinfo.map"
+125) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_xlsrecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_xlsrecognizer.map"
+126) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_xlsxfilterinfo.dll.map" or "\epoc32\release\ARMV5\urel\ces_xlsxfilterinfo.map"
+127) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_xlsxrecognizer.dll.map" or "\epoc32\release\ARMV5\urel\ces_xlsxrecognizer.map"
+128) Warning: Can't open "\epoc32\release\ARMV5\urel\FMPluginBase.dll.map" or "\epoc32\release\ARMV5\urel\FMPluginBase.map"
+129) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_xlsxfilter.dll.map" or "\epoc32\release\ARMV5\urel\ces_xlsxfilter.map"
+130) Warning: Can't open "\epoc32\release\ARMV5\urel\HDExcel2.dll.map" or "\epoc32\release\ARMV5\urel\HDExcel2.map"
+131) Warning: Can't open "\epoc32\release\ARMV5\urel\HDMetafile2.dll.map" or "\epoc32\release\ARMV5\urel\HDMetafile2.map"
+132) Warning: Can't open "\epoc32\release\ARMV5\urel\HDOfficeCommon2.dll.map" or "\epoc32\release\ARMV5\urel\HDOfficeCommon2.map"
+133) Warning: Can't open "\epoc32\release\ARMV5\urel\QO_FileManager.exe.map" or "\epoc32\release\ARMV5\urel\QO_FileManager.map"
+134) Warning: Can't open "\epoc32\release\ARMV5\urel\HDPowerPoint2.dll.map" or "\epoc32\release\ARMV5\urel\HDPowerPoint2.map"
+135) Warning: Can't open "\epoc32\release\ARMV5\urel\HDWord2.dll.map" or "\epoc32\release\ARMV5\urel\HDWord2.map"
+136) Warning: Can't open "\epoc32\release\ARMV5\urel\quickpoint.exe.map" or "\epoc32\release\ARMV5\urel\quickpoint.map"
+137) Warning: Can't open "\epoc32\release\ARMV5\urel\quicksheet.exe.map" or "\epoc32\release\ARMV5\urel\quicksheet.map"
+138) Warning: Can't open "\epoc32\release\ARMV5\urel\Quickpoint_DOM.dll.map" or "\epoc32\release\ARMV5\urel\Quickpoint_DOM.map"
+139) Warning: Can't open "\epoc32\release\ARMV5\urel\Quicksheet_DOM.dll.map" or "\epoc32\release\ARMV5\urel\Quicksheet_DOM.map"
+140) Warning: Can't open "\epoc32\release\ARMV5\urel\Quickword.exe.map" or "\epoc32\release\ARMV5\urel\Quickword.map"
+141) Warning: Can't open "\epoc32\release\ARMV5\urel\SYB_XMLArchive.dll.map" or "\epoc32\release\ARMV5\urel\SYB_XMLArchive.map"
+142) Warning: Can't open "\epoc32\release\ARMV5\urel\Quickword_DOM.dll.map" or "\epoc32\release\ARMV5\urel\Quickword_DOM.map"
+143) Warning: Can't open "\epoc32\release\ARMV5\urel\QuickPDFStub.exe.map" or "\epoc32\release\ARMV5\urel\QuickPDFStub.map"
+144) Warning: Can't open "\epoc32\release\ARMV5\urel\CES_HTTP.dll.map" or "\epoc32\release\ARMV5\urel\CES_HTTP.map"
+145) Warning: Can't open "\epoc32\release\ARMV5\urel\ces_pdffilterinfostub.dll.map" or "\epoc32\release\ARMV5\urel\ces_pdffilterinfostub.map"
+146) Warning: Can't open "\epoc32\release\ARMV5\urel\zip.dll.map" or "\epoc32\release\ARMV5\urel\zip.map"
+147) Warning: Can't open "\epoc32\release\ARMV5\urel\videoeditor.exe.map" or "\epoc32\release\ARMV5\urel\videoeditor.map"
+148) Warning: Can't open "\epoc32\release\ARMV5\urel\amur.dll.map" or "\epoc32\release\ARMV5\urel\amur.map"
+149) Warning: Can't open "\epoc32\release\ARMV5\urel\arcavcodecs.dll.map" or "\epoc32\release\ARMV5\urel\arcavcodecs.map"
+150) Warning: Can't open "\epoc32\release\ARMV5\urel\amvesession.dll.map" or "\epoc32\release\ARMV5\urel\amvesession.map"
+151) Warning: Can't open "\epoc32\release\ARMV5\urel\videoeditoraiwplugin.dll.map" or "\epoc32\release\ARMV5\urel\videoeditoraiwplugin.map"
+152) Warning: Can't open "\epoc32\release\ARMV5\urel\3GPExtParser.dll.map" or "\epoc32\release\ARMV5\urel\3GPExtParser.map"
+153) Warning: Can't open "\epoc32\release\ARMV5\urel\VtcpCmpFilter.dll.map" or "\epoc32\release\ARMV5\urel\VtcpCmpFilter.map"
+154) Warning: Can't open "\epoc32\release\ARMV5\urel\SenVtcpTransport.dll.map" or "\epoc32\release\ARMV5\urel\SenVtcpTransport.map"
+155) Warning: Can't open "\epoc32\release\ARMV5\urel\wmdrmkeystorage.dll.map" or "\epoc32\release\ARMV5\urel\wmdrmkeystorage.map"
+156) Warning: Can't open "\epoc32\release\ARMV5\urel\hxwmdrmplugin.dll.map" or "\epoc32\release\ARMV5\urel\hxwmdrmplugin.map"
+157) Warning: Can't open "\epoc32\release\ARMV5\urel\wmdrmota.dll.map" or "\epoc32\release\ARMV5\urel\wmdrmota.map"
+158) Warning: Can't open "\epoc32\release\ARMV5\urel\wmdrmpkclient.dll.map" or "\epoc32\release\ARMV5\urel\wmdrmpkclient.map"
+159) Warning: Can't open "\epoc32\release\ARMV5\urel\wmdrmpkserver.exe.map" or "\epoc32\release\ARMV5\urel\wmdrmpkserver.map"
+160) Warning: Can't open "\epoc32\release\ARMV5\urel\wmdrmpkclientwrapper.dll.map" or "\epoc32\release\ARMV5\urel\wmdrmpkclientwrapper.map"
+161) Warning: Can't open "\epoc32\release\ARMV5\urel\cameseutility.dll.map" or "\epoc32\release\ARMV5\urel\cameseutility.map"
+162) Warning: Can't open "\epoc32\release\ARMV5\urel\wmdrmagent.dll.map" or "\epoc32\release\ARMV5\urel\wmdrmagent.map"
+163) Warning: Can't open "\epoc32\release\ARMV5\urel\wmdrmdla.dll.map" or "\epoc32\release\ARMV5\urel\wmdrmdla.map"
+164) Warning: Can't open "\epoc32\release\ARMV5\urel\wmdrmpd.dll.map" or "\epoc32\release\ARMV5\urel\wmdrmpd.map"
+165) Warning: Can't open "\epoc32\release\gcce\urel\zipmanager.exe.map" or "\epoc32\release\gcce\urel\zipmanager.map"
+166) Warning: Can't open "\epoc32\release\armv5\udeb\ctcmangui.exe.map" or "\epoc32\release\armv5\udeb\ctcmangui.map"
+167) Warning: Can't open "\epoc32\release\ARMV5\urel\eunits60gui.exe.map" or "\epoc32\release\ARMV5\urel\eunits60gui.map"
+168) Warning: Can't open "\epoc32\release\ARMV5\urel\eunitappenvironment.exe.map" or "\epoc32\release\ARMV5\urel\eunitappenvironment.map"
+169) Warning: Can't open "\epoc32\release\ARMV5\urel\euniteikappenvironment.exe.map" or "\epoc32\release\ARMV5\urel\euniteikappenvironment.map"
+170) Warning: Can't open "\epoc32\release\ARMV5\urel\qakitcommonui.dll.map" or "\epoc32\release\ARMV5\urel\qakitcommonui.map"
+171) Warning: Can't open "\epoc32\release\ARMV5\urel\digiaconnect.exe.map" or "\epoc32\release\ARMV5\urel\digiaconnect.map"
+
+Error(s):
+1) ERROR: (/epoc32/include/s60customswfeatures.xml) Feature "KFEATUREIDFFMOBILITYMANAGEMENTERRORS" already exists
+===============================================================================
+Target: core-image Duration: 14:26 Status: OK
+iMaker log = `Y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd_imaker_core-image.log'
+Core (ROM & ROFS1) dir = `y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd'
+Core ROM image = `y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd.rom.img'
+Core ROM symbols = `y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd.rom.symbol'
+Core ROFS1 image = `y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd.rofs1.img'
+Core ROFS1 symbols = `y:/output/release_flash_images/productexample/rnd/core/RM-XXX_010.014_79.92.2010.15_rnd/RM-XXX_010.014_79.92.2010.15_rnd.rofs1.symbol'
+-------------------------------------------------------------------------------
+Total duration: 14:29 Status: OK
+===============================================================================
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_failure/.static/default.css Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,843 @@
+/**
+ * Sphinx Doc Design
+ */
+
+body {
+ font-family: sans-serif;
+ font-size: 100%;
+ background-color: #11303d;
+ color: #000;
+ margin: 0;
+ padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.document {
+ background-color: #1c4e63;
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 230px;
+}
+
+div.body {
+ background-color: white;
+ padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+}
+
+div.clearer {
+ clear: both;
+}
+
+div.footer {
+ color: #fff;
+ width: 100%;
+ padding: 9px 0 9px 0;
+ text-align: center;
+ font-size: 75%;
+}
+
+div.footer a {
+ color: #fff;
+ text-decoration: underline;
+}
+
+div.related {
+ background-color: #133f52;
+ color: #fff;
+ width: 100%;
+ height: 30px;
+ line-height: 30px;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+div.related a {
+ color: white;
+}
+
+/* ::: TOC :::: */
+div.sphinxsidebar h3 {
+ font-family: 'Trebuchet MS', sans-serif;
+ color: white;
+ font-size: 1.4em;
+ font-weight: normal;
+ margin: 0;
+ padding: 0;
+}
+
+div.sphinxsidebar h4 {
+ font-family: 'Trebuchet MS', sans-serif;
+ color: white;
+ font-size: 1.3em;
+ font-weight: normal;
+ margin: 5px 0 0 0;
+ padding: 0;
+}
+
+div.sphinxsidebar p {
+ color: white;
+}
+
+div.sphinxsidebar p.topless {
+ margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+ margin: 10px;
+ padding: 0;
+ list-style: none;
+ color: white;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar a {
+ color: #98dbcc;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+/* :::: MODULE CLOUD :::: */
+div.modulecloud {
+ margin: -5px 10px 5px 10px;
+ padding: 10px;
+ line-height: 160%;
+ border: 1px solid #cbe7e5;
+ background-color: #f2fbfd;
+}
+
+div.modulecloud a {
+ padding: 0 5px 0 5px;
+}
+
+/* :::: SEARCH :::: */
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+ padding: 5px 10px 5px 10px;
+ border-top: 1px solid #cbe7e5;
+ border-bottom: 1px solid #cbe7e5;
+ background-color: #e0f6f4;
+}
+
+form dl {
+ color: #333;
+}
+
+form dt {
+ clear: both;
+ float: left;
+ min-width: 110px;
+ margin-right: 10px;
+ padding-top: 2px;
+}
+
+input#homepage {
+ display: none;
+}
+
+div.error {
+ margin: 5px 20px 0 0;
+ padding: 5px;
+ border: 1px solid #d00;
+ font-weight: bold;
+}
+
+/* :::: INLINE COMMENTS :::: */
+
+div.inlinecomments {
+ position: absolute;
+ right: 20px;
+}
+
+div.inlinecomments a.bubble {
+ display: block;
+ float: right;
+ background-image: url(style/comment.png);
+ background-repeat: no-repeat;
+ width: 25px;
+ height: 25px;
+ text-align: center;
+ padding-top: 3px;
+ font-size: 0.9em;
+ line-height: 14px;
+ font-weight: bold;
+ color: black;
+}
+
+div.inlinecomments a.bubble span {
+ display: none;
+}
+
+div.inlinecomments a.emptybubble {
+ background-image: url(style/nocomment.png);
+}
+
+div.inlinecomments a.bubble:hover {
+ background-image: url(style/hovercomment.png);
+ text-decoration: none;
+ color: #3ca0a4;
+}
+
+div.inlinecomments div.comments {
+ float: right;
+ margin: 25px 5px 0 0;
+ max-width: 50em;
+ min-width: 30em;
+ border: 1px solid #2eabb0;
+ background-color: #f2fbfd;
+ z-index: 150;
+}
+
+div#comments {
+ border: 1px solid #2eabb0;
+ margin-top: 20px;
+}
+
+div#comments div.nocomments {
+ padding: 10px;
+ font-weight: bold;
+}
+
+div.inlinecomments div.comments h3,
+div#comments h3 {
+ margin: 0;
+ padding: 0;
+ background-color: #2eabb0;
+ color: white;
+ border: none;
+ padding: 3px;
+}
+
+div.inlinecomments div.comments div.actions {
+ padding: 4px;
+ margin: 0;
+ border-top: none;
+}
+
+div#comments div.comment {
+ margin: 10px;
+ border: 1px solid #2eabb0;
+}
+
+div.inlinecomments div.comment h4,
+div.commentwindow div.comment h4,
+div#comments div.comment h4 {
+ margin: 10px 0 0 0;
+ background-color: #2eabb0;
+ color: white;
+ border: none;
+ padding: 1px 4px 1px 4px;
+}
+
+div#comments div.comment h4 {
+ margin: 0;
+}
+
+div#comments div.comment h4 a {
+ color: #d5f4f4;
+}
+
+div.inlinecomments div.comment div.text,
+div.commentwindow div.comment div.text,
+div#comments div.comment div.text {
+ margin: -5px 0 -5px 0;
+ padding: 0 10px 0 10px;
+}
+
+div.inlinecomments div.comment div.meta,
+div.commentwindow div.comment div.meta,
+div#comments div.comment div.meta {
+ text-align: right;
+ padding: 2px 10px 2px 0;
+ font-size: 95%;
+ color: #538893;
+ border-top: 1px solid #cbe7e5;
+ background-color: #e0f6f4;
+}
+
+div.commentwindow {
+ position: absolute;
+ width: 500px;
+ border: 1px solid #cbe7e5;
+ background-color: #f2fbfd;
+ display: none;
+ z-index: 130;
+}
+
+div.commentwindow h3 {
+ margin: 0;
+ background-color: #2eabb0;
+ color: white;
+ border: none;
+ padding: 5px;
+ font-size: 1.5em;
+ cursor: pointer;
+}
+
+div.commentwindow div.actions {
+ margin: 10px -10px 0 -10px;
+ padding: 4px 10px 4px 10px;
+ color: #538893;
+}
+
+div.commentwindow div.actions input {
+ border: 1px solid #2eabb0;
+ background-color: white;
+ color: #135355;
+ cursor: pointer;
+}
+
+div.commentwindow div.form {
+ padding: 0 10px 0 10px;
+}
+
+div.commentwindow div.form input,
+div.commentwindow div.form textarea {
+ border: 1px solid #3c9ea2;
+ background-color: white;
+ color: black;
+}
+
+div.commentwindow div.error {
+ margin: 10px 5px 10px 5px;
+ background-color: #fbe5dc;
+ display: none;
+}
+
+div.commentwindow div.form textarea {
+ width: 99%;
+}
+
+div.commentwindow div.preview {
+ margin: 10px 0 10px 0;
+ background-color: #70d0d4;
+ padding: 0 1px 1px 25px;
+}
+
+div.commentwindow div.preview h4 {
+ margin: 0 0 -5px -20px;
+ padding: 4px 0 0 4px;
+ color: white;
+ font-size: 1.3em;
+}
+
+div.commentwindow div.preview div.comment {
+ background-color: #f2fbfd;
+}
+
+div.commentwindow div.preview div.comment h4 {
+ margin: 10px 0 0 0!important;
+ padding: 1px 4px 1px 4px!important;
+ font-size: 1.2em;
+}
+
+/* :::: SUGGEST CHANGES :::: */
+div#suggest-changes-box input, div#suggest-changes-box textarea {
+ border: 1px solid #ccc;
+ background-color: white;
+ color: black;
+}
+
+div#suggest-changes-box textarea {
+ width: 99%;
+ height: 400px;
+}
+
+
+/* :::: PREVIEW :::: */
+div.preview {
+ background-image: url(style/preview.png);
+ padding: 0 20px 20px 20px;
+ margin-bottom: 30px;
+}
+
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* :::: INDEX STYLES :::: */
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+form.pfform {
+ margin: 10px 0 20px 0;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+.docwarning {
+ background-color: #ffe4e4;
+ padding: 10px;
+ margin: 0 -20px 0 -20px;
+ border-bottom: 1px solid #f66;
+}
+
+p.subhead {
+ font-weight: bold;
+ margin-top: 20px;
+}
+
+/*BMT added 16/10/08 */
+a:link {
+ color: blue;
+ text-decoration: none;
+}
+
+a:visited {
+ color: navy;
+ text-decoration: none;
+}
+
+a:hover {
+ color: purple;
+ text-decoration: underline;
+}
+/* BMT end added 16/10/08 */
+
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: 'Trebuchet MS', sans-serif;
+ background-color: #f2f2f2;
+ font-weight: normal;
+ color: #20435c;
+ border-bottom: 1px solid #ccc;
+ margin: 20px -20px 10px -20px;
+ padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 250%; color:black;}
+div.body h2 { font-size: 190%; color:#36237f;}
+div.body h3 { font-size: 150%; color:#4933af;}
+div.body h4 { font-size: 120%; color:#6223df;}
+div.body h5 { font-size: 100%; color:#6f23ef;}
+div.body h6 { font-size: 80%; color:#5a62ff;}
+
+a.headerlink {
+ color: #c60f0f;
+ font-size: 0.8em;
+ padding: 0 4px 0 4px;
+ text-decoration: none;
+ visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+ visibility: visible;
+}
+
+a.headerlink:hover {
+ background-color: #c60f0f;
+ color: white;
+}
+
+div.body p, div.body dd, div.body li {
+ text-align: left;
+ line-height: 130%;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+ul.fakelist {
+ list-style: none;
+ margin: 10px 0 10px 20px;
+ padding: 0;
+}
+
+.field-list ul {
+ padding-left: 1em;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+ background-color: #eee;
+ border: 1px solid #ccc;
+ padding: 0 7px 0 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+div.admonition dl {
+ margin-bottom: 0;
+}
+
+div.admonition p {
+ display: inline;
+}
+
+div.seealso {
+ background-color: #ffc;
+ border: 1px solid #ff6;
+}
+
+div.warning {
+ background-color: #ffe4e4;
+ border: 1px solid #f66;
+}
+
+div.note {
+ background-color: #eee;
+ border: 1px solid #ccc;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+ display: inline;
+}
+
+p.admonition-title:after {
+ content: ":";
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+table.docutils {
+ border: 0;
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 0;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+dl {
+ margin-bottom: 15px;
+ clear: both;
+}
+
+dd p {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+.refcount {
+ color: #060;
+}
+
+dt:target,
+.highlight {
+ background-color: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+pre {
+ padding: 5px;
+ background-color: #efc;
+ color: #333;
+ border: 1px solid #ac9;
+ border-left: none;
+ border-right: none;
+ overflow: auto;
+ word-wrap: break-word;
+}
+
+td.linenos pre {
+ padding: 5px 0px;
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ margin-left: 0.5em;
+}
+
+table.highlighttable td {
+ padding: 0 0.5em 0 0.5em;
+}
+
+tt {
+ background-color: #ecf0f3;
+ padding: 0 1px 0 1px;
+ font-size: 0.95em;
+}
+
+tt.descname {
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+tt.descclassname {
+ background-color: transparent;
+}
+
+tt.xref, a tt {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.footnote:target { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+form.comment {
+ margin: 0;
+ padding: 10px 30px 10px 30px;
+ background-color: #eee;
+}
+
+form.comment h3 {
+ background-color: #326591;
+ color: white;
+ margin: -10px -30px 10px -30px;
+ padding: 5px;
+ font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+ border: 1px solid #ccc;
+ padding: 2px;
+ font-family: sans-serif;
+ font-size: 100%;
+}
+
+form.comment input[type="text"] {
+ width: 240px;
+}
+
+form.comment textarea {
+ width: 100%;
+ height: 200px;
+ margin-bottom: 10px;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+/* :::: PRINT :::: */
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0;
+ width : 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ div#comments div.new-comment-box,
+ #top-link {
+ display: none;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_failure/.templates/indexcontent.html Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,38 @@
+{% extends "defindex.html" %}
+{% block tables %}
+ <p><strong>Parts of the documentation:</strong></p>
+ <table class="contentstable" align="center"><tr>
+ <td width="50%">
+ <p class="biglink"><a class="biglink" href="{{ pathto("releasenotes/index") }}">Release notes</a><br/>
+ <span class="linkdescr">what's new</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("quick_start_guide") }}">Quick Start Guide</a><br/>
+ <span class="linkdescr">start here</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("feature_list") }}">Feature list</a><br/>
+ <span class="linkdescr">what is supported</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("manual/index") }}">Manual</a><br/>
+ <span class="linkdescr">reference docs</span></p>
+ </td><td width="50%">
+ <p class="biglink"><a class="biglink" href="{{ pathto("tutorials/index") }}">HowTos</a><br/>
+ <span class="linkdescr">specific use cases</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("api/helium/index") }}">Helium API</a><br/>
+ <span class="linkdescr">or check <a href="{{ pathto("api/helium/targets_list") }}">Targets</a>, <a href="{{ pathto("api/helium/properties_list") }}">Properties</a>, <a href="{{ pathto("api/helium/macros_list") }}">Macros</a></span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("helium-antlib/index") }}">Ant libraries</a><br/>
+ <span class="linkdescr">when you just have to customize</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("development/index") }}">Development</a><br/>
+ <span class="linkdescr">for helium hackers everywhere</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("architecture") }}">Architecture</a><br/>
+ <span class="linkdescr">many pieces, loosely joined</span></p>
+ </td></tr>
+ </table>
+
+ <p><strong>Customer documentation:</strong></p>
+ <table class="contentstable" align="center"><tr>
+ <td width="50%">
+ <p class="biglink"><a class="biglink" href="http://helium.nmp.nokia.com/doc/ido">IDO</a><br/>
+ <span class="linkdescr">integration domains</span></p>
+ </td><td width="50%">
+ <p class="biglink"><a class="biglink" href="http://helium.nmp.nokia.com/doc/teamci">TeamCI</a><br/>
+ <span class="linkdescr">development teams</span></p>
+ </td></tr>
+ </table>
+{% endblock %}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_failure/.templates/sidebar.html Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,6 @@
+
+<h3>Docs for other versions</h3>
+<ul>
+ <li><a href="http://helium.nmp.nokia.com/doc/11.0.0">Helium 11.0.0</a></li>
+ <li><a href="http://helium.nmp.nokia.com/doc/10.0.0">Helium 10.0.0</a></li>
+</ul>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_failure/conf.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,183 @@
+# -*- coding: utf-8 -*-
+#============================================================================
+#Name : ant.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+#
+# Helium Documentation documentation build configuration file, created by
+# sphinx-quickstart on Fri May 09 09:49:44 2008.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# All configuration values have a default value; values that are commented out
+# serve to show the default value.
+
+import sys, os
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('some/directory'))
+
+# General configuration
+# ---------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx_ext']
+#api_doc_base_url =
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['.templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General substitutions.
+project = 'Helium'
+copyright = '2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html'
+
+# The default replacements for |version| and |release|, also used in various
+# other places throughout the built documents.
+#
+# The short X.Y version.
+version = '0.23'
+# The full version, including alpha/beta/rc tags.
+release = '0.23'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directories, that shouldn't be searched
+# for source files.
+#exclude_dirs = []
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'default.css'
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# The name of an image file (within the static path) to place at the top of
+# the sidebar.
+html_logo = 'helium_pallot_small.jpg'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['.static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+html_sidebars = {
+ 'index': 'sidebar.html'
+}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+html_additional_pages = {
+ 'index': 'indexcontent.html',
+}
+
+# If false, no module index is generated.
+html_use_modindex = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'Helium doc'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+ ('index', 'Helium.tex', 'Helium Documentation', 'The Helium Team', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
Binary file buildframework/helium/tests/data/doc/input_for_failure/helium_pallot_small.jpg has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_failure/index.rst Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,33 @@
+.. ============================================================================
+ Name : index.rst
+ Part of : Helium
+
+ 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 the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ ============================================================================
+
+###################################
+ Helium
+###################################
+
+":hlm-p:`this.property.doesnt.exist`"
+
+
+
+
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_pass/.static/default.css Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,843 @@
+/**
+ * Sphinx Doc Design
+ */
+
+body {
+ font-family: sans-serif;
+ font-size: 100%;
+ background-color: #11303d;
+ color: #000;
+ margin: 0;
+ padding: 0;
+}
+
+/* :::: LAYOUT :::: */
+
+div.document {
+ background-color: #1c4e63;
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 230px;
+}
+
+div.body {
+ background-color: white;
+ padding: 0 20px 30px 20px;
+}
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+}
+
+div.clearer {
+ clear: both;
+}
+
+div.footer {
+ color: #fff;
+ width: 100%;
+ padding: 9px 0 9px 0;
+ text-align: center;
+ font-size: 75%;
+}
+
+div.footer a {
+ color: #fff;
+ text-decoration: underline;
+}
+
+div.related {
+ background-color: #133f52;
+ color: #fff;
+ width: 100%;
+ height: 30px;
+ line-height: 30px;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+div.related a {
+ color: white;
+}
+
+/* ::: TOC :::: */
+div.sphinxsidebar h3 {
+ font-family: 'Trebuchet MS', sans-serif;
+ color: white;
+ font-size: 1.4em;
+ font-weight: normal;
+ margin: 0;
+ padding: 0;
+}
+
+div.sphinxsidebar h4 {
+ font-family: 'Trebuchet MS', sans-serif;
+ color: white;
+ font-size: 1.3em;
+ font-weight: normal;
+ margin: 5px 0 0 0;
+ padding: 0;
+}
+
+div.sphinxsidebar p {
+ color: white;
+}
+
+div.sphinxsidebar p.topless {
+ margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+ margin: 10px;
+ padding: 0;
+ list-style: none;
+ color: white;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar a {
+ color: #98dbcc;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+/* :::: MODULE CLOUD :::: */
+div.modulecloud {
+ margin: -5px 10px 5px 10px;
+ padding: 10px;
+ line-height: 160%;
+ border: 1px solid #cbe7e5;
+ background-color: #f2fbfd;
+}
+
+div.modulecloud a {
+ padding: 0 5px 0 5px;
+}
+
+/* :::: SEARCH :::: */
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* :::: COMMON FORM STYLES :::: */
+
+div.actions {
+ padding: 5px 10px 5px 10px;
+ border-top: 1px solid #cbe7e5;
+ border-bottom: 1px solid #cbe7e5;
+ background-color: #e0f6f4;
+}
+
+form dl {
+ color: #333;
+}
+
+form dt {
+ clear: both;
+ float: left;
+ min-width: 110px;
+ margin-right: 10px;
+ padding-top: 2px;
+}
+
+input#homepage {
+ display: none;
+}
+
+div.error {
+ margin: 5px 20px 0 0;
+ padding: 5px;
+ border: 1px solid #d00;
+ font-weight: bold;
+}
+
+/* :::: INLINE COMMENTS :::: */
+
+div.inlinecomments {
+ position: absolute;
+ right: 20px;
+}
+
+div.inlinecomments a.bubble {
+ display: block;
+ float: right;
+ background-image: url(style/comment.png);
+ background-repeat: no-repeat;
+ width: 25px;
+ height: 25px;
+ text-align: center;
+ padding-top: 3px;
+ font-size: 0.9em;
+ line-height: 14px;
+ font-weight: bold;
+ color: black;
+}
+
+div.inlinecomments a.bubble span {
+ display: none;
+}
+
+div.inlinecomments a.emptybubble {
+ background-image: url(style/nocomment.png);
+}
+
+div.inlinecomments a.bubble:hover {
+ background-image: url(style/hovercomment.png);
+ text-decoration: none;
+ color: #3ca0a4;
+}
+
+div.inlinecomments div.comments {
+ float: right;
+ margin: 25px 5px 0 0;
+ max-width: 50em;
+ min-width: 30em;
+ border: 1px solid #2eabb0;
+ background-color: #f2fbfd;
+ z-index: 150;
+}
+
+div#comments {
+ border: 1px solid #2eabb0;
+ margin-top: 20px;
+}
+
+div#comments div.nocomments {
+ padding: 10px;
+ font-weight: bold;
+}
+
+div.inlinecomments div.comments h3,
+div#comments h3 {
+ margin: 0;
+ padding: 0;
+ background-color: #2eabb0;
+ color: white;
+ border: none;
+ padding: 3px;
+}
+
+div.inlinecomments div.comments div.actions {
+ padding: 4px;
+ margin: 0;
+ border-top: none;
+}
+
+div#comments div.comment {
+ margin: 10px;
+ border: 1px solid #2eabb0;
+}
+
+div.inlinecomments div.comment h4,
+div.commentwindow div.comment h4,
+div#comments div.comment h4 {
+ margin: 10px 0 0 0;
+ background-color: #2eabb0;
+ color: white;
+ border: none;
+ padding: 1px 4px 1px 4px;
+}
+
+div#comments div.comment h4 {
+ margin: 0;
+}
+
+div#comments div.comment h4 a {
+ color: #d5f4f4;
+}
+
+div.inlinecomments div.comment div.text,
+div.commentwindow div.comment div.text,
+div#comments div.comment div.text {
+ margin: -5px 0 -5px 0;
+ padding: 0 10px 0 10px;
+}
+
+div.inlinecomments div.comment div.meta,
+div.commentwindow div.comment div.meta,
+div#comments div.comment div.meta {
+ text-align: right;
+ padding: 2px 10px 2px 0;
+ font-size: 95%;
+ color: #538893;
+ border-top: 1px solid #cbe7e5;
+ background-color: #e0f6f4;
+}
+
+div.commentwindow {
+ position: absolute;
+ width: 500px;
+ border: 1px solid #cbe7e5;
+ background-color: #f2fbfd;
+ display: none;
+ z-index: 130;
+}
+
+div.commentwindow h3 {
+ margin: 0;
+ background-color: #2eabb0;
+ color: white;
+ border: none;
+ padding: 5px;
+ font-size: 1.5em;
+ cursor: pointer;
+}
+
+div.commentwindow div.actions {
+ margin: 10px -10px 0 -10px;
+ padding: 4px 10px 4px 10px;
+ color: #538893;
+}
+
+div.commentwindow div.actions input {
+ border: 1px solid #2eabb0;
+ background-color: white;
+ color: #135355;
+ cursor: pointer;
+}
+
+div.commentwindow div.form {
+ padding: 0 10px 0 10px;
+}
+
+div.commentwindow div.form input,
+div.commentwindow div.form textarea {
+ border: 1px solid #3c9ea2;
+ background-color: white;
+ color: black;
+}
+
+div.commentwindow div.error {
+ margin: 10px 5px 10px 5px;
+ background-color: #fbe5dc;
+ display: none;
+}
+
+div.commentwindow div.form textarea {
+ width: 99%;
+}
+
+div.commentwindow div.preview {
+ margin: 10px 0 10px 0;
+ background-color: #70d0d4;
+ padding: 0 1px 1px 25px;
+}
+
+div.commentwindow div.preview h4 {
+ margin: 0 0 -5px -20px;
+ padding: 4px 0 0 4px;
+ color: white;
+ font-size: 1.3em;
+}
+
+div.commentwindow div.preview div.comment {
+ background-color: #f2fbfd;
+}
+
+div.commentwindow div.preview div.comment h4 {
+ margin: 10px 0 0 0!important;
+ padding: 1px 4px 1px 4px!important;
+ font-size: 1.2em;
+}
+
+/* :::: SUGGEST CHANGES :::: */
+div#suggest-changes-box input, div#suggest-changes-box textarea {
+ border: 1px solid #ccc;
+ background-color: white;
+ color: black;
+}
+
+div#suggest-changes-box textarea {
+ width: 99%;
+ height: 400px;
+}
+
+
+/* :::: PREVIEW :::: */
+div.preview {
+ background-image: url(style/preview.png);
+ padding: 0 20px 20px 20px;
+ margin-bottom: 30px;
+}
+
+
+/* :::: INDEX PAGE :::: */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* :::: INDEX STYLES :::: */
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+form.pfform {
+ margin: 10px 0 20px 0;
+}
+
+/* :::: GLOBAL STYLES :::: */
+
+.docwarning {
+ background-color: #ffe4e4;
+ padding: 10px;
+ margin: 0 -20px 0 -20px;
+ border-bottom: 1px solid #f66;
+}
+
+p.subhead {
+ font-weight: bold;
+ margin-top: 20px;
+}
+
+/*BMT added 16/10/08 */
+a:link {
+ color: blue;
+ text-decoration: none;
+}
+
+a:visited {
+ color: navy;
+ text-decoration: none;
+}
+
+a:hover {
+ color: purple;
+ text-decoration: underline;
+}
+/* BMT end added 16/10/08 */
+
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: 'Trebuchet MS', sans-serif;
+ background-color: #f2f2f2;
+ font-weight: normal;
+ color: #20435c;
+ border-bottom: 1px solid #ccc;
+ margin: 20px -20px 10px -20px;
+ padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 250%; color:black;}
+div.body h2 { font-size: 190%; color:#36237f;}
+div.body h3 { font-size: 150%; color:#4933af;}
+div.body h4 { font-size: 120%; color:#6223df;}
+div.body h5 { font-size: 100%; color:#6f23ef;}
+div.body h6 { font-size: 80%; color:#5a62ff;}
+
+a.headerlink {
+ color: #c60f0f;
+ font-size: 0.8em;
+ padding: 0 4px 0 4px;
+ text-decoration: none;
+ visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+ visibility: visible;
+}
+
+a.headerlink:hover {
+ background-color: #c60f0f;
+ color: white;
+}
+
+div.body p, div.body dd, div.body li {
+ text-align: left;
+ line-height: 130%;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+ul.fakelist {
+ list-style: none;
+ margin: 10px 0 10px 20px;
+ padding: 0;
+}
+
+.field-list ul {
+ padding-left: 1em;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+/* "Footnotes" heading */
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+/* "Topics" */
+
+div.topic {
+ background-color: #eee;
+ border: 1px solid #ccc;
+ padding: 0 7px 0 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* Admonitions */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+div.admonition dl {
+ margin-bottom: 0;
+}
+
+div.admonition p {
+ display: inline;
+}
+
+div.seealso {
+ background-color: #ffc;
+ border: 1px solid #ff6;
+}
+
+div.warning {
+ background-color: #ffe4e4;
+ border: 1px solid #f66;
+}
+
+div.note {
+ background-color: #eee;
+ border: 1px solid #ccc;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+ display: inline;
+}
+
+p.admonition-title:after {
+ content: ":";
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+table.docutils {
+ border: 0;
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 0;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+dl {
+ margin-bottom: 15px;
+ clear: both;
+}
+
+dd p {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+.refcount {
+ color: #060;
+}
+
+dt:target,
+.highlight {
+ background-color: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+pre {
+ padding: 5px;
+ background-color: #efc;
+ color: #333;
+ border: 1px solid #ac9;
+ border-left: none;
+ border-right: none;
+ overflow: auto;
+ word-wrap: break-word;
+}
+
+td.linenos pre {
+ padding: 5px 0px;
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ margin-left: 0.5em;
+}
+
+table.highlighttable td {
+ padding: 0 0.5em 0 0.5em;
+}
+
+tt {
+ background-color: #ecf0f3;
+ padding: 0 1px 0 1px;
+ font-size: 0.95em;
+}
+
+tt.descname {
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+tt.descclassname {
+ background-color: transparent;
+}
+
+tt.xref, a tt {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+.footnote:target { background-color: #ffa }
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+ background-color: transparent;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+form.comment {
+ margin: 0;
+ padding: 10px 30px 10px 30px;
+ background-color: #eee;
+}
+
+form.comment h3 {
+ background-color: #326591;
+ color: white;
+ margin: -10px -30px 10px -30px;
+ padding: 5px;
+ font-size: 1.4em;
+}
+
+form.comment input,
+form.comment textarea {
+ border: 1px solid #ccc;
+ padding: 2px;
+ font-family: sans-serif;
+ font-size: 100%;
+}
+
+form.comment input[type="text"] {
+ width: 240px;
+}
+
+form.comment textarea {
+ width: 100%;
+ height: 200px;
+ margin-bottom: 10px;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+/* :::: PRINT :::: */
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0;
+ width : 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ div#comments div.new-comment-box,
+ #top-link {
+ display: none;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_pass/.templates/indexcontent.html Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,38 @@
+{% extends "defindex.html" %}
+{% block tables %}
+ <p><strong>Parts of the documentation:</strong></p>
+ <table class="contentstable" align="center"><tr>
+ <td width="50%">
+ <p class="biglink"><a class="biglink" href="{{ pathto("releasenotes/index") }}">Release notes</a><br/>
+ <span class="linkdescr">what's new</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("quick_start_guide") }}">Quick Start Guide</a><br/>
+ <span class="linkdescr">start here</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("feature_list") }}">Feature list</a><br/>
+ <span class="linkdescr">what is supported</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("manual/index") }}">Manual</a><br/>
+ <span class="linkdescr">reference docs</span></p>
+ </td><td width="50%">
+ <p class="biglink"><a class="biglink" href="{{ pathto("tutorials/index") }}">HowTos</a><br/>
+ <span class="linkdescr">specific use cases</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("api/helium/index") }}">Helium API</a><br/>
+ <span class="linkdescr">or check <a href="{{ pathto("api/helium/targets_list") }}">Targets</a>, <a href="{{ pathto("api/helium/properties_list") }}">Properties</a>, <a href="{{ pathto("api/helium/macros_list") }}">Macros</a></span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("helium-antlib/index") }}">Ant libraries</a><br/>
+ <span class="linkdescr">when you just have to customize</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("development/index") }}">Development</a><br/>
+ <span class="linkdescr">for helium hackers everywhere</span></p>
+ <p class="biglink"><a class="biglink" href="{{ pathto("architecture") }}">Architecture</a><br/>
+ <span class="linkdescr">many pieces, loosely joined</span></p>
+ </td></tr>
+ </table>
+
+ <p><strong>Customer documentation:</strong></p>
+ <table class="contentstable" align="center"><tr>
+ <td width="50%">
+ <p class="biglink"><a class="biglink" href="http://helium.nmp.nokia.com/doc/ido">IDO</a><br/>
+ <span class="linkdescr">integration domains</span></p>
+ </td><td width="50%">
+ <p class="biglink"><a class="biglink" href="http://helium.nmp.nokia.com/doc/teamci">TeamCI</a><br/>
+ <span class="linkdescr">development teams</span></p>
+ </td></tr>
+ </table>
+{% endblock %}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_pass/.templates/sidebar.html Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,6 @@
+
+<h3>Docs for other versions</h3>
+<ul>
+ <li><a href="http://helium.nmp.nokia.com/doc/11.0.0">Helium 11.0.0</a></li>
+ <li><a href="http://helium.nmp.nokia.com/doc/10.0.0">Helium 10.0.0</a></li>
+</ul>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_pass/conf.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,183 @@
+# -*- coding: utf-8 -*-
+#============================================================================
+#Name : ant.py
+#Part of : Helium
+
+#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 the License "Eclipse Public License v1.0"
+#which accompanies this distribution, and is available
+#at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+#Initial Contributors:
+#Nokia Corporation - initial contribution.
+#
+#Contributors:
+#
+#Description:
+#===============================================================================
+#
+# Helium Documentation documentation build configuration file, created by
+# sphinx-quickstart on Fri May 09 09:49:44 2008.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# All configuration values have a default value; values that are commented out
+# serve to show the default value.
+
+import sys, os
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('some/directory'))
+
+# General configuration
+# ---------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx_ext']
+#api_doc_base_url =
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['.templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General substitutions.
+project = 'Helium'
+copyright = '2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved. License: http://www.eclipse.org/legal/epl-v10.html'
+
+# The default replacements for |version| and |release|, also used in various
+# other places throughout the built documents.
+#
+# The short X.Y version.
+version = '0.23'
+# The full version, including alpha/beta/rc tags.
+release = '0.23'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directories, that shouldn't be searched
+# for source files.
+#exclude_dirs = []
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'default.css'
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# The name of an image file (within the static path) to place at the top of
+# the sidebar.
+html_logo = 'helium_pallot_small.jpg'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['.static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+html_sidebars = {
+ 'index': 'sidebar.html'
+}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+html_additional_pages = {
+ 'index': 'indexcontent.html',
+}
+
+# If false, no module index is generated.
+html_use_modindex = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'Helium doc'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+ ('index', 'Helium.tex', 'Helium Documentation', 'The Helium Team', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
Binary file buildframework/helium/tests/data/doc/input_for_pass/helium_pallot_small.jpg has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/data/doc/input_for_pass/index.rst Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,32 @@
+.. ============================================================================
+ Name : index.rst
+ Part of : Helium
+
+ 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 the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ ============================================================================
+
+###################################
+ Helium
+###################################
+
+
+
+
+
+
+
+
+
--- a/buildframework/helium/tests/minibuilds/ats/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/ats/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -56,7 +56,8 @@
<!-- build configuration -->
<property name="sysdef.configurations.list" value="helium_minibuild_ats_compile" />
<path id="system.definition.files">
- <fileset dir="." includes="*.sysdef.xml"/>
+ <fileset dir="${build.drive}/sf/app/contacts" includes="package_definition.xml"/>
+ <fileset dir="${build.drive}/sf/os/graphics" includes="package_definition.xml"/>
</path>
<!--
--- a/buildframework/helium/tests/minibuilds/compile/archive.cfg.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/compile/archive.cfg.xml Mon Oct 18 10:23:52 2010 +0100
@@ -32,11 +32,11 @@
<config name="empty_minibuild_archive" abstract="true" />
<config name="minibuild_archive" abstract="true">
- <set name="grace.service" value="minibuild"/>
- <set name="grace.product" value="SF"/>
- <set name="grace.release" value="SF_minibuild_${build.number}"/>
- <set name="grace.metadata" value="true"/>
- <set name="grace.template" value="${config.dir}/template_release_metadata.xml"/>
+ <set name="release.service" value="minibuild"/>
+ <set name="release.product" value="SF"/>
+ <set name="release.name" value="SF_minibuild_${build.number}"/>
+ <set name="release.metadata" value="true"/>
+ <set name="release.template" value="${config.dir}/template_release_metadata.xml"/>
<set name="archives.dir" value="${zips.build.dir}/${zipping.type}"/>
<set name="clock.dir" value="${build.drive}\sf\app\organizer\clock2"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/compile/archive.split.cfg.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name :
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<build>
+ <config abstract="true">
+ <set name="max.uncompressed.size" value="12500000"/>
+ <set name="split.on.uncompressed.size.enabled" value="true"/>
+ <set name="max.files.per.archive" value="65000"/>
+ <set name="archive.tool" value="7za"/>
+ <set name="root.dir" value="${build.drive}\"/>
+ <set name="temp.build.dir" value="${temp.build.dir}"/>
+ <set name="archives.dir" value="${zips.build.dir}/${zipping.type}"/>
+
+ <config name="minibuild_archive" abstract="true">
+ <config>
+ <set name="name" value="sf_mw_classicui_and_app_radio_01"/>
+ <set name="mapper" value="policy"/>
+ <set name="include" value="sf/mw/classicui/**"/>
+ <set name="include" value="sf/app/radio/**"/>
+ <set name="exclude" value="**/_ccmwaid.inf"/>
+ <set name="policy.csv" value="${config.dir}/distribution.policy.extended_for_sf.id_status.csv"/>
+ </config>
+ <config>
+ <set name="name" value="sf_os_01"/>
+ <set name="mapper" value="policy.remover"/>
+ <set name="include" value="test_policy/os/**"/>
+ <set name="exclude" value="**/_ccmwaid.inf"/>
+ <set name="policy.root.dir" value="${build.drive}/test_policy"/>
+ <set name="policy.csv" value="${config.dir}/distribution.policy.extended_for_sf.id_status.csv"/>
+ </config>
+ </config>
+ </config>
+</build>
+
\ No newline at end of file
--- a/buildframework/helium/tests/minibuilds/compile/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/compile/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -34,10 +34,14 @@
<property name="minor.version" value="0" />
<property name="publish.root.dir" location="${build.drive}/release" />
- <!-- For Grace upload-->
+ <!-- For upload-->
<property name="hydra.service" value="Helium" />
<property name="hydra.product" value="minibuild_compile" />
<property name="release.label" value="${major.version}.${minor.version}" />
+
+ <!-- build -->
+ <property name="qmake.enabled" value="true" />
+ <property name="sysdef3.enabled" value="false" />
<!-- build configuration -->
<property name="sysdef.configurations.list" value="helium_minibuild_compile" />
@@ -221,7 +225,7 @@
</target>
- <target name="minibuild-archive" depends="minibuild-archive-ant,minibuild-archive-ec-full,minibuild-archive-ant-empty-config" />
+ <target name="minibuild-archive" depends="minibuild-archive-ant,minibuild-archive-ec-full,minibuild-archive-ant-empty-config,minibuild-split-archive-ec-full,minibuild-split-archive-ant" />
<!-- This target will copy a part of the tree structure to test policy.remover mapper. -->
<target name="prepare-archiving">
@@ -254,7 +258,26 @@
<param name="zipping.type" value="ant" />
<!-- Uses to set the target location -->
</antcall>
-
+ </target>
+
+ <target name="minibuild-split-archive-ec-full">
+ <antcall target="do-minibuild-split-archive">
+ <param name="build.system" value="ec-helium" />
+ <param name="zip.config.file" value="archive.split.cfg.xml" />
+ <param name="archive.using.ec" value="true" />
+ <param name="zipping.type" value="ec" />
+ <!-- Uses to set the target location -->
+ </antcall>
+ </target>
+
+ <target name="minibuild-split-archive-ant">
+ <antcall target="do-minibuild-split-archive">
+ <param name="build.system" value="ebs" />
+ <param name="zip.config.file" value="archive.split.cfg.xml" />
+ <param name="archive.using.ec" value="false" />
+ <param name="zipping.type" value="ant" />
+ <!-- Uses to set the target location -->
+ </antcall>
</target>
<target name="minibuild-archive-ant-empty-config">
@@ -286,6 +309,33 @@
<au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_1435.zip" />
<au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_1436.zip" />
</target>
+
+ <target name="do-minibuild-split-archive">
+ <runtarget target="prepare-archiving" />
+ <runtarget target="zip-ee" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part01_0.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part02_0.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part03_0.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part04_0.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part05_0.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part01_3.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part02_3.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part03_3.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part01_7.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part02_7.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part03_7.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part04_7.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part05_7.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_part06_7.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_mw_classicui_and_app_radio_01_1401.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_01_0.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_01_1.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_01_part01_2.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_01_3.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_01_part01_1422.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_01_part02_1422.zip" />
+ <au:assertFileExists file="${zips.build.dir}/${zipping.type}/sf_os_01_part01_1435.zip" />
+ </target>
<target name="minibuild-cleanup">
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/docs/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : build.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="minibuild.docs" default="minibuild.docs-test" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium" basedir=".">
+
+ <property name="helium.dir" location="../../.." />
+ <import file="../../../build.xml" />
+
+ <!-- Run Ant unit tests. -->
+ <target name="minibuild.docs-test">
+ <mkdir dir="${helium.build.dir}/temp/minibuild"/>
+ <mkdir dir="${helium.build.dir}/report/antunit/minibuild"/>
+ <au:antunit>
+ <fileset dir="${helium.dir}" includes="tests/minibuilds/docs/test_docs_minibuild.ant.xml"/>
+ <au:plainlistener/>
+ <hlm:antcoveragelistener outputfile="${helium.build.dir}/report/antunit/minibuild/ant_coverage.txt"/>
+ <au:xmllistener toDir="${helium.build.dir}/report/antunit/minibuild" logLevel="info" />
+ </au:antunit>
+ </target>
+
+</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/docs/hlm.bat Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+@echo off
+
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of the License "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem
+
+..\..\..\hlm.bat %*
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/docs/test_docs_minibuild.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_docs_minibuild.ant.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_docs_minibuild" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>
+ Targets to test docs minibuild job
+ </description>
+ <property name="helium.dir" location="../../.." />
+ <property name="cache.dir" value="build/cache" />
+ <import file="../../../build.xml" />
+
+ <target name="setUp">
+ <mkdir dir="${doc.build.dir}\docs_minibuild"/>
+ <antcall target="docs-database"/>
+ </target>
+
+ <target name="test-check-minibuild-docs-fails">
+ <!-- Insert one undocumented property and check that we fail -->
+ <au:expectfailure>
+ <antcall target="build-textdocs">
+ <param name="doc.temp.dir" value="${helium.dir}\tests\data\doc\input_for_failure"/>
+ <param name="doc.build.dir" value="${doc.build.dir}\docs_minibuild"/>
+ </antcall>
+ </au:expectfailure>
+ <au:assertLogContains text="EXCEPTION: Found 1 error(s) of type '(ERROR/3) Missing API doc for <property>'"/>
+ </target>
+
+ <target name="test-check-minibuild-docs-succeeds">
+ <antcall target="build-textdocs">
+ <param name="doc.temp.dir" value="${helium.dir}\tests\data\doc\\input_for_pass"/>
+ <param name="doc.build.dir" value="${doc.build.dir}\docs_minibuild"/>
+ </antcall>
+ <au:assertLogDoesntContain text="EXCEPTION: Found 1 error(s) of type '(ERROR/3) Missing API doc for <property>'"/>
+ </target>
+
+ <target name="tearDown">
+ <delete dir="${doc.build.dir}\.."/>
+ </target>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/tests/minibuilds/ido-sbs-coverity/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/ido-sbs-coverity/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -32,8 +32,10 @@
<property name="s60.grace.product" value="DFS7x.92" />
<property name="s60.grace.release" value="92_\d{6}_hw79" />
+ <property name="sysdef3.enabled" value="true" />
+ <property name="codescanner.enabled" value="false" />
+
<!-- enable coverity -->
- <property name="coverity.enabled" value="true"/>
<property name="coverity.commit.defects.enabled" value="true"/>
<property name="coverity.defect.manager.server" value="ousrv057.europe.nokia.com"/>
<property name="coverity.defect.manager.port" value="5467"/>
@@ -50,7 +52,9 @@
<property name="build.name" value="minibuild_ido_sbs_coverity" />
<property name="build.family" value="test_minibuild_ido_sbs_coverity" />
-
+
+ <property name="sfvalidate.enabled" value="true" />
+
<target name="minibuild-check">
<!-- Check if prep has set some prop correctly... -->
<echo>'${arm.compiler.version}'</echo>
@@ -67,9 +71,43 @@
</if>
</target>
+ <!-- Preparing the content on top of the env -->
+ <target name="ido-50-build" depends="ido-build-prep,compile-main-source,build-log-summary,render-internal-exports,
+ update-policy-src-reference,render-validate-policy,check-sf-source-header,
+ ido-codescanner,ido-check-sf-source-header,iad-check-pkg-version,ats-test,publish-tasks-to-folder,
+ ido-sources-to-s60-build-robot,check-epl-errors" />
+
+ <target name="ido-build-prep" depends="ido-configure-prep,init,log-build-env,set-arm-version,check-free-space,
+ diamonds,do-prep-work-area,ido-prep-clean-source,ido-prep-copy,create-bom" />
+
+ <target name="ido-prep-clean-source">
+ <antcall target="ido-prep-clean">
+ <param name="enabled.coverity" value="false"/>
+ </antcall>
+ </target>
+
+ <target name="compile-main-source">
+ <antcall target="compile-main">
+ <param name="coverity.enabled" value="true"/>
+ </antcall>
+ </target>
+
<import file="../ido/build.xml"/>
<import file="build.sbsinput.ant.xml" />
+
+ <hlm:signalInput id="EPLLicenseSignalInput" failbuild="never">
+ <hlm:notifierListRef refid="defaultFailNotifier" />
+ </hlm:signalInput>
+
+ <target name="check-epl-errors">
+ <loadfile property="epl.errors" srcFile="${sf.check.source.log}"/>
+ <au:assertMatches string="${epl.errors}"
+ pattern="ERROR: EPL license header not found:"
+ message="EPL validation is not done."
+ multiline="true"
+ />
+ </target>
</project>
\ No newline at end of file
--- a/buildframework/helium/tests/minibuilds/ido-sbs/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/ido-sbs/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -26,6 +26,7 @@
<!-- Configuring raptor build system -->
<property name="build.system" value="sbs"/>
+ <property name="qmake.enabled" value="true" />
<!-- Configuring get latest env. -->
<property name="s60.grace.service" value="s60_devices_sw" />
@@ -33,8 +34,14 @@
<property name="s60.grace.release" value="92_\d{6}_hw79" />
<!-- Synergy project for TB92 -->
- <property name="ccm.project" value="MinibuildDomain-tr1ido#50_201012:project:tr1test1#1" />
+ <property name="ccm.project" value="MinibuildDomain-tr1ido#20100928_3:project:tr1test1#1" />
+
+ <!-- Compatibility analyser enabling flag, causes binary check to be run -->
+ <property name="ca.enabled" value="true" />
+ <property name="bc.prep.ca.file" location="${helium.dir}/tools/quality/compatibility_analyser/ca.cfg.xml" />
+ <property name="codescanner.enabled" value="false" />
+
<!-- Run the full sequence of target for the minibuild. ,minibuild-prep,compile-main,zip-ee,minibuild-check-->
<!--<target name="do-minibuild" depends="minibuild-cleanup,
@@ -47,8 +54,18 @@
<if>
<istrue value="${blocks.enabled}" />
<then>
- <au:assertFileExists file="${blocks.config.dir}/minibuild_helloworldapi.blocks_component.xml" />
- <au:assertFileExists file="${blocks.config.dir}/minibuild_helloworldcons.blocks_component.xml" />
+ <if>
+ <istrue value="${sysdef3.enabled}" />
+ <then>
+ <au:assertFileExists file="${blocks.config.dir}/helloworld_api.blocks_component.xml" />
+ <au:assertFileExists file="${blocks.config.dir}/helloworldcons_app.blocks_component.xml" />
+ <au:assertFileExists file="${blocks.config.dir}/qt_helloworld_app.blocks_component.xml" />
+ </then>
+ <else>
+ <au:assertFileExists file="${blocks.config.dir}/minibuild_helloworldapi.blocks_component.xml" />
+ <au:assertFileExists file="${blocks.config.dir}/minibuild_helloworldcons.blocks_component.xml" />
+ </else>
+ </if>
</then>
</if>
</target>
@@ -71,6 +88,10 @@
<hlm:notifierListRef refid="defaultFailNotifier" />
</hlm:signalInput>
+ <!-- used by the compatibility analyser to define the build log that is to be
+ scanned and the output used for the comparison-->
+ <property name="bc.log.file.to.scan" location="${build.log.dir}/compile/${build.id}_dfs_build_armv5_compile.log" />
+
</project>
\ No newline at end of file
--- a/buildframework/helium/tests/minibuilds/ido-sbs/common.sbsinput.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/ido-sbs/common.sbsinput.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -25,6 +25,10 @@
Common sbs input config.
</description>
<!-- Common make options for particular engine values of it could be overridden by referencing it-->
+ <condition property="sbs.no.thread.jobs" value="20" else="${number.of.threads}">
+ <equals arg1="${build.system}" arg2="sbs-ec" />
+ </condition>
+
<hlm:sbsmakeoptions id="commonEMakeOptions" engine="emake">
<arg name="--emake-emulation" value="gmake" />
<arg name="--emake-annodetail" value="basic,history,waiting" />
@@ -51,6 +55,7 @@
<!-- tools common sbs options -->
<hlm:sbsoptions id="commonSBS">
<arg line="-k" />
+ <arg line="-j ${sbs.no.thread.jobs}" />
</hlm:sbsoptions>
<!-- tools common sbs options -->
--- a/buildframework/helium/tests/minibuilds/ido/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/ido/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -35,6 +35,7 @@
<property name="minor.version" value="0" />
<!-- Compatibility analyser enabling flag, causes binary check to be run -->
<property name="ca.enabled" value="true" />
+ <property name="bc.prep.ca.file" location="${helium.dir}/tools/quality/compatibility_analyser/ca.cfg.xml" />
<condition property="ccm.project.wa_path" value="${data.drive.letter}:\Build_${data.drive.letter}\${env.USERNAME}\ido_wa\${build.name}" else="${build.name}\wa" >
<os family="windows"/>
@@ -47,20 +48,35 @@
<!-- build configuration -->
<property name="sysdef.configurations.list" value="helium_minibuild_ido" />
- <path id="system.definition.files">
+ <property name="sysdef3.enabled" value="true" />
+ <property name="qmake.enabled" value="true" />
+ <condition property="sysdef3.system.definition.files.id" value="system.definition.files.new" else="system.definition.files.old">
+ <istrue value="${sysdef3.enabled}" />
+ </condition>
+ <!--property name="ido.name" value="test_cmt" /-->
+ <path id="system.definition.files.old">
<fileset dir="${config.dir}" includes="sysdefs/*.sysdef.xml" />
<fileset dir="${ccm.project.wa_path}" includes="*/*/*/layers.sysdef.xml" />
</path>
+
+ <path id="system.definition.files.new">
+ <fileset dir="${ccm.project.wa_path}" includes="*/*/*/package_definition.xml"/>
+ </path>
+
+
+ <path id="system.definition.files">
+ <path refid="${sysdef3.system.definition.files.id}" />
+ </path>
<!-- Configuring the build system -->
- <property name="build.system" value="ec-helium" />
+ <property name="build.system" value="sbs" />
<property name="rvct.version" value="22_686" />
<!-- Configuring get latest env. -->
- <property name="s60.grace.service" value="S60RnD" />
- <property name="s60.grace.product" value="pf_5250_prd" />
- <property name="s60.grace.release" value="pf_5250_prd_\d{2}\.\d{1}\.\d{3}" />
+ <property name="s60.grace.service" value="s60_devices_sw" />
+ <property name="s60.grace.product" value="DFS7x.92" />
+ <property name="s60.grace.release" value="92_\d{6}_hw79" />
<!-- matching mcl_200948_hw79 -->
<condition property="prep.root.dir" value="${data.drive.letter}:\Build_${data.drive.letter}\${env.USERNAME}\ido_ba\${build.name}" else="${build.name}\ido_ba" >
@@ -86,7 +102,8 @@
<import file="hack-test.ant.xml" />
<import file="${helium.dir}/helium.ant.xml" />
<import file="config/stages_config.ant.xml" />
-
+ <import file="config/build.sbsinput.ant.xml" />
+
<!-- Run the full sequence of target for the minibuild. ,minibuild-prep,compile-main,zip-ee,minibuild-check-->
<target name="do-minibuild" depends="ido-update-build-area,
flag-ba-for-deletion,
@@ -215,8 +232,10 @@
</target>
- <target name="update-policy-src-reference" depends="ido-create-ado-mapping">
- <hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="reference.policy.path.list"/>
+ <target name="update-policy-src-reference">
+ <property name="policy.src.mapping.file" location="${build.output.dir}/build/ado_mapping_policy_src.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${policy.src.mapping.file}" />
+ <hlm:iniKeys2Path ini="${policy.src.mapping.file}" pathid="reference.policy.path.list"/>
</target>
</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/config/build.sbsinput.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,278 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name :
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="ido_sbs_input" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>
+ ido sbs input
+ </description>
+
+ <import file="common.sbsinput.ant.xml" />
+ <patternset id="build_layers" >
+ <include name="os_layer" />
+ <include name="bldfirst_mw_layer" />
+ <include name="bldfirst_app_layer" />
+ <include name="mw_layer" />
+ <include name="complementary_layer" />
+ <include name="app_layer" />
+ <include name="tools_layer" />
+ <include name="stubs_layer" />
+ <include name="addon_layer" />
+ </patternset>
+
+ <patternset id="dfs_build_layers" >
+ <include name="os_layer" />
+ <include name="bldfirst_mw_layer" />
+ <include name="bldfirst_app_layer" />
+ <include name="mw_layer" />
+ <include name="complementary_layer" />
+ <include name="app_layer" />
+ <include name="tools_layer" />
+ <include name="addon_layer" />
+ </patternset>
+
+ <patternset id="test_layers" >
+ <include name="api_test_layer" />
+ <include name="unit_test_layer" />
+ <include name="perf_test_layer" />
+ <include name="module_test_layer" />
+ <include name="qt_unit_test_layer" />
+ </patternset>
+
+
+ <hlm:sbsinput id="build_input_tools">
+ <sbsInput refid="tools-${build.system}" />
+ <sbsOptions/>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="build_input_armv5">
+ <sbsInput refid="armv5-${build.system}" />
+ <sbsOptions>
+ <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_build.compile.log" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="build_input">
+ <sbsInput refid="build_input_tools" />
+ <sbsInput refid="build_input_armv5" />
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="build_input_clean_tools">
+ <sbsInput refid="tools-${build.system}-clean" />
+ <sbsOptions>
+ <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_rel_build_clean.compile.log" />
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_rel_build_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="build_input_clean_armv5">
+ <sbsInput refid="armv5-${build.system}-clean" />
+ <sbsOptions>
+ <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_build_clean.compile.log" />
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_build_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsbuild id="sbs.build_clean">
+ <sbsInput refid="build_input_clean_tools" />
+ <sbsInput refid="build_input_clean_armv5" />
+ </hlm:sbsbuild>
+
+ <hlm:sbsinput id="helium_minibuild_ido_input_tools">
+ <sbsInput refid="tools-${build.system}" />
+ <sbsOptions>
+ <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_ido.compile.log" />
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_ido" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="helium_minibuild_ido_input_armv5">
+ <sbsInput refid="armv5-${build.system}" />
+ <sbsOptions>
+ <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_ido.compile.log" />
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_ido" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="helium_minibuild_ido_input">
+ <sbsInput refid="helium_minibuild_ido_input_tools" />
+ <sbsInput refid="helium_minibuild_ido_input_armv5" />
+ </hlm:sbsinput>
+
+ <hlm:sbsbuild id="sbs.helium_minibuild_ido">
+ <sbsInput refid="helium_minibuild_ido_input" />
+ </hlm:sbsbuild>
+
+ <hlm:sbsinput id="helium_minibuild_ido_input_clean">
+ <sbsInput refid="helium_minibuild_ido_clean_tools" />
+ <sbsInput refid="helium_minibuild_ido_clean_armv5" />
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="helium_minibuild_ido_input_clean_tools">
+ <sbsInput refid="tools-${build.system}-clean"/>
+ <sbsOptions>
+ <arg name="--logfile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_ido_clean.compile.log" />
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_helium_minibuild_ido_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="helium_minibuild_ido_input_clean_armv5">
+ <sbsInput refid="armv5-${build.system}-clean" />
+ <sbsOptions>
+ <arg name="--logfile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_ido_clean.compile.log" />
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_helium_minibuild_ido_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsbuild id="sbs.helium_minibuild_ido_clean">
+ <sbsInput refid="helium_minibuild_ido_input_clean_tools" />
+ <sbsInput refid="helium_minibuild_ido_input_clean_armv5" />
+ </hlm:sbsbuild>
+
+ <hlm:sbsinput id="sf_build_input_tools">
+ <sbsInput refid="tools-${build.system}" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_sf_build" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="sf_build_input_armv5">
+ <sbsInput refid="armv5-${build.system}" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_sf_build" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="sf_build_input">
+ <sbsInput refid="sf_build_input_tools" />
+ <sbsInput refid="sf_build_input_armv5" />
+ </hlm:sbsinput>
+
+ <hlm:sbsbuild id="sbs.sf_build">
+ <sbsInput refid="sf_build_input" />
+ </hlm:sbsbuild>
+
+ <hlm:sbsinput id="sf_build_input_clean_tools">
+ <sbsInput refid="tools-${build.system}-clean" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_sf_build_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="sf_build_input_armv5">
+ <sbsInput refid="armv5-${build.system}-clean" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_sf_build_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="sf_build_input_clean">
+ <sbsInput refid="sf_build_input_clean_tools" />
+ <sbsInput refid="sf_build_input_clean_armv5" />
+ </hlm:sbsinput>
+
+ <hlm:sbsbuild id="sbs.sf_build_clean">
+ <sbsInput refid="sf_build_input_clean" />
+ </hlm:sbsbuild>
+
+ <hlm:sbsinput id="nonhw_input_clean_tools">
+ <sbsInput refid="tools-${build.system}-clean" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_winscw_build_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="nonhw_input_clean_winscw">
+ <sbsInput refid="winscw-${build.system}-clean" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_winscw_winscw_build_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="nonhw_input_clean">
+ <sbsInput refid="nonhw_input_clean_tools" />
+ <sbsInput refid="nonhw_input_clean_winscw" />
+ </hlm:sbsinput>
+
+ <hlm:sbsbuild id="sbs.nonhw_clean">
+ <sbsInput refid="nonhw_input_clean" />
+ </hlm:sbsbuild>
+
+ <hlm:sbsinput id="nonhw_input_tools">
+ <sbsInput refid="tools-${build.system}" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_build" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="nonhw_input_winscw">
+ <sbsInput refid="winscw-${build.system}" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_winscw_build" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="test_input_tools">
+ <sbsInput refid="test-${build.system}" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_test" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="test_input_armv5">
+ <sbsInput refid="test-${build.system}" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_test" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="test_input">
+ <sbsInput refid="test_input_tools" />
+ <sbsInput refid="test_input_armv5" />
+ </hlm:sbsinput>
+
+ <hlm:sbsbuild id="sbs.test">
+ <sbsInput refid="test_input" />
+ </hlm:sbsbuild>
+
+ <hlm:sbsinput id="test_input_clean_tools">
+ <sbsInput refid="test-${build.system}" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_tools_test_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="test_input_clean_armv5">
+ <sbsInput refid="test-${build.system}" />
+ <sbsOptions>
+ <arg name="--makefile" value="${compile.log.dir}/${build.id}_armv5_test_clean" />
+ </sbsOptions>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="test_input_clean">
+ <sbsInput refid="test_input_clean_tools" />
+ <sbsInput refid="test_input_clean_armv5" />
+ </hlm:sbsinput>
+
+ <hlm:sbsbuild id="sbs.test_clean">
+ <sbsInput refid="test_input_clean" />
+ </hlm:sbsbuild>
+</project>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tests/minibuilds/ido/config/common.sbsinput.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,184 @@
+<?xml version="1.0"?>
+<!--
+============================================================================
+Name :
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="common_sbs_input" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>
+ Common sbs input config.
+ </description>
+ <!-- Common make options for particular engine values of it could be overridden by referencing it-->
+ <hlm:sbsmakeoptions id="commonEMakeOptions" engine="emake">
+ <arg name="--emake-emulation" value="gmake" />
+ <arg name="--emake-annodetail" value="basic,history,waiting" />
+ <arg name="--emake-class" value="${ec.build.class}" />
+ <arg name="--emake-historyfile" value="${build.log.dir}/ec_history/raptor_clean.emake.data" />
+ <arg name="--case-sensitive" value="0" />
+ <arg name="--emake-root" value="${env.EMAKE_ROOT};${helium.dir};${env.SBS_HOME}" />
+ </hlm:sbsmakeoptions>
+
+ <hlm:sbsmakeoptions id="commonGmakeOptions" engine="gmake" />
+ <hlm:sbsmakeoptions id="commonPVMGmakeOptions" engine="pvmgmake" />
+
+ <!-- Tools specific make options inheriting the commone make option-->
+ <hlm:sbsmakeoptions id="toolsmake-sbs-ec">
+ <sbsmakeoptions refid="commonEMakeOptions" />
+ <arg name="--emake-maxagents" value="1" />
+ </hlm:sbsmakeoptions>
+
+ <!-- Main build make option directly refering to common emake option -->
+ <hlm:sbsmakeoptions id="mainbuildmake-sbs-ec">
+ <sbsmakeoptions refid="commonEMakeOptions" />
+ </hlm:sbsmakeoptions>
+
+ <!-- tools common sbs options -->
+ <hlm:sbsoptions id="commonSBS">
+ <arg line="-k" />
+ </hlm:sbsoptions>
+
+ <!-- tools common sbs options -->
+ <hlm:sbsoptions id="toolsCommonSBS">
+ <argset refid="commonSBS" />
+ <arg line="-c tools_rel -c tools2_rel" />
+ <arg line="-j 1" />
+ </hlm:sbsoptions>
+
+ <hlm:sbsoptions id="winscwSBSOptions">
+ <argset refid="commonSBS" />
+ <arg line="-c winscw" />
+ </hlm:sbsoptions>
+
+ <!-- Mainbuild common sbs options -->
+ <hlm:sbsoptions id="armv5CommonSBS">
+ <argset refid="commonSBS" />
+ <arg line="-c armv5" />
+ </hlm:sbsoptions>
+
+ <hlm:sbsoptions id="testCommonSBS">
+ <argset refid="commonSBS" />
+ <arg line="-c armv5.test" />
+ </hlm:sbsoptions>
+
+
+ <hlm:sbsoptions id="testCleanSBS">
+ <argset refid="testcommonSBS" />
+ <argset refid="cleanCommon" />
+ </hlm:sbsoptions>
+
+ <hlm:sbsoptions id="cleanCommon">
+ <arg line="REALLYCLEAN" />
+ </hlm:sbsoptions>
+
+ <!-- Mainbuild common sbs options -->
+ <hlm:sbsoptions id="armv5Clean">
+ <argset refid="armv5CommonSBS"/>
+ <argset refid="cleanCommon" />
+ </hlm:sbsoptions>
+
+
+ <!-- Mainbuild common sbs options -->
+ <hlm:sbsoptions id="toolsClean">
+ <argset refid="toolsCommonSBS"/>
+ <argset refid="cleanCommon" />
+ </hlm:sbsoptions>
+
+ <!-- Mainbuild common sbs options -->
+ <hlm:sbsoptions id="winscwClean">
+ <argset refid="winscwSBSOptions"/>
+ <argset refid="cleanCommon" />
+ </hlm:sbsoptions>
+
+ <!-- sbs input consists of sbs options and sbs make options, the sbs options remains same for all
+ the build system, the make options varies
+ -->
+ <hlm:sbsinput id="tools-sbs">
+ <sbsoptions refid="toolsCommonSBS" />
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="tools-sbs-clean">
+ <sbsoptions refid="toolsClean" />
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="tools-sbs-ec">
+ <sbsoptions refid="toolsCommonSBS" />
+ <sbsmakeoptions refid="toolsmake-sbs-ec" ppThreads="20"/>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="tools-sbs-ec-clean">
+ <sbsoptions refid="toolsClean" />
+ <sbsmakeoptions refid="toolsmake-sbs-ec" ppThreads="20"/>
+ </hlm:sbsinput>
+
+ <!-- sbs input for main build.
+ -->
+ <hlm:sbsinput id="armv5-sbs">
+ <sbsoptions refid="armv5CommonSBS" />
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="armv5-sbs-clean">
+ <sbsoptions refid="armv5Clean" />
+ </hlm:sbsinput>
+
+ <!-- sbs input for main build.
+ -->
+ <hlm:sbsinput id="armv5-sbs-ec">
+ <sbsoptions refid="armv5CommonSBS" />
+ <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20"/>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="armv5-sbs-ec-clean">
+ <sbsoptions refid="armv5Clean" />
+ <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20" />
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="winscw-sbs">
+ <sbsoptions refid="winscwSBSOptions" />
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="winscw-sbs-clean">
+ <sbsoptions refid="winscwClean" />
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="winscw-sbs-ec-clean">
+ <sbsoptions refid="winscwClean" />
+ <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20"/>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="test-sbs">
+ <sbsoptions refid="testCommonSBS" />
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="test-sbs-clean">
+ <sbsoptions refid="testCleanSBS" />
+ </hlm:sbsinput>
+
+ <!-- sbs input for main build.
+ -->
+ <hlm:sbsinput id="test-sbs-ec">
+ <sbsoptions refid="testCommonSBS" />
+ <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20"/>
+ </hlm:sbsinput>
+
+ <hlm:sbsinput id="test-sbs-ec-clean">
+ <sbsoptions refid="testCleanSBS" />
+ <sbsmakeoptions refid="mainbuildmake-sbs-ec" ppThreads="20" />
+ </hlm:sbsinput>
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/tests/minibuilds/imaker/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/imaker/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -166,18 +166,16 @@
<target name="minibuild-check">
</target>
-
+
<!-- Rom configuration -->
<hlm:imakerconfigurationset id="imaker.rom.config">
<imakerconfiguration>
- <makefileset>
- <include name="**/${product.name}/*ui.mk"/>
- </makefileset>
+ <hlm:product list="${product.list}" ui="true"/>
<targetset>
<include name="^core$"/>
<include name="^langpack_01.*$"/>
- <include name="^langpack_02.*$"/><!---->
- <include name="^custvariant_.*$"/>
+ <include name="^langpack_02.*$"/>
+ <include name="^custvariant_01_test$"/>
</targetset>
<variableset>
<variable name="USE_FOTI" value="0"/>
--- a/buildframework/helium/tests/minibuilds/linux-build/ido/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/linux-build/ido/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -201,7 +201,9 @@
<target name="update-policy-src-reference" depends="ido-create-ado-mapping">
- <hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="reference.policy.path.list"/>
+ <property name="policy.src.mapping.file" location="${build.output.dir}/build/ado_mapping_policy_src.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${policy.src.mapping.file}" />
+ <hlm:iniKeys2Path ini="${policy.src.mapping.file}" pathid="reference.policy.path.list"/>
</target>
<hlm:signalInput id="compileSignalInput" failbuild="never">
--- a/buildframework/helium/tests/minibuilds/qt/build.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tests/minibuilds/qt/build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -39,11 +39,13 @@
<property name="minor.version" value="0" />
<property name="publish.root.dir" location="${build.drive}/release" />
- <!-- For Grace upload-->
+ <!-- For upload-->
<property name="hydra.service" value="Helium" />
<property name="hydra.product" value="minibuild_qt" />
<property name="release.label" value="${major.version}.${minor.version}" />
-
+
+ <property name="sysdef3.enabled" value="false" />
+
<!-- build configuration -->
<property name="sysdef.configurations.list" value="build_tools,build" />
<path id="system.definition.files">
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/blocks/blocks.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : blocks.ant.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<!--* @package preparation -->
+<project name="blocks" xmlns:hlm="http://www.nokia.com/helium">
+ <description>
+ Blocks integration.
+ </description>
+
+ <!-- The directory where the blocks configuration will be generated.
+ @type string
+ -->
+ <property name="blocks.config.dir" location="${build.output.dir}/blocks/config" />
+ <!-- The directory where the bundles will be generated.
+ @type string
+ -->
+ <property name="blocks.bundle.dir" location="${build.output.dir}/blocks/bundles" />
+ <!-- The directory where the blocks metadata will be generated.
+ @type string
+ -->
+ <property name="blocks.metadata.dir" location="${build.output.dir}/blocks/metadata" />
+ <!-- Name of the writer to use while creating bundles.
+ @type string
+ -->
+ <property name="blocks.writer" value="deb" />
+ <!-- Number of workers to use while creating the bundles.
+ @type string
+ -->
+ <property name="blocks.workers" value="4" />
+ <!-- Location of the blocks log.
+ @type string
+ -->
+ <property name="blocks.log.dir" location="${build.output.dir}/blocks/logs" />
+ <!-- File extension of the blocks log.
+ @type string
+ -->
+ <property name="blocks.log.extension" value="blocks.log" />
+ <!-- Boolean attribute for the packager application to support generation of packages with inter-dependency.
+ @type boolean
+ @scope public
+ @deprecated Since 11.0
+ -->
+ <property name="blocks.interdeps.generation" value="false" />
+
+ <!-- Boolean attribute for the packager application to support generation of packages with inter-dependency.
+ @type boolean
+ @scope public
+ -->
+ <property name="blocks.interdeps.generation.enabled" value="false" />
+
+ <!--* @property internal.blocks.interdeps.generation.enabled
+ Internal property set if blocks.interdeps.generation.enabled set to true.
+ @type boolean
+ @scope private
+ @since 11.0
+ -->
+
+ <!--* @property blocks.enabled
+ Set to true to enable blocks.
+ @type boolean
+ @editable required
+ @scope public
+ @since 11.0
+ -->
+
+ <!--* @property internal.blocks.enabled
+ Internal property to run the targets if blocks.enabled property is set to true.
+ @type boolean
+ @scope private
+ -->
+
+ <!-- Check, is blocks enabled -->
+ <condition property="internal.blocks.enabled">
+ <istrue value="${blocks.enabled}"/>
+ </condition>
+
+ <hlm:metadatafilterset id="filterset.blocks.archiving">
+ <metadatafilter priority="error" regex="^ERROR:.*" description="" />
+ <metadatafilter priority="warning" regex="^WARNING:.*" description="" />
+ </hlm:metadatafilterset>
+
+ <!--
+ This target will run the packager application using all configurations
+ generated during the build under blocks.config.dir.
+ -->
+ <target name="blocks-create-bundles" if="internal.blocks.enabled">
+ <mkdir dir="${blocks.config.dir}" />
+ <mkdir dir="${blocks.bundle.dir}" />
+ <mkdir dir="${blocks.metadata.dir}" />
+ <mkdir dir="${blocks.log.dir}" />
+
+ <condition property="arg.blocks.target.rules" value="--targetRules=${blocks.target.rules}" else="">
+ <isset property="blocks.target.rules" />
+ </condition>
+
+ <condition property="arg.blocks.source.rules" value="--sourceRules=${blocks.source.rules}" else="">
+ <isset property="blocks.source.rules" />
+ </condition>
+
+ <condition property="arg.blocks.package.directives" value="--pkgDirectives=${blocks.package.directives}" else="">
+ <isset property="blocks.package.directives" />
+ </condition>
+
+ <condition property="internal.blocks.interdeps.generation.enabled" value="true" else="false">
+ <or>
+ <istrue value="${blocks.interdeps.generation.enabled}"/>
+ <istrue value="${blocks.interdeps.generation}"/>
+ </or>
+ </condition>
+
+ <exec executable="python" failonerror="false" output="${blocks.log.dir}/${build.id}_blocks_archiving.${blocks.log.extension}">
+ <arg value="-m"/>
+ <arg value="packager.cli"/>
+ <arg value="--epocroot=${build.drive}/" />
+ <arg value="--config=${blocks.config.dir}" />
+ <arg value="--outputdir=${blocks.bundle.dir}" />
+ <arg value="--metadatadir=${blocks.metadata.dir}" />
+ <arg value="--workers=${blocks.workers}" />
+ <arg value="--writer=${blocks.writer}" />
+ <arg line="${arg.blocks.target.rules}" />
+ <arg line="${arg.blocks.source.rules}" />
+ <arg line="${arg.blocks.package.directives}" />
+ <arg value="--createBundle" />
+ <arg value="--debug" />
+ <arg value="--interdeps=${internal.blocks.interdeps.generation.enabled}" />
+ </exec>
+ <hlm:metadatarecord database="${metadata.dbfile}">
+ <hlm:textmetadatainput>
+ <fileset casesensitive="false" file= "${blocks.log.dir}/${build.id}_blocks_archiving.${blocks.log.extension}"/>
+ <metadatafilterset refid="filterset.blocks.archiving" />
+ </hlm:textmetadatainput>
+ </hlm:metadatarecord>
+ <hlm:blocksCreateRepositoryIndex dest="${blocks.bundle.dir}" verbose="true" failonerror="false" />
+ </target>
+
+ <!--* @property blocks.workspace.id
+ The blocks.workspace.id gets defined by the blocks-create-workspace target while reusing or
+ creating a new workspace.
+ @scope public
+ @since 12.0.0
+ -->
+
+ <!--
+ The blocks-create-workspace will try to reuse existing workspace mapped on "${build.drive}/", or
+ create a new one if none exists.
+
+ If a new workspace is created then repositories from blocks.repositories.id blocksRespositorySet
+ will be added to the newly created workspace.
+
+ @scope public
+ @since 12.0.0
+ -->
+ <target name="blocks-create-workspace" if="internal.blocks.enabled">
+ <if>
+ <hlm:blocksWorkspaceExists dir="${build.drive}/" verbose="true" />
+ <then>
+ <echo>Reusing current workspace.</echo>
+ <hlm:blocksGetWorkspaceId wsidoutput="blocks.workspace.id" dir="${build.drive}/" verbose="true" />
+ </then>
+ <else>
+ <echo>Creating new workspace under ${build.drive}${file.separator}.</echo>
+ <hlm:blocksAddWorkspace name="${build.family}" dir="${build.drive}/" wsidproperty="blocks.workspace.id" verbose="true" />
+ <if>
+ <and>
+ <not>
+ <hlm:blocksRepositoryExists wsid="${blocks.workspace.id}" verbose="true"/>
+ </not>
+ <isreference refid="blocks.repositories.id" />
+ </and>
+ <then>
+ <echo>Creating new repsoitory for workspace ID ${blocks.workspace.id}.</echo>
+ <hlm:blocksAddRepository wsid="${blocks.workspace.id}">
+ <repositorySet refid="blocks.repositories.id" />
+ </hlm:blocksAddRepository>
+ </then>
+ <else>
+ <echo level="warning">'blocks.repositories.id' reference doesn't exist/repository already exists.</echo>
+ </else>
+ </if>
+ </else>
+ </if>
+ </target>
+
+ <!--
+ The blocks-install-bundles will install bundles on the workspace under build.drive.
+ @scope public
+ @since 12.0.0
+ -->
+ <target name="blocks-install-bundles" if="internal.blocks.enabled" depends="blocks-create-workspace">
+ <if>
+ <isreference refid="blocks.bundle.filters.id" />
+ <then>
+ <hlm:blocksInstallBundle wsid="${blocks.workspace.id}" verbose="true">
+ <hlm:bundleFilterSet refid="blocks.bundle.filters.id" />
+ </hlm:blocksInstallBundle>
+ </then>
+ <else>
+ <echo level="warning">Nothing to do, blocks.bundle.filters.id reference doesn't exist.</echo>
+ </else>
+ </if>
+ <if>
+ <isreference refid="blocks.group.filters.id" />
+ <then>
+ <hlm:blocksInstallBundle wsid="${blocks.workspace.id}" verbose="true">
+ <hlm:groupFilterSet refid="blocks.group.filters.id" />
+ </hlm:blocksInstallBundle>
+ </then>
+ <else>
+ <echo level="warning">Nothing to do, blocks.group.filters.id reference doesn't exist.</echo>
+ </else>
+ </if>
+ </target>
+
+ <!--
+ The blocks-update-bundles will update the workspace under build.drive.
+ @scope public
+ @since 12.0.0
+ -->
+ <target name="blocks-update-bundles" if="internal.blocks.enabled" depends="blocks-create-workspace">
+ <hlm:blocksUpdate wsid="${blocks.workspace.id}" />
+ </target>
+
+ <!--
+ The blocks-add-repo will update the current workspace using repositories defined by the
+ blocks.repositories.id reference.
+
+ @scope public
+ @since 12.0.0
+ -->
+ <target name="blocks-add-repo" if="internal.blocks.enabled" depends="blocks-create-workspace">
+ <if>
+ <and>
+ <not>
+ <hlm:blocksRepositoryExists wsid="${blocks.workspace.id}" verbose="true"/>
+ </not>
+ <isreference refid="blocks.repositories.id" />
+ </and>
+ <then>
+ <hlm:blocksAddRepository wsid="${blocks.workspace.id}">
+ <repositorySet refid="blocks.repositories.id" />
+ </hlm:blocksAddRepository>
+ </then>
+ <else>
+ <echo level="warning">'blocks.repositories.id' reference doesn't exist/repository already exists.</echo>
+ </else>
+ </if>
+ </target>
+</project>
--- a/buildframework/helium/tools/common/common.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/common.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -153,7 +153,7 @@
<isset property="email.from"/>
</not>
<then>
- <hlm:ldap url="${email.ldap.server}" rootdn="${email.ldap.rootdn}" filter="uid=${env.USERNAME}" outputproperty="email.from" key="mail"/>
+ <hlm:ldap url="${email.ldap.server}" rootdn="${email.ldap.rootdn}" filter="uid=${env.USERNAME}" outputproperty="email.from" key="mail" failonerror="false"/>
</then>
</if>
</then>
@@ -328,12 +328,24 @@
<echo message="Helium version: ${helium.version}" />
</target>
-
- <!-- Checks the Ant configuration against a Helium data model. -->
+ <!-- Checks the Ant configuration against a Helium data model.
+ @deprecated Implementation of the feature has changed, and the target is not needed anymore. Instead use antlint target
+ -->
<target name="check">
- <hlm:antconfiglint>
- <WrongTypePropertyCheck/>
- </hlm:antconfiglint>
+ <hlm:antlint>
+ <fileset id="antlint.files" dir="${helium.dir}/tools">
+ <include name="**/*.ant.xml"/>
+ <include name="**/build.xml"/>
+ <include name="**/*.antlib.xml"/>
+ <exclude name="tests/**"/>
+ <exclude name="**/test/test_*.xml"/>
+ <exclude name="external/**"/>
+ <exclude name="**/tests/data/**"/>
+ <exclude name="build/**"/>
+ </fileset>
+ <hlm:checkPropertyTypeAndValueMismatch severity="error" />
+ <hlm:antlintConsoleReporter />
+ </hlm:antlint>
</target>
@@ -352,6 +364,11 @@
<delete dir="${helium.build.dir}/beanshell"/>
<delete file="${helium.build.dir}/test_jython.xml"/>
<mkdir dir="${helium.build.dir}/report/antlint" />
+
+ <pathconvert pathsep="${path.separator}" property="python.tools.path">
+ <fileset dir="${helium.dir}/nokia_builder" includes="tools/pylint/**/*.egg" />
+ <dirset dir="${helium.dir}/nokia_builder" includes="tools/pylint/**/*.egg" />
+ </pathconvert>
<hlm:antlint>
<fileset id="antlint.files" dir="${helium.dir}/tools">
<include name="**/*.ant.xml"/>
@@ -375,32 +392,34 @@
<hlm:checkAntCall severity="warning" />
<hlm:checkScriptSize severity="warning" />
<hlm:checkUseOfIfInTargets severity="warning" />
- <hlm:checkJythonScript severity="error" outputDir="${helium.build.dir}/jep"/>
- <hlm:checkScriptCondition severity="warning" outputDir="${helium.build.dir}/scriptcondition"/>
- <hlm:checkPythonTasks severity="warning" outputDir="${helium.build.dir}/python"/>
+ <hlm:checkJythonScript severity="error"/>
+ <hlm:checkScriptCondition severity="warning" />
<hlm:checkUseOfEqualsTask severity="warning" />
- <hlm:checkScriptDefNameAttributes severity="error" />
+ <hlm:checkScriptDefAttributes severity="error" />
<hlm:checkScriptDefStyle severity="warning" />
- <hlm:checkScriptDef severity="error" outputDir="${helium.build.dir}/beanshell"/>
+ <hlm:checkScriptDefName severity="warning" regexp="([a-z0-9][a-zA-Z0-9]*)"/>
<hlm:checkDuplicateNames severity="warning" />
<hlm:checkTryCatchBlock severity="warning" />
+ <hlm:checkPropertyTypeAndValueMismatch severity="error" />
+ <hlm:checkVariableTask severity="error" />
+ <!-- external command executors -->
+ <hlm:checkstyleExecutor outputDir="${helium.build.dir}/beanshell" config="builder/java/config/java_checkstyle_config.xml">
+ <formatter type="plain"/>
+ </hlm:checkstyleExecutor>
+ <hlm:pylintExecutor outputDir="${helium.build.dir}/python">
+ <env key="PYTHONPATH" value="${python.tools.path}"/>
+ <arg file="${helium.dir}/nokia_builder/tools/pylint/bin/pylint-script.py"/>
+ <arg value="--output-format=parseable"/>
+ <arg line="--rcfile=${helium.dir}/nokia_builder/config/pylintrc.txt"/>
+ </hlm:pylintExecutor>
+
<!-- Reporters -->
<hlm:antlintCheckstyleReporter file="${helium.build.dir}/report/antlint/antlint_report.xml" />
<hlm:antlintConsoleReporter />
+
</hlm:antlint>
- <fileset id="jep.files" dir="${helium.build.dir}">
- <include name="jep/**/*.py"/>
- <include name="python/**/*.py"/>
- </fileset>
- <!--<antcall target="pylint" inheritRefs="true">
- <reference refid="jep.files" torefid="python.files" />
- </antcall>-->
- <cs:checkstyle config="builder/java/config/java_checkstyle_config.xml">
- <fileset dir="${helium.build.dir}/beanshell" includes="**/*.java"/>
- <formatter type="plain"/>
- </cs:checkstyle>
-
+
<for param="file">
<path>
<fileset dir="${helium.dir}">
@@ -422,7 +441,7 @@
</sequential>
</for>
</target>
-
+
<!-- This target can be use to clean up after a build finished or failed.
--- a/buildframework/helium/tools/common/common.antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/common.antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -325,13 +325,13 @@
collectTargetDependencies(target, 1)
targetList.append((target, 0))
-format = str(attributes.get('format'))
+formatstr = str(attributes.get('format'))
-if format == 'nested':
+if formatstr == 'nested':
for target, indent in targetList:
indentString = ''.join([' ' for x in range(indent)])
print indentString + str(target)
-elif format == 'executable':
+elif formatstr == 'executable':
print "Top level targets:\n"
print ''.join([str(target) + ' ' for target, indent in targetList[:-1] if indent == 1])
print "\n\nAll targets in sequence:\n"
@@ -378,18 +378,17 @@
import netrc
import os
result = "0"
-try:
- netrc_file = netrc.netrc()
- self.log("Type: %s" % str(attributes.get("type")))
- netrc_info = netrc_file.authenticators(str(attributes.get("type")))
- if netrc_info == None:
- raise Exception("No entry found for Type: %s" % str(attributes.get("type")))
+
+netrc_file = netrc.netrc()
+self.log("Type: %s" % str(attributes.get("type")))
+netrc_info = netrc_file.authenticators(str(attributes.get("type")))
+if netrc_info == None:
+ print "No entry found for Type: %s" % str(attributes.get("type"))
+ result = '-1'
+else:
(n_username, n_account, n_password) = netrc_info
if attributes.get('output-prop') != None:
project.setProperty(str(attributes.get('output-prop')), str(n_password))
-except Exception, e:
- result = "-1"
- print "Warning: %s" % e
if attributes.get('result-prop') != None:
project.setProperty(str(attributes.get('result-prop')), str(result))
]]>
@@ -405,18 +404,17 @@
import netrc
import os
result = "0"
-try:
- netrc_file = netrc.netrc()
- self.log("Type: %s" % str(attributes.get("type")))
- netrc_info = netrc_file.authenticators(str(attributes.get("type")))
- if netrc_info == None:
- raise Exception("No entry found for Type: %s" % str(attributes.get("type")))
+
+netrc_file = netrc.netrc()
+self.log("Type: %s" % str(attributes.get("type")))
+netrc_info = netrc_file.authenticators(str(attributes.get("type")))
+if netrc_info == None:
+ print "No entry found for Type: %s" % str(attributes.get("type"))
+ result = '-1'
+else:
(n_username, n_account, n_password) = netrc_info
if attributes.get('output-prop') != None:
project.setProperty(str(attributes.get('output-prop')), str(n_username))
-except Exception, e:
- result = "-1"
- print "Warning: %s" % e
if attributes.get('result-prop') != None:
project.setProperty(str(attributes.get('result-prop')), str(result))
]]>
@@ -438,37 +436,22 @@
cache = None
if project.getProperty("ccm.cache.xml")is not None:
cache = str(project.getProperty("ccm.cache.xml"))
-try:
- database = project.getProperty('ccm.database')
-
- if project.getProperty('ccm.user.login') == None :
- raise Exception("'ccm.user.login' property is not defined")
-
- username = project.getProperty('ccm.user.login')
-
- if project.getProperty('ccm.user.password') == None :
- raise Exception("'ccm.user.password' property is not defined")
-
- password = project.getProperty('ccm.user.password')
-
-
- engine = project.getProperty('ccm.engine.host')
- dbpath = project.getProperty('ccm.database.path')
- provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
- if database != None:
- session = provider.get(username, password, database=database, reuse=False)
- else:
- session = provider.get(username, password, engine, dbpath, reuse=False)
- session.close()
- provider.close()
-except Exception, e:
- print "ERROR: %s" % e
- if str(e).find("access denied") != -1:
- result = "-2"
- else:
- result = "-1"
-self.log("Result: %s" % attributes.get('resultproperty'))
-project.setProperty(str(attributes.get('resultproperty')), str(result))
+database = project.getProperty('ccm.database')
+if project.getProperty('ccm.user.login') == None :
+ raise Exception("'ccm.user.login' property is not defined")
+username = project.getProperty('ccm.user.login')
+if project.getProperty('ccm.user.password') == None :
+ raise Exception("'ccm.user.password' property is not defined")
+password = project.getProperty('ccm.user.password')
+engine = project.getProperty('ccm.engine.host')
+dbpath = project.getProperty('ccm.database.path')
+provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
+if database != None:
+ session = provider.get(username, password, database=database, reuse=False)
+else:
+ session = provider.get(username, password, engine, dbpath, reuse=False)
+session.close()
+provider.close()
]]>
</scriptdef>
@@ -504,13 +487,13 @@
<!-- signal for errors -->
<var name="internal.signal.macro.log.basename" value="" unset="true"/>
<basename property="internal.signal.macro.log.basename" file="@{logfile}" />
- <hlm:signal name="@{signal.input}" result="${signal.errors.total}"
- message="Found ${signal.errors.total} errors under @{logfile}.">
+ <hlm:signal result="${signal.errors.total}" message="Found ${signal.errors.total} errors under @{logfile}.">
<signalNotifierInput>
<signalInput refid="@{signal.input}" />
<notifierInput>
- <fileset casesensitive="false" dir="${build.signal.status.dir}"
- includes="${internal.signal.macro.log.basename}.status.html" />
+ <fileset casesensitive="false" dir="${build.log.dir}">
+ <include name="**/${internal.signal.macro.log.basename}*" />
+ </fileset>
</notifierInput>
</signalNotifierInput>
</hlm:signal>
@@ -536,7 +519,7 @@
<attribute name="failonerror"/>
<![CDATA[
import logging
-
+import junit.framework
import java.io
import org.custommonkey.xmlunit
@@ -562,7 +545,7 @@
test_reader = java.io.InputStreamReader(test_resource.getInputStream())
org.custommonkey.xmlunit.XMLAssert.assertXMLEqual(control_reader, test_reader)
print 'XML is similar'
-except Exception, e:
+except junit.framework.AssertionFailedError, e:
print 'XML is NOT similar!'
failonerror = str(attributes.get('failonerror'))
if failonerror == 'true' or failonerror == 'None':
@@ -575,7 +558,7 @@
<scriptdef name="unsubst" language="jython" uri="http://www.nokia.com/helium">
<attribute name="drive"/>
<attribute name="failonerror"/>
-""" internal.codescanner.drive """
+#internal.codescanner.drive
import os
if os.sep == '\\':
import fileutils
@@ -596,7 +579,7 @@
try:
self.log(str("Unsubsting %s..." % drive))
fileutils.unsubst(drive)
- except Exception, e:
+ except OSError, e:
if failonerror:
raise e
else:
@@ -609,8 +592,8 @@
<element name="path" type="path"/>
<![CDATA[
import fileutils
-for id in range(elements.get("path").size()):
- iterator = elements.get("path").get(int(id)).iterator()
+for aid in range(elements.get("path").size()):
+ iterator = elements.get("path").get(int(aid)).iterator()
while iterator.hasNext():
path = str(iterator.next())
fileutils.touch(path)
@@ -729,6 +712,7 @@
<include name="config/signaling_config_default.ant.xml"/>
<include name="config/stages_config_default.ant.xml"/>
<include name="config/metadata_filter_config_default.ant.xml"/>
+ <include name="tools/common/default_config.ant.xml"/>
<include name="tools/**/*.antlib.xml"/>
</fileset>
</hlm:database>
--- a/buildframework/helium/tools/common/default_config.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/default_config.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -36,7 +36,7 @@
@scope private
-->
<property name="logging.output.file" location="${cache.dir}/logging.${env.PID}.conf" />
- <fmpp sourceFile="${helium.dir}/config/logging.conf.ftl" outputFile="${logging.output.file}" quiet="true">
+ <fmpp sourceFile="${helium.dir}/tools/logging/templates/logging.conf.ftl" outputFile="${logging.output.file}" quiet="true">
<data expandProperties="yes">
ant: antProperties()
</data>
@@ -71,24 +71,26 @@
</and>
<then>
<!-- used to track if build.drive has predefined or not
- @type flag
+ @type boolean
@scope private
-->
- <property name="build.drive.notdefined" value="true"/>
- <exec osfamily="windows" executable="python" failonerror="true" outputproperty="build.drive">
- <arg line="-m searchnextdrive"/>
- </exec>
- <if>
- <equals arg1="${build.drive}" arg2="Error: No free drive!"/>
- <then>
- <fail message="ERROR: Failed to assign build drive, please check you are not running out of drives." />
- </then>
- </if>
- <mkdir dir="${env.TEMP}/helium/temp_drive"/>
- <exec osfamily="windows" executable="subst" failonerror="false">
- <arg value="${build.drive}" />
- <arg value="${env.TEMP}/helium/temp_drive" />
- </exec>
+ <property name="build.drive.notdefined" value="true"/>
+ <hlm:resourceaccess lockName="subst-drive">
+ <exec osfamily="windows" executable="python" failonerror="true" outputproperty="build.drive">
+ <arg line="-m searchnextdrive"/>
+ </exec>
+ <if>
+ <equals arg1="${build.drive}" arg2="Error: No free drive!"/>
+ <then>
+ <fail message="ERROR: Failed to assign build drive, please check you are not running out of drives." />
+ </then>
+ </if>
+ <mkdir dir="${env.TEMP}/helium/temp_drive"/>
+ <exec osfamily="windows" executable="subst" failonerror="false">
+ <arg value="${build.drive}" />
+ <arg value="${env.TEMP}/helium/temp_drive" />
+ </exec>
+ </hlm:resourceaccess>
<script language="jython" setbeans="false">
<![CDATA[
import os
@@ -356,7 +358,7 @@
-->
<property name="failonerror" value="false"/>
<!-- Maximum allowable errors in a build.
- @type number
+ @type integer
-->
<property name="build.errors.limit" value="0"/>
<!-- Unsubsted drive after build finished. If not defined then helium should left the drive as subst. Set the value as "yes" if you want to unsubst after build finished.
--- a/buildframework/helium/tools/common/docs.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/docs.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -91,6 +91,7 @@
@scope private
-->
<target name="docs-database">
+ <mkdir dir="${basedir}/build"/>
<hlm:database output="${public.database.file}" scope="public" filesetonly="true">
<fileset dir=".">
<include name="**/*.ant.xml"/>
@@ -117,10 +118,10 @@
<fileset dir="${doc.temp.dir}/api/helium" includes="*.dot"/>
<sequential>
<echo>Processing dot file: @{dot.file}</echo>
- <exec executable="dot" dir="${doc.temp.dir}/api/helium">
+ <exec executable="dot" dir="${doc.temp.dir}/api/helium" failonerror="true">
<arg line="-Tcmap @{dot.file} -O"/>
</exec>
- <exec executable="dot" dir="${doc.build.dir}/api">
+ <exec executable="dot" dir="${doc.build.dir}/api" failonerror="true">
<arg line="-Tpng @{dot.file} -O"/>
</exec>
</sequential>
@@ -168,8 +169,11 @@
<!-- Generate API documentation from the source code. -->
- <target name="apidocs" depends="helium-apidocs"/>
-
+ <target name="apidocs" depends="helium-apidocs" unless="env.HLM_SUBCON">
+ <exec executable="cmd" osfamily="windows" dir="${helium.dir}/nokia_builder" failonerror="true">
+ <arg line="/C bld doc" />
+ </exec>
+ </target>
<!-- Macro to generate HTML docs from rst. -->
<macrodef name="rstPrepMacro" uri="http://www.nokia.com/helium">
@@ -232,6 +236,11 @@
<patch reverse="true" patchfile="${nokia.python.tools}/sphinxfixsearch.diff" originalfile="${sphinx.lib.dir}/search.py"/>
</then>
</if>
+ <copy todir="@{output}" overwrite="true">
+ <fileset dir="@{src}">
+ <include name="**/*.zip"/>
+ </fileset>
+ </copy>
</sequential>
</macrodef>
@@ -261,7 +270,7 @@
try:
rstfile = codecs.open(rstfilename, 'r', 'utf8')
rstfile.read()
- except:
+ except UnicodeError:
print rstfilename + ' has invalid unicode'
rstfile.close()
os.remove(rstfilename)
@@ -313,7 +322,6 @@
<!-- default doc content is always processed first -->
<path>
<pathelement path="${helium.dir}/doc/default"/>
- <pathelement path="${helium.dir}/doc/src/manual"/>
</path>
<resources refid="textdoc.paths"/>
</resources>
@@ -331,7 +339,7 @@
</fileset>
<sequential>
<echo>Building dot file: @{dot.file}</echo>
- <exec executable="dot">
+ <exec executable="dot" failonerror="true">
<arg line="-Tpng @{dot.file} -O"/>
</exec>
</sequential>
@@ -375,6 +383,40 @@
<!-- generate all the user documentation for helium -->
- <target name="docs" depends="clean-docs,apidocs,textdocs"/>
+ <target name="docs" depends="clean-docs,apidocs,textdocs,docs-check-links"/>
+ <!-- Check links in docs -->
+ <target name="docs-check-links">
+ <hlm:python failonerror="true">
+<![CDATA[
+import os
+error = ''
+for root, dirs, files in os.walk(r'${doc.build.dir}', topdown=False):
+ for fname in files:
+ if '.htm' in fname:
+ filename = os.path.abspath(os.path.join(root, fname))
+ f = open(filename)
+ for line in f:
+ if ' src="' in line:
+ line1 = line.split('src="')[1]
+ line1 = line1.split('"')[0]
+ os.chdir(root)
+ if line1 and not os.path.exists(line1) and not ':' in line1 and not '$' in line1:
+ error = error + filename + ' has a broken link ' + line1 + '\n'
+ if ' href="' in line:
+ line = line.split('href="')[1]
+ line = line.split('"')[0]
+ if '#' in line:
+ line = line.split('#')[0]
+ if '?' in line:
+ line = line.split('?')[0]
+ os.chdir(root)
+ if line and not os.path.exists(line) and not ':' in line and not '&' in line:
+ error = error + filename + ' has a broken link ' + line + '\n'
+ f.close()
+if error != '':
+ raise Exception(error)
+]]>
+ </hlm:python>
+ </target>
</project>
--- a/buildframework/helium/tools/common/helium_docs.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/helium_docs.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -51,7 +51,7 @@
<target name="helium-prep-textdocs">
<mkdir dir="${doc.temp.dir}/minibuilds"/>
- <copy todir="${doc.temp.dir}/development/minibuilds" failonerror="false">
+ <copy todir="${doc.temp.dir}/development/minibuilds">
<fileset dir="${helium.dir}/tests/minibuilds/">
<include name="*/doc/**/*"/>
</fileset>
@@ -69,6 +69,13 @@
<include name="**/*.png"/>
</fileset>
</copy>
+ <hlm:rstPrepMacro destdir="${doc.temp.dir}/helium-antlib">
+ <resources>
+ <path>
+ <pathelement path="@{dir}"/>
+ </path>
+ </resources>
+ </hlm:rstPrepMacro>
</sequential>
</for>
<for param="dir">
@@ -105,7 +112,7 @@
@scope private
-->
<property name="last.major.release.database.url" value="${documentation.url.root}/${last.major.helium.version}/database.xml"/>
- <hlm:python>
+ <hlm:python failonerror="true">
import urllib
import helium.documentation
@@ -385,7 +392,7 @@
<antcall target="dependency-grouping"/>
- <exec executable="dot">
+ <exec executable="dot" failonerror="true">
<arg line="-Tpng -Grankdir=LR -Nshape=box -Nfontsize=9 -Nwidth=0.3 -Nheight=0.2 ${dependency.grph} -O"/>
</exec>
@@ -413,7 +420,7 @@
@scope private
-->
<property name="ivy.xml.file" value="${helium.dir}/config/ivy/ivy.xml"/>
- <hlm:python>
+ <hlm:python failonerror="true">
import os
import dependancygraph
@@ -485,7 +492,7 @@
dependancygraph.findLogFiles(r'${database.file}.parsed', r'${dependency.external.grph}')
</hlm:python>
<!---->
- <exec executable="dot">
+ <exec executable="dot" failonerror="true">
<arg line="-Tpng -Grankdir=LR -Nshape=box -Nfontsize=9 -Nwidth=0.3 -Nheight=0.2 ${dependency.external.grph} -O"/>
</exec>
</target>
@@ -503,10 +510,10 @@
<fileset dir="${doc.temp.dir}" includes="user_graph.dot"/>
<sequential>
<echo>Processing dot file: @{dot.file}</echo>
- <exec executable="dot" dir="${doc.temp.dir}/">
+ <exec executable="dot" dir="${doc.temp.dir}/" failonerror="true">
<arg line="-Tcmap @{dot.file} -O"/>
</exec>
- <exec executable="dot" dir="${doc.build.dir}/api">
+ <exec executable="dot" dir="${doc.build.dir}/api" failonerror="true">
<arg line="-Tpng @{dot.file} -O"/>
</exec>
</sequential>
--- a/buildframework/helium/tools/common/libs.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/libs.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -60,6 +60,7 @@
<taskdef resource="com/nokia/helium/ccmtask/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/sysdef/ant/antlib.xml" uri="http://www.nokia.com/helium" />
<taskdef resource="com/nokia/helium/internaldata/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
+ <taskdef resource="com/nokia/helium/diamonds/ant/antlib.xml" uri="http://www.nokia.com/helium"/>
<!-- Nokia internal types. -->
<typedef resource="com/nokia/helium/ant/coverage/antlib.xml" uri="http://www.nokia.com/helium"/>
--- a/buildframework/helium/tools/common/templates/codescanner/codescanner.ant.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-<#--
-============================================================================
-Name : codescanner.ant.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0"?>
-<project name="codescanner_fmpp" default="all">
-<#assign dollar="$"/>
- <target name="all">
-<#assign scanid=1/>
-<#assign config=""/>
- <#list data['inputs'] as input>
- <exec executable="${data['executable']}">
- <arg line="-c ${data['config']}"/>
- <arg line="-o${data['output_fmt']}"/>
- <arg line="${input}"/>
- <arg line="${data['output_dir']}\${data['outputs'][scanid - 1]}"/>
- </exec>
- <#assign scanid=scanid+1/>
- </#list>
- </target>
-</project>
\ No newline at end of file
--- a/buildframework/helium/tools/common/templates/codescanner/codescanner.mk.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-<#--
-============================================================================
-Name : codescanner.mk.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-###################################################################
-# Template for CodeScanner.
-###################################################################
-<#assign all_target="codescanner: "/>
-<#assign scanid=1/>
-<#list data['inputs'] as input>
-codescan${scanid}:
- ${data['executable']} -c ${data['config']} -o${data['output_fmt']} ${input} ${data['output_dir']}\${data['outputs'][scanid - 1]}
-
-<#assign all_target ="${all_target}\\\n\tcodescan${scanid} "/>
-<#assign scanid=scanid + 1/>
-</#list>
-
-
-${all_target}
--- a/buildframework/helium/tools/common/templates/coverity/coverity.summary.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,79 +0,0 @@
-<#--
-============================================================================
-Name : coverity.summary.html.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
- <head>
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
- <title>
- Coverity tool summary information.
- </title>
- <style type="text/css">
- body{font-family:Verdana; font-size:8pt; line-height:1.1em; padding: 10px 10px; background-color:#F8F8F2;}
- h1{
- font-size:14pt;
- color:#000;
- padding: 20px 15px;
- margin:0;
- }
- h2 {
- font-size:10pt;
- margin: 1em 0;
- }
- h5{
- font-size:10pt;
- text-align:center;
- background-color:#4682B4;
- color:"black";
- heigth:20pt;
- padding: 5px 15px;
-
- }
- .data{color:#00F;font-family:Verdana; font-size:10pt;color:"black";}
- span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
-
- span.bold{font-weight:bold; display:block; padding: 1em 0;}
- p.maintext{padding-top: 1em;}
- p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
- p.distrib{font-weight:bold;}
-
-
- a:link,a:visited{color:#00E;}
-
- </style>
- </head>
- <body>
- <div id="coveritysummary">
- <h5>Coverity Summary</h5>
- <#assign htmlString = covsummary?replace("["," ")>
- <#assign htmlString = htmlString?replace("]"," ")>
- <#list htmlString?split(",") as line>
- <#if line?starts_with(" ")>
- ${line}<br />
- <#elseif !line?contains("cov-analyze")>
- ${line}<br />
- </#if>
- </#list>
- </div>
- </br>
- </body>
-</html>
--- a/buildframework/helium/tools/common/templates/coverity/coverity.summary.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-<#--
-============================================================================
-Name : coverity.summary.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0" encoding="utf-8"?>
-<coverity>
- <#assign htmlString = covsummary?replace("["," ")>
- <#assign htmlString = htmlString?replace("]"," ")>
- <#list htmlString?split(",") as line>
- <#if !line?contains("cov-analyze") && !line?starts_with("---") && !line?contains("summary") && !line?contains("defects") >
- <#assign words = line?split(":")>
- <#if words[1]??>
- <#assign firstword=words[0]?trim secondword=words[1]?trim>
-<summary message="${firstword}" value="${secondword}"/>
- </#if>
- </#if>
- </#list>
-</coverity>
-
--- a/buildframework/helium/tools/common/templates/db2xml.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<#--
-============================================================================
-Name : bmd.macros.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader', "${dbPath}") >
-<?xml version="1.0" encoding="utf-8"?>
-<log filename="${log}">
-<build>
-
-<#list table_info['select * from metadata INNER JOIN logfiles ON logfiles.id=metadata.logfile_id INNER JOIN severity ON severity.id=metadata.severity_id where severity=\'ERROR\' and path like \'${r\'%\'}${log}\''] as recordentry >
-<message severity="error"><![CDATA[${recordentry['data']}]]></message>
-</#list>
-
-</build>
-</log>
\ No newline at end of file
--- a/buildframework/helium/tools/common/templates/diamonds/apimetrics.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/apimetrics.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -29,10 +29,10 @@
<illegal-apis>
<#list doc.api_dataset.api as illegal>
<#if illegal.release.@category == 'private'>
- <api>${illegal.buildfiles.file.path}</api>
+ <api>${illegal.buildfiles.file.path?xml}</api>
</#if>
<#if illegal.release.@category == 'internal'>
- <api>${illegal.buildfiles.file.path}</api>
+ <api>${illegal.buildfiles.file.path?xml}</api>
</#if>
</#list>
</illegal-apis>
--- a/buildframework/helium/tools/common/templates/diamonds/build_roms_diamonds.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/build_roms_diamonds.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -19,7 +19,6 @@
============================================================================
-->
-
<#include "diamonds_header.ftl">
<#assign db = pp.loadData('com.nokia.helium.metadata.ORMFMPPLoader', "${dbPath}") >
@@ -27,30 +26,27 @@
<images>
<#assign overallStatus = "ok">
- <#list db['native:java.lang.String']['select DISTINCT component.component from component where component.component like \'%.fpsx\''] as component>
+ <#list db['jpa']['select c from Component c where c.component like \'%.fpsx\''] as component>
<image>
<#assign status = "ok">
- <#list db['jpa']['select m from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where p.severity=\'ERROR\' and c.component=\'${component}\''] as m>
- <#assign match = m.text?matches(".*?fpsx' - DOESN'T EXIST")>
- <#if match>
+ <#assign missing = db['jpasingle']['select Count(m.id) from Component c JOIN c.metadataEntries as m JOIN m.severity as p where c.id=\'${component.id}\' and p.severity=\'ERROR\' and m.text like \'%.fpsx\'\' - DOESN\'\'T EXIST\''][0]>
+ <#if (missing > 0)>
<#assign status = "failed">
<#assign overallStatus = "failed">
</#if>
- </#list>
- <status>${status}</status>
-
- <name>${component}</name>
+ <status>${status?xml}</status>
+ <name>${component.component?xml}</name>
<hardware>N/A</hardware>
- <#assign type = component?matches("([^.]+)\\.fpsx")[0]>
- <type>${type?groups[1]}</type>
- <errors count="${db['jpasingle']['select Count(m.id) from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where p.severity=\'ERROR\' and c.component=\'${component}\''][0]}">
- <#list db['jpa']['select m from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where p.severity=\'ERROR\' and c.component=\'${component}\''] as m>
- <error>${m.text}</error>
+ <#assign type = component.component?matches("([^.]+)\\.fpsx")[0]>
+ <type>${type?groups[1]?xml}</type>
+ <errors count="${db['jpasingle']['select Count(m.id) from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where p.severity=\'ERROR\' and c.id=\'${component.id}\''][0]}">
+ <#list db['jpa']['select m from MetadataEntry m JOIN m.severity as p JOIN m.component as c where p.severity=\'ERROR\' and c.id=\'${component.id}\''] as m>
+ <error>${m.text?xml}</error>
</#list>
</errors>
- <warnings count="${db['jpasingle']['select Count(m.id) from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where p.severity=\'WARNING\' and c.component=\'${component}\''][0]}">
- <#list db['jpa']['select m from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where p.severity=\'WARNING\' and c.component=\'${component}\''] as m>
- <warning>${m.text}</warning>
+ <warnings count="${db['jpasingle']['select Count(m.id) from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where p.severity=\'WARNING\' and c.id=\'${component.id}\''][0]}">
+ <#list db['jpa']['select m from MetadataEntry m JOIN m.severity as p JOIN m.component as c where p.severity=\'WARNING\' and c.id=\'${component.id}\''] as m>
+ <warning>${m.text?xml}</warning>
</#list>
</warnings>
</image>
--- a/buildframework/helium/tools/common/templates/diamonds/compile.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/compile.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -28,21 +28,21 @@
<faults>
<#list doc.compile.components.component as component>
<component>
- <name>${component.@name}</name>
- <total severity="error">${component.@error}</total>
- <total severity="warning">${component.@warning}</total>
+ <name>${component.@name?xml}</name>
+ <total severity="error">${component.@error?xml}</total>
+ <total severity="warning">${component.@warning?xml}</total>
</component>
</#list>
<!-- print summary of the errors -->
- <total severity="error">${doc.compile.total.@error}</total>
- <total severity="warning">${doc.compile.total.@warning}</total>
+ <total severity="error">${doc.compile.total.@error?xml}</total>
+ <total severity="warning">${doc.compile.total.@warning?xml}</total>
<total severity="warning_rvct_other">0</total>
<!-- todo update to calculate the correct value -->
- <total severity="warning_rvct_bad">${doc.compile.total.@critical}</total>
+ <total severity="warning_rvct_bad">${doc.compile.total.@critical?xml}</total>
</faults>
<components>
<#list doc.compile.components.component as component>
- <component>${component.@name}</component>
+ <component>${component.@name?xml}</component>
</#list>
</components>
</#if>
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_build.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_build.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : build.xml.ftl
+Name : diamonds_build.xml.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -20,20 +20,20 @@
============================================================================
-->
<build>
- <category>${ant["build.family"]}</category>
- <name>${ant["build.id"]}</name>
+ <category>${ant["build.family"]?xml}</category>
+ <name>${ant["build.id"]?xml}</name>
<#if ant?keys?seq_contains("ecc.project")>
- <project>${ant["ecc.project"]}</project>
- <schedule>${ant["ecc.schedule"]}</schedule>
- <timebox>${ant["ecc.ido.branch"]}</timebox>
- <procedure>${ant["ecc.procedure"]}</procedure>
- <includeinstats>${ant["ecc.include.in.stats"]}</includeinstats>
+ <project>${ant["ecc.project"]?xml}</project>
+ <schedule>${ant["ecc.schedule"]?xml}</schedule>
+ <timebox>${ant["ecc.ido.branch"]?xml}</timebox>
+ <procedure>${ant["ecc.procedure"]?xml}</procedure>
+ <includeinstats>${ant["ecc.include.in.stats"]?xml}</includeinstats>
</#if>
- <#if ant?keys?seq_contains("build.start.time")><started>${ant["build.start.time"]}</started></#if>
+ <#if ant?keys?seq_contains("build.start.time")><started>${ant["build.start.time"]?xml}</started></#if>
<#if ant?keys?seq_contains("build.end.time")><finished></finished></#if>
- <creator>${ant["env.USERNAME"]}</creator>
- <hostname>${ant["env.COMPUTERNAME"]}</hostname>
- <product>${ant["build.name"]}</product>
- <build_system>${ant["build.system"]}</build_system>
- <#if ant?keys?seq_contains("env.NUMBER_OF_PROCESSORS")><processor_count>${ant["env.NUMBER_OF_PROCESSORS"]}</processor_count></#if>
+ <creator>${ant["env.USERNAME"]?xml}</creator>
+ <hostname>${ant["env.COMPUTERNAME"]?xml}</hostname>
+ <product>${ant["build.name"]?xml}</product>
+ <build_system>${ant["build.system"]?xml}</build_system>
+ <#if ant?keys?seq_contains("env.NUMBER_OF_PROCESSORS")><processor_count>${ant["env.NUMBER_OF_PROCESSORS"]?xml}</processor_count></#if>
</build>
\ No newline at end of file
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_faults.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_faults.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : faults.ftl
+Name : diamonds_faults.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_finish.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_finish.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : finish.xml.ftl
+Name : diamonds_finish.xml.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -21,6 +21,6 @@
-->
<#include "diamonds_header.ftl">
<build>
- <#if ant?keys?seq_contains("build.end.time")><finished>${ant["build.end.time"]}</finished></#if>
+ <#if ant?keys?seq_contains("build.end.time")><finished>${ant["build.end.time"]?xml}</finished></#if>
</build>
<#include "diamonds_footer.ftl">
\ No newline at end of file
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_footer.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_footer.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : footer.ftl
+Name : diamonds_footer.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_header.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_header.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : header.ftl
+Name : diamonds_header.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -22,4 +22,4 @@
<#include "diamonds_macro.ftl">
<?xml version="1.0" encoding="UTF-8"?>
<diamonds-build>
- <schema>${schema_version}</schema>
\ No newline at end of file
+ <schema>${schema_version?xml}</schema>
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_locations.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_locations.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : locations.ftl
+Name : diamonds_locations.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -22,7 +22,7 @@
<locations>
<#if ant?keys?seq_contains("release.hydra.dir")>
<location>
- <link>${ant["release.hydra.dir"]}</link>
+ <link>${ant["release.hydra.dir"]?xml}</link>
<description>Hydra server</description>
</location>
</#if>
@@ -30,7 +30,7 @@
<#list ant["publish.dir.list"]?split(",") as path>
<#if !path?contains("${")>
<location>
- <link>${path}</link>
+ <link>${path?xml}</link>
<description>Shared drive</description>
</location>
</#if>
@@ -38,7 +38,7 @@
</#if>
<#if (ant?keys?seq_contains("publish.dir") && !ant["publish.dir"]?contains("${"))>
<location>
- <link>${ant["publish.dir"]}</link>
+ <link>${ant["publish.dir"]?xml}</link>
<description>Shared drive</description>
</location>
</#if>
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_macro.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_macro.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : macro.ftl
+Name : diamonds_macro.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -58,9 +58,9 @@
</#if>
<#if componentname != currentcomponentname>
<component>
- <name>${componentname}</name>
- <total severity="error">${componenterrors}</total>
- <total severity="warning">${componentwarnings}</total>
+ <name>${componentname?xml}</name>
+ <total severity="error">${componenterrors?xml}</total>
+ <total severity="warning">${componentwarnings?xml}</total>
</component>
<#assign componentname=currentcomponentname>
<#assign components= components + ",${componentname}">
@@ -77,20 +77,20 @@
</#list>
<#if componentname!= "">
<component>
- <name>${componentname}</name>
- <total severity="error">${componenterrors}</total>
- <total severity="warning">${componentwarnings}</total>
- <total severity="critical">${componentcriticals}</total>
+ <name>${componentname?xml}</name>
+ <total severity="error">${componenterrors?xml}</total>
+ <total severity="warning">${componentwarnings?xml}</total>
+ <total severity="critical">${componentcriticals?xml}</total>
</component>
</#if>
<!-- print summary of the errors -->
<#assign totalerrors = totalerrors + componenterrors>
<#assign totalwarnings = totalwarnings + componentwarnings>
- <total severity="error">${totalerrors}</total>
- <total severity="warning">${totalwarnings}</total>
- <total severity="warning_rvct_other">${totalwarnings}</total>
+ <total severity="error">${totalerrors?xml}</total>
+ <total severity="warning">${totalwarnings?xml}</total>
+ <total severity="warning_rvct_other">${totalwarnings?xml}</total>
<!-- todo update to calculate the correct value -->
- <total severity="warning_rvct_bad">${totalcriticals}</total>
+ <total severity="warning_rvct_bad">${totalcriticals?xml}</total>
</faults>
<components>
<!-- all components -->
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_signal.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_signal.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -25,6 +25,7 @@
<#if diamondskey?starts_with("diamond.signal.name.")>
<#assign signalIndex = diamondskey?split(".")?last />
<signal>
+ <id>${signalIndex}</id>
<#if ant?keys?seq_contains("diamond.signal.name.${signalIndex}")><name>${ant["diamond.signal.name.${signalIndex}"]?xml}</name></#if>
<#if ant?keys?seq_contains("diamond.error.message.${signalIndex}")><message>${ant["diamond.error.message.${signalIndex}"]?xml}</message></#if>
<#if ant?keys?seq_contains("diamond.time.stamp.${signalIndex}")><timestamp>${ant["diamond.time.stamp.${signalIndex}"]?xml}</timestamp></#if>
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_stage.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_stage.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : stage.xml.ftl
+Name : diamonds_stage.xml.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -22,9 +22,9 @@
<#include "diamonds_header.ftl">
<stages>
<stage>
- <name>${ant["logical.stage"]}</name>
- <#if ant?keys?seq_contains("stage.start.time")><started>${ant["stage.start.time"]}</started></#if>
- <#if ant?keys?seq_contains("stage.end.time")><finished>${ant["stage.end.time"]}</finished></#if>
+ <name>${ant["logical.stage"]?xml}</name>
+ <#if ant?keys?seq_contains("stage.start.time")><started>${ant["stage.start.time"]?xml}</started></#if>
+ <#if ant?keys?seq_contains("stage.end.time")><finished>${ant["stage.end.time"]?xml}</finished></#if>
</stage>
</stages>
<#include "diamonds_footer.ftl">
\ No newline at end of file
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_start.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_start.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : start.xml.ftl
+Name : diamonds_start.xml.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
--- a/buildframework/helium/tools/common/templates/diamonds/diamonds_status.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/diamonds_status.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : finish.xml.ftl
+Name : diamonds_status.xml.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -21,6 +21,6 @@
-->
<#include "diamonds_header.ftl">
<build>
- <#if ant?keys?seq_contains("build.status")><status>${ant["build.status"]}</status></#if>
+ <#if ant?keys?seq_contains("build.status")><status>${ant["build.status"]?xml}</status></#if>
</build>
<#include "diamonds_footer.ftl">
\ No newline at end of file
--- a/buildframework/helium/tools/common/templates/diamonds/faults_metadata_orm.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/faults_metadata_orm.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -38,7 +38,7 @@
<total severity="warning_rvct_bad">${table_info['jpasingle']['select Count(m.id) from MetadataEntry m JOIN m.severity as p JOIN m.logFile as l where LOWER(l.path) like \'%\\_compile.log\' ESCAPE \'\\\' and LOWER(l.path) not like \'%\\_clean\\_%compile.log\' ESCAPE \'\\\' and p.severity=\'CRITICAL\''][0]}</total>
<#list table_info['native:java.lang.String']['select DISTINCT component.component from component INNER JOIN logfile ON logfile.logfile_id=component.logfile_id where logfile.path like \'%_compile.log\' and logfile.path not like \'%\\_clean\\_%compile.log\''] as component>
<component>
- <name>${component}</name>
+ <name>${component?xml}</name>
<total severity="error">${table_info['jpasingle']['select Count(m.id) from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where UPPER(p.severity)=\'ERROR\' and c.component=\'${component}\' and LOWER(l.path) like \'%\\_compile.log\' ESCAPE \'\\\' and LOWER(l.path) not like \'%\\_clean\\_%compile.log\' ESCAPE \'\\\''][0]}</total>
<total severity="warning">${table_info['jpasingle']['select Count(m.id) from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where UPPER(p.severity)=\'WARNING\' and c.component=\'${component}\' and LOWER(l.path) like \'%\\_compile.log\' ESCAPE \'\\\' and LOWER(l.path) not like \'%\\_clean\\_%compile.log\' ESCAPE \'\\\''][0]}</total>
<total severity="critical">${table_info['jpasingle']['select Count(m.id) from MetadataEntry m JOIN m.logFile as l JOIN m.severity as p JOIN m.component as c where UPPER(p.severity)=\'REMARK\' and c.component=\'${component}\' and LOWER(l.path) like \'%\\_compile.log\' ESCAPE \'\\\' and LOWER(l.path) not like \'%\\_clean\\_%compile.log\' ESCAPE \'\\\''][0]}</total>
@@ -53,9 +53,9 @@
<#if (!components?seq_contains(component.component))>
<@pp.add seq=components value=component.component />
<component>
- <name>${component.component}</name>
+ <name>${component.component?xml}</name>
<#if component.sysdefUnit??>
- <package>${component.sysdefUnit.sysdefComponent.sysdefCollection.sysdefPackage.packageId}</package>
+ <package>${component.sysdefUnit.sysdefComponent.sysdefCollection.sysdefPackage.packageId?xml}</package>
</#if>
</component>
</#if>
--- a/buildframework/helium/tools/common/templates/diamonds/publish.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/publish.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : .xml.ftl
+Name : publish.xml.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
@@ -25,15 +25,15 @@
<#list ant['diamonds.files']?split(" ") as line>
<#if line?split(".")?last == "fpsx">
<file>
- <name>${line?split("\\")?last}</name>
- <url>${line}</url>
+ <name>${line?split("\\")?last?xml}</name>
+ <url>${line?xml}</url>
<type>flash_image</type>
</file>
</#if>
<#if line?split(".")?last == "html" || line?split(".")?last == "log">
<file>
- <name>${line?split("\\")?last}</name>
- <url>${line}</url>
+ <name>${line?split("\\")?last?xml}</name>
+ <url>${line?xml}</url>
<type>log</type>
</file>
</#if>
--- a/buildframework/helium/tools/common/templates/diamonds/tool.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/tool.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -25,22 +25,22 @@
<#if ant?keys?seq_contains("env.SYMSEE_VERSION")>
<tool>
<name>SymSEE</name>
- <version>${ant["env.SYMSEE_VERSION"]}</version>
+ <version>${ant["env.SYMSEE_VERSION"]?xml}</version>
</tool>
</#if>
<#if (doc)??>
<#list doc["environment/tool"] as tool>
<#if tool.path?length > 0>
<tool>
- <name>${tool.name}</name>
- <version>${tool.version}</version>
+ <name>${tool.name?xml}</name>
+ <version>${tool.version?xml}</version>
</tool>
</#if>
</#list>
</#if>
<tool>
<name>Helium</name>
- <version>${ant["helium.version"]}</version>
+ <version>${ant["helium.version"]?xml}</version>
</tool>
</tools>
<#include "diamonds_footer.ftl">
--- a/buildframework/helium/tools/common/templates/diamonds/validate-policy-log.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/diamonds/validate-policy-log.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -19,12 +19,13 @@
============================================================================
-->
-<#include "diamonds_header.ftl">
+<#include "diamonds_header.ftl">
<quality aspect="policy">
-<#if (doc)??!""?keys?seq_contains('policyvalidation')>
-<#list doc['policyvalidation'].error as error>
+ <#if (doc)??!""?keys?seq_contains('policyvalidation')>
+ <summary message="Policy validation errors" value="${doc['policyvalidation'].error?size}"/>
+ <#list doc['policyvalidation'].error as error>
<message severity="error" type="${error.@type}" message="${error.@message}" value="${error.@value}"/>
-</#list>
-</#if>
+ </#list>
+ </#if>
</quality>
-<#include "diamonds_footer.ftl">
\ No newline at end of file
+<#include "diamonds_footer.ftl">
--- a/buildframework/helium/tools/common/templates/ido/ido-ant-copy.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-<#--
-============================================================================
-Name : ido-ant-copy.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0"?>
-<project name="ido-ant-copy" default="all">
- <target name="delete">
- <parallel threadCount="${r'$'}{number.of.threads}">
- <#list data?keys as component>
- <sequential>
- <#if ((ant['keep.old.source.enabled']=="true") || ant?keys?seq_contains('ido.keep.old'))>
- <delete dir="${data[component]}_old" failonerror="false"/>
- <move file="${data[component]}" todir="${data[component]}_old" failonerror="false"/>
- <#else>
- <delete dir="${data[component]}" failonerror="false"/>
- </#if>
- </sequential>
- </#list>
- </parallel>
- </target>
-
- <target name="copy">
- <#list data?keys as component>
- <mkdir dir="${data[component]}"/>
- </#list>
- <parallel threadCount="${r'$'}{number.of.threads}">
- <#list data?keys as component>
- <sequential>
- <copy todir="${data[component]}" verbose="false" failonerror="false" overwrite="true">
- <fileset dir="${component}" casesensitive="false" >
- <exclude name="**/_ccmwaid.inf"/>
- <exclude name="**/.ccmwaid.inf"/>
- <#if ((ant['keep.internal.folders.enabled'] == "false")&& (!ant?keys?seq_contains('keep.internals')))>
- <exclude name="**/internal/**"/>
- </#if>
- <exclude name="**/.hg/**"/>
- <exclude name="**/.svn/**"/>
- </fileset>
- </copy>
- <#-- Below operation is not required on linux as copy task will changes
- the file permissions to write mode -->
- <exec executable="attrib" osfamily="windows" dir="${data[component]}">
- <arg line="-R /S /D .\*"/>
- </exec>
- </sequential>
- </#list>
- </parallel>
- </target>
-
- <target name="all" depends="delete,copy" />
-</project>
--- a/buildframework/helium/tools/common/templates/ido/ido-ant-fixslashes.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/ido/ido-ant-fixslashes.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : ido-ant-copy.xml.ftl
+Name : ido-ant-fixslashes.xml.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
--- a/buildframework/helium/tools/common/templates/ido/ido-cenrep-gen.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-<#--
-============================================================================
-Name : ido-cenrep-gen.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<#assign table_info = pp.loadData('com.nokia.helium.metadata.ORMFMPPLoader',
- "${dbPath}") >
-
-<project name="cenrep-generation" default="all">
- <#if os?lower_case?starts_with('win')>
- <#assign exe_file="cmd.exe"/>
- <#else>
- <#assign exe_file="bash"/>
- </#if>
- <target name="ido-cenrep-generation">
- <sequential>
- <#list table_info['native:java.lang.String']['select distinct w.member FROM WhatLogEntry w where w.member like \'%.confml\''] as confmlfile>
- <exec executable="${exe_file}" dir="${ant['build.drive']}/epoc32/tools" failonerror="false" output="${ant['post.log.dir']}/${ant['build.id']}_cenrep.cone.log">
- <#if os?lower_case?starts_with('win')>
- <arg value="/c"/>
- <arg value="cone.cmd"/>
- <#else>
- <arg value="cone"/>
- </#if>
- <arg value="generate" />
- <arg value="-p"/>
- <arg value="${ant['build.drive']}\epoc32\rom\config\assets\s60" />
- <arg value="-o" />
- <arg value="${ant['build.drive']}\epoc32\release\winscw\urel\z" />
- <arg value="-c"/>
- <arg value="root.confml" />
- <arg value="-i"/>
- <arg value="${confmlfile}" />
- </exec>
- </#list>
- </sequential>
- </target>
-
- <target name="all" depends="ido-cenrep-generation" />
-</project>
-
-
--- a/buildframework/helium/tools/common/templates/ido/ido-cmt-ant.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-<#--
-============================================================================
-Name : ido-cmt-ant.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0"?>
-<project name="ido-cmt-ant" default="all" xmlns:hlm="http://www.nokia.com/helium">
-<import file="${ant['helium.dir']}/helium.ant.xml"/>
-<#assign targetlist=""/>
-<#assign cmtid=1/>
- <#list data?keys as component>
- <#if (cmtid > 1)>
- <#assign targetlist="${targetlist}" + ","/>
- </#if>
- <basename property="componentbase${cmtid}" file="${data[component]}"/>
- <target name="cmt-${cmtid}">
- <hlm:cmt output="${ant['build.log.dir']}/${ant['build.id']}_cmt/${ant['build.id']}_${r'$'}{componentbase${cmtid}}_${cmtid}.txt" failonerror="${ant['failonerror']}"
- htmlOutputDir="${ant['ido.cmt.html.output.dir']}">
- <fileset id="input" dir="${data[component]}">
- <include name="**/*.h"/>
- <include name="**/*.cpp"/>
- </fileset>
- </hlm:cmt>
- </target>
-
- <#assign targetlist="${targetlist}" + "cmt-${cmtid}"/>
- <#assign cmtid=cmtid+1/>
- </#list>
- <target name="all" depends="${targetlist}" />
-</project>
--- a/buildframework/helium/tools/common/templates/ido/ido-confml-validate.ant.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-<#--
-============================================================================
-Name : ido-confml-validate.ant.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<#assign table_info = pp.loadData('com.nokia.helium.metadata.ORMFMPPLoader',
- "${dbPath}") >
-<?xml version="1.0"?>
-<project name="validate-confml" default="validate-confml-file">
-
- <target name="validate-confml-file">
- <#if os?lower_case?starts_with('win')>
- <#assign exe_file="cmd.exe"/>
- <#else>
- <#assign exe_file="bash"/>
- </#if>
- <sequential>
- <exec executable="${exe_file}" dir="${ant['build.drive']}/epoc32/tools" failonerror="false" output="${ant['post.log.dir']}/${ant['build.id']}_validate_confml.log">
- <#if os?lower_case?starts_with('win')>
- <arg value="/c"/>
- <arg value="cone.cmd"/>
- <#else>
- <arg value="cone"/>
- </#if>
- <arg value="validate" />
- <#list table_info['native:java.lang.String']['select distinct w.member FROM WhatLogEntry w where w.member like \'%.confml\''] as confmlfile>
- <arg value="--confml-file"/>
- <arg value="${confmlfile}" />
- </#list>
- <#list table_info['native:java.lang.String']['select distinct w.member FROM WhatLogEntry w where w.member like \'%.crml\''] as crmlfile>
- <arg value="--implml-file"/>
- <arg value="${crmlfile}" />
- </#list>
- <arg value="--report-type"/>
- <arg value="xml" />
- <arg value="--report"/>
- <arg value="${ant['post.log.dir']}/${ant['build.id']}_validate_confml.xml" />
- </exec>
- </sequential>
- </target>
-
-</project>
-
-
--- a/buildframework/helium/tools/common/templates/ido/ido-export.ant.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-<#--
-============================================================================
-Name : ido-export.ant.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0"?>
-<project name="ido-copy">
-
- <target name="ido-copy-iby">
- <#list data?keys as name>
- <copy todir="${ant['ido.romtree']}" verbose="true" overwrite="true" flatten="true">
- <fileset dir="${data[name]}" casesensitive="no">
- <include name="**/rom/*.iby"/>
- <exclude name="**/internal/**"/>
- <exclude name="**/tsrc/**"/>
- </fileset>
- </copy>
- </#list>
- </target>
-
- <target name="ido-copy-cenrep">
- <#list data?keys as name>
- <copy todir="${ant['ido.cenrep.root']}" verbose="true" overwrite="true" flatten="true">
- <fileset dir="${data[name]}" casesensitive="no">
- <include name="**/cenrep/keys_*.xls"/>
- </fileset>
- </copy>
- </#list>
- </target>
-
-</project>
--- a/buildframework/helium/tools/common/templates/ido/ido-robot-zip.ant.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-<#--
-============================================================================
-Name : ido-robot-zip.ant.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0"?>
-<project name="ido-zip" default="all">
- <target name="all">
- <delete file="${ant['build.output.dir']}/s60Sources.7z" failonerror="false"/>
- <#if ((data?keys?size > 0) && (ant['robot.release.project']?split(';')?size > 0))>
- <#list data?keys as name>
- <#list ant['robot.release.project']?split(',') as project>
- <#if name?replace('\\', '/')?lower_case?contains("/${project}/${project}"?lower_case)>
- <#-- 7za u test.7z output/analysisdata/ -->
- <exec executable="7za" dir="${name}/../">
- <arg value="u"/>
- <arg value="-xr!*/internal/*"/>
- <arg value="-xr!*/doc/*"/>
- <arg value="-xr!_ccmwaid.inf"/>
- <arg value="-xr!abld.bat"/>
- <arg value="${ant['build.output.dir']}/s60Sources.7z"/>
- <arg value="${name?split("/")?last}/"/>
- </exec>
- </#if>
- </#list>
- </#list>
- </#if>
- <copy todir="${ant['s60.build.robot.path']}" file="${ant['build.output.dir']}/s60Sources.7z" failonerror="false" />
- </target>
-</project>
--- a/buildframework/helium/tools/common/templates/ido/ready.txt.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-<#--
-============================================================================
-Name : ready.txt.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-ido_name:${ant['build.name']}
-date(gt):${pp.now?string("EEE MMM d HH:mm:ss yyyy")}
-source_path:${ant['ccm.project.wa_path']}
-<#if ant?keys?seq_contains('email.from')>email:${ant['email.from']}</#if>
-<#if ant?keys?seq_contains('robot.email.to')><#list ant['robot.email.to']?split(',') as email>
-email:${email}
-</#list></#if>
-
--- a/buildframework/helium/tools/common/templates/ido/task-publish.ant.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-<#--
-============================================================================
-Name : task-publish.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0"?>
-<project name="task-publish" default="all" xmlns:hlm="http://www.nokia.com/helium">
-
- <target name="all">
- <#if (ant?keys?seq_contains('ccm.cache.xml'))>
- <hlm:createSessionMacro database="${ant['ccm.database']}" reference="publish.session" cache="${ant['ccm.cache.xml']}"/>
- <#else>
- <hlm:createSessionMacro database="${ant['ccm.database']}" reference="publish.session"/>
- </#if>
- <hlm:ccm verbose="false">
- <!-- Defining some session to use. -->
- <hlm:sessionset refid="publish.session"/>
-
- <hlm:addtask folder="${ant['publish.ccm.folder']}">
- <#list bom['/bom/content//task/id'] as task>
- <task name="${task?trim}"/>
- </#list>
- </hlm:addtask>
- <#if (!ant?keys?seq_contains('ccm.cache.xml'))>
- <hlm:close/>
- </#if>
- </hlm:ccm>
- </target>
-
- <!-- this is needed to include ccmtask support. -->
- <import file="${ant['helium.dir']}/helium.ant.xml"/>
-</project>
--- a/buildframework/helium/tools/common/templates/ido/zip-ant-wa-copy.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-<#--
-============================================================================
-Name : zip-ant-wa-copy.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0"?>
-<project name="zip-wa-ant-copy" default="all">
- <target name="all">
- <#list data?keys as component>
- <sequential>
- <#assign ba_path= data[component]?substring(3)/>
- <zip destfile="${ant['zip.wa.file']}" update="true" excludes="_ccmwaid.inf">
- <zipfileset dir="${component}" prefix="${ba_path}"/>
- </zip>
- </sequential>
- </#list>
- </target>
-</project>
--- a/buildframework/helium/tools/common/templates/integration/build-duplicates.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-<#--
-============================================================================
-Name : build-duplicates.html.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
- <#include "/@macro/logger/logger.ftl" />
- <head>
- <title>Build duplicates</title>
- <@helium_logger_html_head/>
- </head>
- <body>
-
-<#macro printconflict node>
- <#assign helium_node_id = helium_node_id + 1>
- <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.@name}">
- <@helium_message_box nodeid="${helium_node_id}" type="conflict" count=node[".//component"]?size/>
- </@helium_logger_node_head>
- <@helium_logger_node_content nodeid="${helium_node_id}">
- <#list node[".//component"] as component>
- <@helium_logger_print type="conflict">
- <a href="${component.@name}">${component.@name}</a>
- </@helium_logger_print>
- </#list>
- </@helium_logger_node_content>
-</#macro>
-
-
- <@helium_logger_header title="${ant['build.id']} build"/>
-
-
- <@helium_logger_content title="Errors and warnings details">
- <#list doc.buildconflicts["./file"] as conflict>
- <@printconflict conflict/>
- </#list>
- </@helium_logger_content>
-
- </body>
-</html>
-
--- a/buildframework/helium/tools/common/templates/integration/internal-exports.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-<#--
-============================================================================
-Name : internal-exports.html.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
- <#include "/@macro/logger/logger.ftl" />
- <head>
- <title>Internal Exports</title>
- <@helium_logger_html_head/>
- </head>
- <body>
-
-<#macro printconflict node>
- <#assign helium_node_id = helium_node_id + 1>
- <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.@name}">
- <@helium_message_box nodeid="${helium_node_id}" type="InternalExport" count=node[".//file"]?size/>
- </@helium_logger_node_head>
- <@helium_logger_node_content nodeid="${helium_node_id}">
- <#list node[".//file"] as file>
- <@helium_logger_print type="InternalExport">
- <a href="${file.@name}">${file.@name}</a>
- </@helium_logger_print>
- </#list>
- </@helium_logger_node_content>
-</#macro>
-
-
- <@helium_logger_header title="${ant['build.id']} build"/>
-
- <@helium_logger_content title="Errors and warnings details">
- <#list doc.internalexports["./component"] as component>
- <@printconflict component/>
- </#list>
- </@helium_logger_content>
-
- </body>
-</html>
-
--- a/buildframework/helium/tools/common/templates/integration/validate-policy.log.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-<#--
-============================================================================
-Name : validate-policy.log.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-CSV validation:
-<#list doc["./policyvalidation/error[@type='unknownstatus']"] as unknownstatus>
- ${unknownstatus.@message} (${unknownstatus.@value})
-</#list>
-
-Errors:
-<#list doc["./policyvalidation/error"] as error>
- <#if error.@type=='A' || error.@type=='B' || error.@type=='C' || error.@type=='D'>
- ${error.@type} Found incorrect for ${error.@message?replace('([\\\\/][^\\\\/]+?)$', '', 'ris')}, ${error.@value}
- </#if>
-</#list>
-
-Missing policy files in:
-<#list doc["./policyvalidation/error[@type='missing']"] as missing>
- ${missing.@message}
-</#list>
-
-
-Incorrect policy files in:
-<#list doc["./policyvalidation/error[@type='invalidencoding']"] as error>
- ${error.@message}
-</#list>
--- a/buildframework/helium/tools/common/templates/integration/validate-policy.log.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-<#--
-============================================================================
-Name : validate-policy.log.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0" encoding="utf-8"?>
-<log filename="${ant['validate.policy.log']}">
- <build>
- <task name="CSV validation">
-<#list doc["./policyvalidation/error[@type='unknownstatus']"] as unknownstatus>
- <message priority="error"><![CDATA[${unknownstatus.@message} (${unknownstatus.@value})]]></message>
-</#list>
- </task>
- <task name="Issues">
-<#list doc["./policyvalidation/error"] as error>
- <#if error.@type=='A' || error.@type=='B' || error.@type=='C' || error.@type=='D'>
- <message priority="error"><![CDATA[${error.@type} Found incorrect for ${error.@message?replace('([\\\\/][^\\\\/]+?)$', '', 'ris')}, ${error.@value}]]></message>
- </#if>
-</#list>
- </task>
- <task name="Missing">
-Missing policy files in:
-<#list doc["./policyvalidation/error[@type='missing']"] as missing>
- <message priority="error"><![CDATA[${missing.@message}]]></message>
-</#list>
- </task>
- <task name="Incorrect policy files">
-<#list doc["./policyvalidation/error[@type='invalidencoding']"] as error>
- <message priority="error"><![CDATA[${error.@message}]]></message>
-</#list>
- </task>
- </build>
-</log>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/common/templates/log/ca_content.txt.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,41 @@
+<#--
+============================================================================
+Name : ca_content_libraries.txt.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#if (logfilename)??>
+ <#assign logfilename_cleaned = "${logfilename}"?replace("\\","/") >
+ <#assign table_info = pp.loadData('com.nokia.helium.metadata.ORMFMPPLoader',
+ "${dbPath}") >
+ <#assign logfile = table_info['jpasingle']['select l from LogFile l where LOWER(l.path)=\'${logfilename_cleaned?lower_case}\''][0] >
+ <#if (checktype == 'header')>
+in header code
+ <#list table_info['native:java.lang.String']['select distinct w.member FROM WhatLogEntry w where w.member like \'%/epoc32/include%.%\''] as hfile>
+${hfile}
+ </#list>
+ <#elseif (checktype == 'lib')>
+in lib code
+ <#list table_info['native:java.lang.String']['select distinct w.member FROM WhatLogEntry w where w.member like \'%.lib\''] as hfile>
+${hfile}
+ </#list>
+ <#list table_info['native:java.lang.String']['select distinct w.member FROM WhatLogEntry w where w.member like \'%.dso\''] as hfile>
+${hfile}
+ </#list>
+ </#if>
+</#if>
--- a/buildframework/helium/tools/common/templates/log/email_status_orm.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/log/email_status_orm.html.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -107,7 +107,7 @@
${logfile.path}...FAIL<br/>
<#list table_info['jpa']['select e from MetadataEntry e JOIN e.severity s where s.severity=\'ERROR\' and e.logFileId=${logfile.id}'] as entry >
<ul>
- ${entry.text}<br/>
+ <#if entry.text??>${entry.text?html}</#if><br/>
</ul>
</#list>
</span>
--- a/buildframework/helium/tools/common/templates/log/scan2_orm.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/log/scan2_orm.html.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -86,7 +86,11 @@
"${dbPath}") >
<#-- overall summary -->
<#assign logfile = table_info['jpasingle']['select l from LogFile l where LOWER(l.path)=\'${logfilename_cleaned?lower_case}\''][0] >
-<#assign time = table_info['jpasingle']['select et from ExecutionTime et where et.logFileId=${logfile.id}'][0] >
+<#assign time = 0 >
+<#if (table_info['jpasingle']['select count(et) from ExecutionTime et where et.logFileId=${logfile.id}'][0] != 0)>
+<#assign time = table_info['jpasingle']['select et from ExecutionTime et where et.logFileId=${logfile.id}'][0]>
+<#assign time = time.time >
+</#if>
<html>
<head><title>${logfile.path}</title></head>
<body>
@@ -107,7 +111,7 @@
<#assign color_list={'error': 'FF0000', 'warning': 'FFF000', 'critical': 'FF7000', 'remark': 'FFCCFF', 'info': 'FFFFFF'}>
<#assign severity_ids = color_list?keys>
<td width="22%%">Total</td>
-<td width="12%%" align="center"><@converttime time=time.time /></td>
+<td width="12%%" align="center"><@converttime time=time /></td>
<#assign count_check_errors = table_info['jpasingle']['select Count(w.id) from WhatLogEntry w JOIN w.component c where c.logFileId=${logfile.id} and w.missing=\'true\''][0]>
<#list severity_ids as severity>
<#assign count = table_info['jpasingle']['select Count(m.id) from MetadataEntry m JOIN m.severity p where m.logFileId=${logfile.id} and p.severity=\'${severity?upper_case}\''][0]>
--- a/buildframework/helium/tools/common/templates/log/summary_metadata_orm.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/templates/log/summary_metadata_orm.html.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -64,6 +64,35 @@
<@logentry "${text}", "${severity?lower_case}" />
</#macro>
+<#macro metadata_entry_detail logentry, helium_node_id, component_name, component_id>
+ <#assign title_text="general">
+ <#assign component_query=" is NULL">
+ <#assign c_id="${logentry.path}">
+
+ <#if !(component_name == "")>
+ <#assign title_text="${component_name}">
+ <#assign component_query="=${component_id}">
+ <#assign c_id="${component_id}">
+ </#if>
+ <@helium_logger_node_head nodeid="${helium_node_id}" title="${title_text}">
+ <#list table_info['jpa']['select p from Severity p where p.severity not like \'INFO\''] as severity>
+ <@logfile_severity "${c_id}", "${severity.severity?lower_case}",
+ table_info['jpasingle']['select Count(m.id) from MetadataEntry m where m.severityId=${severity.id} and m.componentId ${component_query} and m.logFileId = ${logentry.id}'][0],
+ "${helium_node_id}" />
+ </#list>
+ </@helium_logger_node_head>
+
+ <@helium_logger_node_content nodeid="${helium_node_id}">
+ <#list table_info['jpa']['select p from Severity p'] as severity>
+ <#list table_info['jpa']['select m from MetadataEntry m where m.componentId ${component_query} and m.severityId=${severity.id} and m.logFileId = ${logentry.id}'] as entry>
+ <#if entry.text??>
+ <@logfile_entry_detail "${entry.text}", "${severity.severity?lower_case}", "${helium_node_id}" />
+ </#if>
+ </#list>
+ </#list>
+ </@helium_logger_node_content>
+</#macro>
+
<!-- Call the macros to render the log contents. -->
<#assign mykey=loginfo>
<#if (conv[mykey])?exists>
@@ -92,24 +121,14 @@
</#list>
</@helium_logger_node_head>
<@helium_logger_node_content nodeid="${helium_node_id}">
+ <#assign count_default_component = table_info['jpasingle']['select Count(m.id) from MetadataEntry m where m.logFileId=${logentry.id} and m.componentId is NULL'][0]>
+ <#if count_default_component > 0>
+ <#assign helium_node_id = helium_node_id + 1>
+ <@metadata_entry_detail logentry, "${helium_node_id}", "", ""/>
+ </#if>
<#list table_info['jpa']['select c from Component c where c.logFileId=${logentry.id}'] as component>
<#assign helium_node_id = helium_node_id + 1>
- <@helium_logger_node_head nodeid="${helium_node_id}" title="${component.component}">
- <#list table_info['jpa']['select p from Severity p where p.severity not like \'INFO\''] as severity>
- <@logfile_severity "${component.id}", "${severity.severity?lower_case}",
- table_info['jpasingle']['select Count(m.id) from MetadataEntry m where m.severityId=${severity.id} and m.componentId=${component.id}'][0],
- "${helium_node_id}" />
- </#list>
- </@helium_logger_node_head>
- <@helium_logger_node_content nodeid="${helium_node_id}">
- <#list table_info['jpa']['select p from Severity p'] as severity>
- <#list table_info['jpa']['select m from MetadataEntry m where m.componentId=${component.id} and m.severityId=${severity.id}'] as entry>
- <#if entry.text??>
- <@logfile_entry_detail "${entry.text}", "${severity.severity?lower_case}", "${helium_node_id}" />
- </#if>
- </#list>
- </#list>
- </@helium_logger_node_content>
+ <@metadata_entry_detail logentry, "${helium_node_id}", "${component.component}", "${component.id}" />
</#list>
</@helium_logger_node_content>
</#list>
--- a/buildframework/helium/tools/common/templates/quality/cone-validate.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-<#--
-============================================================================
-Name : cone-validate.xml.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-
-<project name="cone-validate" default="all">
-
- <target name="product-cone-validate">
- <#if os?lower_case?starts_with('win')>
- <#assign exe_file="cmd.exe"/>
- <#else>
- <#assign exe_file="bash"/>
- </#if>
- <#list ant['product.list']?split(',') as product>
- <sequential>
- <echo>Validating cone configuration for ${product}_root.confml</echo>
- <exec executable="${exe_file}" dir="${ant['build.drive']}/epoc32/tools" failonerror="false">
- <#if os?lower_case?starts_with('win')>
- <arg value="/c"/>
- <arg value="cone.cmd"/>
- <#else>
- <arg value="cone"/>
- </#if>
- <arg value="validate" />
- <arg value="--project"/>
- <arg value="${ant['build.drive']}/epoc32/rom/config"/>
- <arg value="--configuration"/>
- <arg value="${product}_root.confml"/>
- <arg value="--report-type"/>
- <arg value="xml" />
- <arg value="--report"/>
- <arg value="${ant['post.log.dir']}/${ant['build.id']}_validate_cone_${product}.xml" />
- </exec>
- </sequential>
- </#list>
- </target>
-
- <target name="all" depends="product-cone-validate" />
-</project>
-
-
--- a/buildframework/helium/tools/common/test/test_diamonds_templates.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/test/test_diamonds_templates.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -42,6 +42,7 @@
<delete dir="${test.temp.dir}" />
</target>
+
<target name="test-diamonds-signal-template-without-signal-data">
<fmpp sourceFile="${helium.dir}/tools/common/templates/diamonds/diamonds_signal.xml.ftl"
outputfile="${test.temp.dir}/diamonds_signal.xml">
@@ -51,6 +52,7 @@
</fmpp>
<loadfile property="diamonds.xml" srcFile="${test.temp.dir}/diamonds_signal.xml" />
<echo>${diamonds.xml}</echo>
+ <xmlvalidate file="${test.temp.dir}/diamonds_signal.xml" lenient="true" />
<au:assertTrue message="No signals are pushed to diamonds">
<not>
<contains string="${diamonds.xml}" substring="<signal>" />
@@ -75,4 +77,106 @@
<contains string="${diamonds.xml}" substring="<name>fakeSignal</name>" />
</au:assertTrue>
</target>
+
+ <target name="test-diamonds-build-roms-template">
+ <hlm:metadatarecord database="${test.temp.dir}/database_db">
+ <hlm:imakermetadatainput>
+ <fileset casesensitive="false" file="${helium.dir}/tests/data/diamonds/build_roms_sample.log"/>
+ <metadatafilterset refid="filterset.imaker" />
+ </hlm:imakermetadatainput>
+ </hlm:metadatarecord>
+ <fmpp sourceFile="${helium.dir}/tools/common/templates/diamonds/build_roms_diamonds.xml.ftl"
+ outputfile="${test.temp.dir}/build_roms_diamonds.xml">
+ <data expandProperties="yes">
+ dbPath: ${test.temp.dir}/database_db
+ ant: antProperties()
+ </data>
+ </fmpp>
+ <loadfile property="diamonds.xml" srcFile="${test.temp.dir}/build_roms_diamonds.xml" />
+ <echo>${diamonds.xml}</echo>
+ <xmlvalidate file="${test.temp.dir}/build_roms_diamonds.xml" lenient="true" warn="true" />
+ <au:assertTrue message="XML character are escaped.">
+ <contains string="${diamonds.xml}" substring="&apos;" />
+ </au:assertTrue>
+ <au:assertTrue message="known image can be found.">
+ <contains string="${diamonds.xml}" substring="<name>RM-XXX_010.014_79.92_prd.udaerase.fpsx</name>" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-diamonds-build-xml-template">
+ <property name="ecc.project" value="diamonds_ecc_test"/>
+ <property name="ecc.schedule" value="diamonds_ecc_schedule"/>
+ <property name="ecc.ido.branch" value="diamonds_ecc_ido_branch"/>
+ <property name="ecc.procedure" value="diamonds_ecc_procedure"/>
+ <property name="ecc.include.in.stats" value="diamonds_ecc_include_in_stats"/>
+ <property name="build.family" value="diamonds_template_test"/>
+ <property name="ecc.ido.branch" value="diamonds_ecc_ido_branch"/>
+ <property name="ecc.ido.branch" value="diamonds_ecc_ido_branch"/>
+ <tstamp>
+ <format property="build.start.time" pattern="MM/dd/yyyy hh:mm aa" unit="hour"/>
+ </tstamp>
+ <tstamp>
+ <format property="build.end.time" pattern="MM/dd/yyyy hh:mm aa" unit="hour"/>
+ </tstamp>
+ <fmpp sourceFile="${helium.dir}/tools/common/templates/diamonds/diamonds_build.xml.ftl"
+ outputfile="${test.temp.dir}/diamonds_build.xml">
+ <data expandProperties="yes">
+ dbPath: ${test.temp.dir}/database_db
+ ant: antProperties()
+ </data>
+ </fmpp>
+ <loadfile property="diamonds.xml" srcFile="${test.temp.dir}/diamonds_build.xml" />
+ <echo>${diamonds.xml}</echo>
+ <au:assertTrue message="XML character are escaped.">
+ <contains string="${diamonds.xml}" substring="diamonds_template_test" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-diamonds-finish-xml-template">
+ <tstamp>
+ <format property="build.end.time" pattern="MM/dd/yyyy hh:mm aa" unit="hour"/>
+ </tstamp>
+ <echo> test.temp.dir = ${test.temp.dir}</echo>
+ <fmpp sourceFile="${helium.dir}/tools/common/templates/diamonds/diamonds_finish.xml.ftl"
+ outputfile="${test.temp.dir}/finish.xml">
+ <data expandProperties="yes">
+ dbPath: ${test.temp.dir}/database_db
+ ant: antProperties()
+ </data>
+ </fmpp>
+ <loadfile property="diamonds.xml" srcFile="${test.temp.dir}/finish.xml" />
+ <echo>${diamonds.xml}</echo>
+ <au:assertTrue message="XML character are escaped.">
+ <contains string="${diamonds.xml}" substring="${build.end.time}" />
+ </au:assertTrue>
+ </target>
+
+ <target name="test-diamonds-stage-xml-template">
+ <property name="logical.stage" value="diamonds-test"/>
+ <tstamp>
+ <format property="stage.start.time" pattern="MM/dd/yyyy hh:mm aa" unit="hour"/>
+ </tstamp>
+ <tstamp>
+ <format property="stage.end.time" pattern="MM/dd/yyyy hh:mm aa" unit="hour"/>
+ </tstamp>
+ <fmpp sourceFile="${helium.dir}/tools/common/templates/diamonds/diamonds_stage.xml.ftl"
+ outputfile="${test.temp.dir}/stage.xml">
+ <data expandProperties="yes">
+ dbPath: ${test.temp.dir}/database_db
+ ant: antProperties()
+ </data>
+ </fmpp>
+ <loadfile property="diamonds.xml" srcFile="${test.temp.dir}/stage.xml" />
+ <echo>${diamonds.xml}</echo>
+ <au:assertTrue message="XML character are escaped.">
+ <contains string="${diamonds.xml}" substring="${stage.start.time}" />
+ </au:assertTrue>
+ <au:assertTrue message="XML character are escaped.">
+ <contains string="${diamonds.xml}" substring="${stage.end.time}" />
+ </au:assertTrue>
+ </target>
+
+
+
+
</project>
--- a/buildframework/helium/tools/common/testing.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/common/testing.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -39,7 +39,7 @@
<propertyref name="synergy71.enabled"/>
</propertyset>
<fileset dir="${helium.dir}" includes="tools/**/test_*.ant.xml"/>
- <fileset dir="${helium.dir}" includes="extensions/*/tools/**/test_*.ant.xml"/>
+ <fileset dir="${helium.dir}" includes="extensions/*/tools/**/test_*.ant.xml"/>
<au:plainlistener/>
<hlm:antcoveragelistener outputfile="${helium.build.dir}/report/antunit/ant_coverage.txt"/>
<au:xmllistener toDir="${helium.build.dir}/report/antunit" logLevel="info" />
--- a/buildframework/helium/tools/compile/cmaker.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/cmaker.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -80,6 +80,24 @@
</condition>
<!--
+ This property defines the full path location of cmaker under windows.
+ @type string
+ @scope public
+ @editable allowed
+ @since 11.0.1
+ -->
+ <property name="cmaker.windows.location" value="${build.drive}/epoc32/tools/cmaker.cmd" />
+
+ <!--
+ This property defines the full path location of cmaker under linux.
+ @type string
+ @scope public
+ @editable allowed
+ @since 11.0.1
+ -->
+ <property name="cmaker.linux.location" value="${build.drive}/epoc32/tools/cmaker" />
+
+ <!--
The cmakerMacro enables the user to run cmaker commands directly from Ant.
To configure it just provide NCP and S60 version and the action you want to run.
Default action is WHAT.
@@ -114,12 +132,12 @@
</if>
<hlm:symbianLogHeaderMacro command="cmaker ${temp.cmaker.arg1} ${temp.cmaker.arg2} ACTION=@{action}"
config="CMAKER_@{action}" dir="${cmaker.config.dir}"/>
- <exec executable="${build.drive}/epoc32/tools/cmaker.cmd" osfamily="windows" dir="${cmaker.config.dir}">
+ <exec executable="${cmaker.windows.location}" osfamily="windows" dir="${cmaker.config.dir}">
<arg line="${temp.cmaker.arg1}" />
<arg line="${temp.cmaker.arg2}" />
<arg value="ACTION=@{action}" />
</exec>
- <exec executable="${build.drive}/epoc32/tools/cmaker.sh" osfamily="unix" dir="${cmaker.config.dir}">
+ <exec executable="${cmaker.linux.location}" osfamily="unix" dir="${cmaker.config.dir}">
<arg line="${temp.cmaker.arg1}" />
<arg line="${temp.cmaker.arg2}" />
<arg value="ACTION=@{action}" />
--- a/buildframework/helium/tools/compile/compile.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/compile.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -104,6 +104,7 @@
@editable required
@since 11.0
-->
+ <property name="sysdef3.enabled" value="true" />
<!--* @property internal.sysdef3.enabled
To run the sysdef3 dependent tasks if sysdef3.enabled set to true.
--- a/buildframework/helium/tools/compile/compile.antlib.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/compile.antlib.xml Mon Oct 18 10:23:52 2010 +0100
@@ -216,7 +216,6 @@
</sequential>
</macrodef>
-
<!-- Electric Cloud emake support.
e.g:
@@ -256,13 +255,6 @@
if (attributes.get("custom") != null) {
custom = attributes.get("custom");
}
-if (attributes.get("root") != null) {
- root = attributes.get("root");
-}
-else {
- root = "";
-}
-
self.log("Custom: " + custom);
// Create and configure exec target
@@ -291,12 +283,18 @@
task.createArg().setValue("--emake-build-label=" + buildId + "-" + attributes.get("name"));
String eclass = com.nokia.ant.util.Helper.getProperty(project, "ec.build.class");
task.createArg().setValue("--emake-class=" + eclass);
+
+// Defining the emake-root argument for the command line.
String eroot = com.nokia.ant.util.Helper.getProperty(project, "env.EMAKE_ROOT");
String heliumDir = com.nokia.ant.util.Helper.getProperty(project, "helium.dir");
-if (attributes.get("root") != null) {
- self.log("--emake-root=" + eroot + ";" + heliumDir + ";" + root);
-}
-task.createArg().setValue("--emake-root=" + eroot + ";" + heliumDir + ";" + root);
+String pathSeparator = com.nokia.ant.util.Helper.getProperty(project, "path.separator");
+String emakeRoot = eroot + pathSeparator + heliumDir;
+if (attributes.get("root") != null && attributes.get("root").length() > 0) {
+ emakeRoot = emakeRoot + pathSeparator + attributes.get("root");
+}
+self.log("Roots: " + emakeRoot);
+task.createArg().setValue("--emake-root=" + emakeRoot);
+
if (attributes.get("phase") != null) {
annofileDir = com.nokia.ant.util.Helper.getProperty(project, "build.log.dir") + "/" + attributes.get("phase");
}
--- a/buildframework/helium/tools/compile/coverity.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/coverity.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -56,6 +56,27 @@
@since 11.0
-->
+ <!--* @property post.coverity.steps.enabled
+ Set to true to run post coverity steps.
+ @type boolean
+ @scope private
+ @since 11.0.4
+ -->
+
+ <!--* @property is.zero.coverity.errors
+ Set to true if coverity error file contains zero errors.
+ @type boolean
+ @scope private
+ @since 11.0.4
+ -->
+
+ <!--* @property is.zero.coverity.output.errors
+ Set to true if coverity output file contains zero fatal errors.
+ @type boolean
+ @scope private
+ @since 11.0.4
+ -->
+
<!--* @property internal.coverity.commit.defects.enabled
Run the targets to commit the defects into database if coverity.commit.defects.enabled set to true.
@type boolean
@@ -145,14 +166,14 @@
<!-- set property if coverity is enabled -->
<condition property="internal.coverity.enabled">
<or>
- <istrue value="${coverity.enabled}" />
+ <istrue value="${coverity.enabled}"/>
<istrue value="${enabled.coverity}"/>
</or>
</condition>
<!-- set property if coverity.commit.defects.enabled is enabled -->
<condition property="internal.coverity.commit.defects.enabled">
- <istrue value="${coverity.commit.defects.enabled}" />
+ <istrue value="${coverity.commit.defects.enabled}"/>
</condition>
<if>
@@ -178,74 +199,59 @@
<arg name="--record-only" value=""/>
</hlm:coverityoptions>
- <!-- cov-build emit command options -->
- <hlm:coverityoptions id="coverity.emit.options">
- <arg name="--config" value="${coverity.config.dir}/coverity_config.xml"/>
- <arg name="--dir" value="${coverity.inter.dir}"/>
- <arg name="--replay" value=""/>
- <arg name="--replay-processes" value="${coverity.no.thread}"/>
- </hlm:coverityoptions>
-
- <!-- cov-config command options -->
- <hlm:coverityoptions id="coverity.config.options">
- <hlm:arg name="--config" value="${coverity.config.dir}/coverity_config.xml"/>
- <hlm:arg name="--template" value=""/>
- <hlm:arg name="--comptype" value="armcc"/>
- <hlm:arg name="--compiler" value="armcc.exe"/>
- </hlm:coverityoptions>
-
- <!-- cov-analyze command options -->
- <hlm:coverityoptions id="coverity.analyze.options">
- <hlm:arg name="--dir" value="${coverity.analyze.dir}"/>
- <hlm:arg name="--all" value=""/>
- <hlm:arg name="--symbian" value=""/>
- <hlm:arg name="--append" value=""/>
- <hlm:arg name="--enable-callgraph-metrics" value=""/>
- </hlm:coverityoptions>
-
<!-- To run post coverity steps -->
<target name="post-coverity" if="internal.coverity.enabled">
<mkdir dir="${post.log.dir}"/>
+
<!-- To emit the file into defect database -->
- <antcall target="run-coverity-emit"/>
+ <runtarget target="run-coverity-emit"/>
+
+ <!-- To collect linkage information on all files -->
+ <runtarget target="run-coverity-link"/>
<!-- To analyze the sources file -->
- <antcall target="run-coverity-analyze"/>
+ <runtarget target="run-coverity-analyze"/>
<!-- To generate the HTML error pages -->
- <antcall target="gen-coverity-report"/>
+ <runtarget target="gen-coverity-report"/>
<!-- To commit the defects into coverity defect manager. -->
- <antcall target="run-commit-defects"/>
-
- <hlm:metadatarecord database="${metadata.dbfile}">
- <hlm:textmetadatainput>
- <fileset casesensitive="false" file="${post.log.dir}/${build.id}_coverity_command_errors.log" />
- <metadatafilterset>
- <metadatafilter priority="error" regex=".*" description="coverity error" />
- </metadatafilterset>
- </hlm:textmetadatainput>
- </hlm:metadatarecord>
- <hlm:metadataCountSeverity severity="ERROR" log="${post.log.dir}/${build.id}_coverity_command_errors.log" database="${metadata.dbfile}" property="coverity.error.total"/>
- <echo>Coverity command errors: ${coverity.error.total}</echo>
- <hlm:generateBuildStatus file="${post.log.dir}/${build.id}_coverity_command_errors.log" />
- <hlm:signalMacro logfile="${post.log.dir}/${build.id}_coverity_command_errors.log" phase="post" signal.input="coveritySignalInput" />
+ <runtarget target="run-commit-defects"/>
</target>
<!-- Run coverity configure if the coverity.enabled is set to true -->
<target name="run-coverity-configure" if="internal.coverity.enabled">
- <hlm:coverity command="cov-configure" dir="${build.drive}/">
- <hlm:coverityoptions refid="coverity.config.options"/>
- </hlm:coverity >
+ <mkdir dir="${compile.log.dir}"/>
+ <!-- cov-config command options -->
+ <hlm:coverityoptions id="coverity.config.options">
+ <hlm:arg name="--config" value="${coverity.config.dir}/coverity_config.xml"/>
+ <hlm:arg name="--template" value=""/>
+ <hlm:arg name="--comptype" value="armcc"/>
+ <hlm:arg name="--compiler" value="armcc.exe"/>
+ </hlm:coverityoptions>
+ <hlm:runCoverityCommand errorlog="${compile.log.dir}/${build.id}_coverity_configure_errors.log"
+ command="cov-configure"
+ options="coverity.config.options"
+ outputlog="${compile.log.dir}/${build.id}_coverity_configure_output.log"
+ />
</target>
<!-- Run coverity build with emit options if the coverity.enabled is set to true
re-running the cov-build with replay option will reduce the build time by ~ 20%
-->
- <target name="run-coverity-emit" >
- <hlm:coverity command="cov-build" dir="${build.drive}/" error="${post.log.dir}/${build.id}_coverity_command_errors.log" >
- <hlm:coverityoptions refid="coverity.emit.options"/>
- </hlm:coverity >
+ <target name="run-coverity-emit">
+ <!-- cov-build emit command options -->
+ <hlm:coverityoptions id="coverity.emit.options">
+ <arg name="--config" value="${coverity.config.dir}/coverity_config.xml"/>
+ <arg name="--dir" value="${coverity.inter.dir}"/>
+ <arg name="--replay" value=""/>
+ <arg name="--replay-processes" value="${coverity.no.thread}"/>
+ </hlm:coverityoptions>
+ <hlm:runCoverityCommand errorlog="${post.log.dir}/${build.id}_coverity_emit_errors.log"
+ command="cov-build"
+ options="coverity.emit.options"
+ outputlog="${post.log.dir}/${build.id}_coverity_emit_output.log"
+ />
</target>
<!-- Run coverity-analyze if the coverity.enabled is set to true
@@ -260,34 +266,75 @@
So run the cov-link commands and analyze the database using cov-analyze command.
-->
- <target name="run-coverity-analyze" >
+ <target name="run-coverity-link" if="post.coverity.steps.enabled">
<mkdir dir="${coverity.link.dir}"/>
- <hlm:coverity command="cov-link" dir="${build.drive}/" error="${post.log.dir}/${build.id}_coverity_command_errors.log" append="true">
+
+ <!-- Run cov-link with the -co and -of options to collect linkage information on all files compiled in an emit directory.-->
+ <hlm:coverityoptions id="coverity.link.all.options">
<hlm:arg name="--dir" value="${coverity.inter.dir}"/>
<hlm:arg name="--collect" value=""/>
<hlm:arg name="-of" value="${coverity.link.dir}/all.link"/>
- </hlm:coverity >
- <hlm:coverity command="cov-link" dir="${build.drive}/" error="${post.log.dir}/${build.id}_coverity_command_errors.log" append="true">
+ </hlm:coverityoptions>
+ <hlm:runCoverityCommand errorlog="${post.log.dir}/${build.id}_coverity_link_errors.log"
+ command="cov-link"
+ options="coverity.link.all.options"
+ outputlog="${post.log.dir}/${build.id}_coverity_link_output.log"
+ />
+
+ <!--Create one or more additional link files by filtering information using either an argument or a portion
+ of the pathname that was used during command-line compilation-->
+ <hlm:coverityoptions id="coverity.link.options">
<hlm:arg name="--dir" value="${coverity.inter.dir}"/>
<hlm:arg name="--compile-arg" value="armv5"/>
<hlm:arg name="-of" value="${coverity.link.dir}/armv5.link"/>
<hlm:arg name="${coverity.link.dir}/all.link" value=""/>
- </hlm:coverity >
- <hlm:coverity command="cov-link" dir="${build.drive}/" error="${post.log.dir}/${build.id}_coverity_command_errors.log" append="true">
+ </hlm:coverityoptions>
+ <hlm:runCoverityCommand errorlog="${post.log.dir}/${build.id}_coverity_link_errors.log"
+ append="true"
+ command="cov-link"
+ options="coverity.link.options"
+ outputlog="${post.log.dir}/${build.id}_coverity_link_output.log"
+ />
+
+ <!--Use the link files created in the previous steps, and the emit repository in the original intermediate directory, to create a new
+ intermediate directory with an emit repository with resolved function calls -->
+ <hlm:coverityoptions id="coverity.link.extract.options">
<hlm:arg name="--dir" value="${coverity.inter.dir}"/>
<hlm:arg name="--output-dir" value="${coverity.analyze.dir}"/>
<hlm:arg name="${coverity.link.dir}/armv5.link" value=""/>
- </hlm:coverity >
- <hlm:coverity command="cov-analyze" dir="${build.drive}/" error="${post.log.dir}/${build.id}_coverity_command_errors.log" append="true">
- <hlm:coverityoptions refid="coverity.analyze.options"/>
- </hlm:coverity >
+ </hlm:coverityoptions>
+ <hlm:runCoverityCommand errorlog="${post.log.dir}/${build.id}_coverity_link_errors.log"
+ append="true"
+ command="cov-link"
+ options="coverity.link.extract.options"
+ outputlog="${post.log.dir}/${build.id}_coverity_link_output.log"
+ />
+ </target>
+
+ <!-- To analyze the sources file -->
+ <target name="run-coverity-analyze" if="post.coverity.steps.enabled">
+
+ <!-- cov-analyze command options -->
+ <hlm:coverityoptions id="coverity.analyze.options">
+ <hlm:arg name="--dir" value="${coverity.analyze.dir}"/>
+ <hlm:arg name="--all" value=""/>
+ <hlm:arg name="--symbian" value=""/>
+ <hlm:arg name="--append" value=""/>
+ <hlm:arg name="--enable-callgraph-metrics" value=""/>
+ </hlm:coverityoptions>
+ <hlm:runCoverityCommand errorlog="${post.log.dir}/${build.id}_coverity_analyze_errors.log"
+ command="cov-analyze"
+ options="coverity.analyze.options"
+ outputlog="${post.log.dir}/${build.id}_coverity_analyze_output.log"
+ />
+
</target>
<!-- Generate coverity report -->
- <target name="gen-coverity-report">
+ <target name="gen-coverity-report" if="post.coverity.steps.enabled">
<!-- Read the summary file generated by cov-analyze and generate html file -->
- <fmpp sourceFile="${helium.dir}/tools/common/templates/coverity/coverity.summary.html.ftl"
+ <fmpp sourceFile="${helium.dir}/tools/compile/templates/coverity.summary.html.ftl"
outputFile="${temp.build.dir}/${build.id}_coverity_build_summary.html">
<data expandProperties="yes">
ant: antProperties()
@@ -296,7 +343,7 @@
</fmpp>
<!-- To generate summary file for diamonds -->
- <fmpp sourceFile="${helium.dir}/tools/common/templates/coverity/coverity.summary.xml.ftl"
+ <fmpp sourceFile="${helium.dir}/tools/compile/templates/coverity.summary.xml.ftl"
outputFile="${coverity.summary.xml.file}">
<data expandProperties="yes">
ant: antProperties()
@@ -305,11 +352,16 @@
</fmpp>
<!-- Run this to get the static html pages -->
- <hlm:coverity command="cov-format-errors" dir="${build.drive}/" error="${post.log.dir}/${build.id}_coverity_command_errors.log" append="true">
+ <hlm:coverityoptions id="coverity.format.errors.options">
<hlm:arg name="--dir" value="${coverity.analyze.dir}"/>
<hlm:arg name="--filesort" value=""/>
<hlm:arg name="--functionsort" value=""/>
- </hlm:coverity >
+ </hlm:coverityoptions>
+ <hlm:runCoverityCommand errorlog="${post.log.dir}/${build.id}_coverity_format_errors.log"
+ command="cov-format-errors"
+ options="coverity.format.errors.options"
+ outputlog="${post.log.dir}/${build.id}_coverity_format_ouput.log"
+ />
<!-- Copy the summary file to resolve the xml load error -->
<copy file="${coverity.analyze.dir}/c/output/errors/summary.xml" tofile="${coverity.checkers.xml.file}" overwrite="true" failonerror="false">
@@ -341,61 +393,40 @@
</concat>
</target>
-
- <!-- To get the SBS variable value -->
- <macrodef name="getSBSVariableValue" uri="http://www.nokia.com/helium">
- <attribute name="variablename"/>
- <attribute name="outputvar"/>
- <attribute name="sbsinput"/>
- <sequential>
- <var name="output.var" unset="true"/>
- <hlm:getVariableValue name="@{variablename}" property="output.var">
- <hlm:sbsinput refid="@{sbsinput}" />
- </hlm:getVariableValue>
- <if>
- <and>
- <isset property="output.var"/>
- <matches string="${output.var}" pattern="arm.*"/>
- </and>
- <then>
- <antcall target="set-arm-version"/>
- </then>
- </if>
- <script language="beanshell"> <![CDATA[
- curVal=project.getProperty("output.var");
- project.setProperty("@{outputvar}",curVal);
- ]]>
- </script>
- </sequential>
- </macrodef>
-
<!-- To commit the coverity defects into coverity defect manager -->
<target name="run-commit-defects" depends="coverity-username,coverity-password" if="internal.coverity.commit.defects.enabled">
-
- <!-- Check is the coverity defect manager server and port numbers are set -->
- <fail message="FAILED: Coverity defect manager server/IP address is not set. Please set 'coverity.defect.manager.server'. Ex: server.domain.extension or 100.220.530.101"
- unless="coverity.defect.manager.server"/>
- <fail message="FAILED: Coverity defect manager HTTP port number is not set. Please set 'coverity.defect.manager.port'."
- unless="coverity.defect.manager.port"/>
- <!-- Check is the coverity defect manager server product is set to submit the coverity errors.-->
- <fail message="FAILED: Coverity defect manager product name is not set. Please set 'coverity.defect.manager.product'."
- unless="coverity.defect.manager.product"/>
-
- <!-- cov-commit-defects command options -->
- <hlm:coverityoptions id="coverity.commit.defects.options">
- <hlm:arg name="--config" value="${coverity.config.dir}/coverity_config.xml"/>
- <hlm:arg name="--remote" value="${coverity.defect.manager.server}"/>
- <hlm:arg name="--port" value="${coverity.defect.manager.port}"/>
- <hlm:arg name="--user" value="${coverity.username}"/>
- <hlm:arg name="--password" value="${coverity.password}"/>
- <hlm:arg name="--dir" value="${coverity.analyze.dir}"/>
- <hlm:arg name="--product" value="${coverity.defect.manager.product}"/>
- </hlm:coverityoptions>
-
- <!-- Run the coverity commit defects command to submit the errors into defect manager -->
- <hlm:coverity command="cov-commit-defects" dir="${build.drive}/" error="${post.log.dir}/${build.id}_coverity_command_errors.log" append="true">
- <hlm:coverityoptions refid="coverity.commit.defects.options"/>
- </hlm:coverity >
+ <if>
+ <istrue value="${post.coverity.steps.enabled}"/>
+ <then>
+ <mkdir dir="${post.log.dir}"/>
+ <!-- Check is the coverity defect manager server and port numbers are set -->
+ <fail message="FAILED: Coverity defect manager server/IP address is not set. Please set 'coverity.defect.manager.server'. Ex: server.domain.extension or 100.220.530.101"
+ unless="coverity.defect.manager.server"/>
+ <fail message="FAILED: Coverity defect manager HTTP port number is not set. Please set 'coverity.defect.manager.port'."
+ unless="coverity.defect.manager.port"/>
+ <!-- Check is the coverity defect manager server product is set to submit the coverity errors.-->
+ <fail message="FAILED: Coverity defect manager product name is not set. Please set 'coverity.defect.manager.product'."
+ unless="coverity.defect.manager.product"/>
+
+ <!-- cov-commit-defects command options -->
+ <hlm:coverityoptions id="coverity.commit.defects.options">
+ <hlm:arg name="--config" value="${coverity.config.dir}/coverity_config.xml"/>
+ <hlm:arg name="--remote" value="${coverity.defect.manager.server}"/>
+ <hlm:arg name="--port" value="${coverity.defect.manager.port}"/>
+ <hlm:arg name="--user" value="${coverity.username}"/>
+ <hlm:arg name="--password" value="${coverity.password}"/>
+ <hlm:arg name="--dir" value="${coverity.analyze.dir}"/>
+ <hlm:arg name="--product" value="${coverity.defect.manager.product}"/>
+ </hlm:coverityoptions>
+
+ <!-- Run the coverity commit defects command to submit the errors into defect manager -->
+ <hlm:runCoverityCommand errorlog="${post.log.dir}/${build.id}_coverity_commit_defects_errors.log"
+ command="cov-commit-defects"
+ options="coverity.commit.defects.options"
+ outputlog="${post.log.dir}/${build.id}_coverity_commit_defects_ouput.log"
+ />
+ </then>
+ </if>
</target>
<!-- Retrieve the coverity password from the .netrc file and store it into coverity.password property. -->
@@ -409,4 +440,60 @@
<hlm:netrcUsernameMacro output-prop="coverity.username" result-prop="coverity.username.available" type="coverity"/>
</target>
+
+ <!-- To run coverity command and to check errors thrown by coverity commands -->
+ <macrodef name="runCoverityCommand" uri="http://www.nokia.com/helium">
+ <attribute name="errorlog"/>
+ <attribute name="outputlog"/>
+ <attribute name="command"/>
+ <attribute name="append" default="false"/>
+ <attribute name="options"/>
+ <sequential>
+ <var name="is.zero.coverity.errors" unset="true"/>
+ <var name="is.zero.coverity.output.errors" unset="true"/>
+ <var name="post.coverity.steps.enabled" unset="true"/>
+ <var name="total.coverity.errors" unset="true"/>
+ <var name="total.coverity.output.errors" unset="true"/>
+ <hlm:coverity command="@{command}" dir="${build.drive}/" error="@{errorlog}" append="@{append}" output="@{outputlog}">
+ <hlm:coverityoptions refid="@{options}"/>
+ </hlm:coverity>
+ <hlm:metadatarecord database="${metadata.dbfile}">
+ <hlm:coveritymetadatainput>
+ <fileset casesensitive="false" file="@{errorlog}"/>
+ <metadatafilterset refid="filterset.coverity.error.cli"/>
+ </hlm:coveritymetadatainput>
+ </hlm:metadatarecord>
+ <hlm:metadataCountSeverity severity="ERROR" log="@{errorlog}" database="${metadata.dbfile}" property="total.coverity.errors"/>
+ <echo>Coverity command '@{command}' errors: ${total.coverity.errors}</echo>
+ <condition property="is.zero.coverity.errors">
+ <equals arg1="${total.coverity.errors}" arg2="0"/>
+ </condition>
+ <hlm:generateBuildStatus file="@{errorlog}"/>
+ <hlm:signalMacro logfile="@{errorlog}" phase="post" signal.input="coveritySignalInput"/>
+ <if>
+ <available file="@{outputlog}" />
+ <then>
+ <hlm:metadatarecord database="${metadata.dbfile}">
+ <hlm:coveritymetadatainput>
+ <fileset casesensitive="false" file="@{outputlog}"/>
+ <metadatafilterset refid="filterset.coverity.output.cli"/>
+ </hlm:coveritymetadatainput>
+ </hlm:metadatarecord>
+ <hlm:metadataCountSeverity severity="ERROR" log="@{outputlog}" database="${metadata.dbfile}" property="total.coverity.output.errors"/>
+ <echo>Coverity command '@{command}' errors: ${total.coverity.output.errors}</echo>
+ <condition property="is.zero.coverity.output.errors">
+ <equals arg1="${total.coverity.output.errors}" arg2="0"/>
+ </condition>
+ <hlm:generateBuildStatus file="@{outputlog}"/>
+ <hlm:signalMacro logfile="@{outputlog}" phase="post" signal.input="coveritySignalInput"/>
+ </then>
+ </if>
+ <condition property="post.coverity.steps.enabled">
+ <and>
+ <istrue value="${is.zero.coverity.errors}"/>
+ <istrue value="${is.zero.coverity.output.errors}"/>
+ </and>
+ </condition>
+ </sequential>
+ </macrodef>
</project>
--- a/buildframework/helium/tools/compile/ec/ec.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/ec/ec.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -345,6 +345,7 @@
<echo>Building ${sysdef.configuration}....</echo>
<echo file="${temp.build.dir}/${build.id}.${sysdef.configuration}_run_emake.bat" level="info">
+set JYTHONPATH=
set
${ec.emake} --emake-build-label=${build.id}.${sysdef.configuration} --emake-class=${ec.build.class} --emake-priority=normal --emake-maxagents=${ec.maxagents} --emake-job-limit=0 --emake-mem-limit=${ec.mem.limit} --emake-history=${ec.history.option} --emake-annodetail=basic,history,file,waiting --emake-annofile=${compile.log.dir}\${build.id}.${sysdef.configuration}.emake.anno.xml --emake-historyfile=${ec.historyfile} --emake-debug=${emake_debug_flag} --emake-logfile=${compile.log.dir}\${build.id}.${sysdef.configuration}.emake.g.dlog --emake-root=%EMAKE_ROOT%;${helium.dir} --emake-autodepend=1 -k -i -f ${build.drive}/${sysdef.configuration}.make LOGBUILDTIME="" VERBOSE="" SAVESPACE="" ${sysdef.configuration}
</echo>
--- a/buildframework/helium/tools/compile/qt/antunit/test_qt.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/qt/antunit/test_qt.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -61,16 +61,17 @@
<au:assertTrue message="The output file must contain helloworldapi.pro">
<contains string="${run.qmake.out}" substring="helloworldapi.pro" />
</au:assertTrue>
- <au:assertTrue message="The output file must contain $${build.drive}/sf/app/helloworldcons/group">
- <contains string="${run.qmake.out}" substring="$${build.drive}/sf/app/helloworldcons/group" />
+ <au:assertTrue message="The output file must contain sf/app/helloworldcons/group ${run.qmake.out}">
+ <contains string="${run.qmake.out}" substring="sf/app/helloworldcons/group" />
</au:assertTrue>
- <au:assertTrue message="The output file must contain $${build.drive}/sf/mw/helloworldapi/group">
- <contains string="${run.qmake.out}" substring="$${build.drive}/sf/mw/helloworldapi/group" />
+ <au:assertTrue message="The output file must contain sf/mw/helloworldapi/group">
+ <contains string="${run.qmake.out}" substring="sf/mw/helloworldapi/group" />
</au:assertTrue>
</target>
<target name="test-sysdef151-namespaced-qt-ant">
<property name="sysdef.configuration" value="demo" />
+ <var name="sysdef3.enabled" value="false" />
<fmpp sourceFile="${helium.dir}/tools/compile/qt/templates/run-qmake.ant.xml.ftl"
outputFile="${qt.temp.dir}/run-qmake151.ant.xml">
<data expandProperties="yes">
@@ -78,6 +79,7 @@
ant: antProperties()
</data>
</fmpp>
+ <var name="sysdef3.enabled" value="true" />
<au:assertFileExists file="${qt.temp.dir}/run-qmake151.ant.xml" />
<loadfile property="run.qmake.out" srcfile="${qt.temp.dir}/run-qmake151.ant.xml" />
<au:assertTrue message="The output file must contain the -nomoc argument.">
@@ -101,6 +103,7 @@
<propertyregex property="build.drive.slash" input="${build.drive}" regexp="\\" replace="/" />
<property name="build.drive.slash" value="${build.drive}" />
<property name="sysdef.configuration" value="demo" />
+ <var name="sysdef3.enabled" value="false" />
<fmpp sourceFile="${helium.dir}/tools/compile/qt/templates/run-qmake.mk.ftl"
outputFile="${qt.temp.dir}/run-qmake151.mk">
<data expandProperties="yes">
@@ -108,6 +111,7 @@
ant: antProperties()
</data>
</fmpp>
+ <var name="sysdef3.enabled" value="true" />
<au:assertFileExists file="${qt.temp.dir}/run-qmake151.mk" />
<loadfile property="run.qmake.out" srcfile="${qt.temp.dir}/run-qmake151.mk" />
<au:assertTrue message="The output file must contain the -nomoc argument.">
@@ -119,11 +123,11 @@
<au:assertTrue message="The output file must contain helloworldapi.pro">
<contains string="${run.qmake.out}" substring="helloworldapi.pro" />
</au:assertTrue>
- <au:assertTrue message="The output file must contain -@cd ${build.drive.slash}/sf/mw/HelloWorldAPI/group && qmake -listgen -nomoc helloworldapi.pro">
- <contains string="${run.qmake.out}" substring="-@cd ${build.drive.slash}/sf/mw/HelloWorldAPI/group && qmake -listgen -nomoc helloworldapi.pro" />
+ <au:assertTrue message="The output file must contain -@cd ${build.drive.slash}/sf/mw/HelloWorldAPI/group && ${build.drive}/epoc32/tools/qmake -listgen -nomoc helloworldapi.pro, ${run.qmake.out}">
+ <contains string="${run.qmake.out}" substring="-@cd ${build.drive.slash}/sf/mw/HelloWorldAPI/group && ${build.drive}/epoc32/tools/qmake -listgen -nomoc helloworldapi.pro" />
</au:assertTrue>
- <au:assertTrue message="The output file must contain -@cd ${build.drive.slash}/sf/app/HelloWorldCons/group && qmake -listgen -r helloworld.pro">
- <contains string="${run.qmake.out}" substring="-@cd ${build.drive.slash}/sf/app/HelloWorldCons/group && qmake -listgen -r helloworld.pro" />
+ <au:assertTrue message="The output file must contain -@cd ${build.drive.slash}/sf/app/HelloWorldCons/group && ${build.drive}/epoc32/tools/qmake -listgen -r helloworld.pro">
+ <contains string="${run.qmake.out}" substring="-@cd ${build.drive.slash}/sf/app/HelloWorldCons/group && ${build.drive}/epoc32/tools/qmake -listgen -r helloworld.pro" />
</au:assertTrue>
</target>
@@ -149,11 +153,11 @@
<au:assertTrue message="The output file must contain helloworldapi.pro">
<contains string="${run.qmake.out}" substring="helloworldapi.pro" />
</au:assertTrue>
- <au:assertTrue message="The output file must contain -@cd ${build.drive.slash}/sf/mw/helloworldapi/group && qmake -listgen -nomoc helloworldapi.pro">
- <contains string="${run.qmake.out}" substring="-@cd ${build.drive.slash}/sf/mw/helloworldapi/group && qmake -listgen -nomoc helloworldapi.pro" />
+ <au:assertTrue message="The output file must contain sf/mw/helloworldapi/group && ${build.drive}/epoc32/tools/qmake -listgen -nomoc helloworldapi.pro, ${run.qmake.out}">
+ <contains string="${run.qmake.out}" substring="sf/mw/helloworldapi/group && ${build.drive}/epoc32/tools/qmake -listgen -nomoc helloworldapi.pro" />
</au:assertTrue>
- <au:assertTrue message="The output file must contain -@cd ${build.drive.slash}/sf/app/helloworldcons/group && qmake -listgen -r helloworld.pro">
- <contains string="${run.qmake.out}" substring="-@cd ${build.drive.slash}/sf/app/helloworldcons/group && qmake -listgen -r helloworld.pro" />
+ <au:assertTrue message="The output file must contain sf/app/helloworldcons/group && ${build.drive}/epoc32/tools/qmake -listgen -r helloworld.pro">
+ <contains string="${run.qmake.out}" substring="sf/app/helloworldcons/group && ${build.drive}/epoc32/tools/qmake -listgen -r helloworld.pro" />
</au:assertTrue>
</target>
</project>
\ No newline at end of file
--- a/buildframework/helium/tools/compile/qt/qt.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/qt/qt.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -60,6 +60,9 @@
<condition property="internal.qmake.enabled">
<istrue value="${qmake.enabled}"/>
</condition>
+ <condition property="iswindows" value="true" else="false">
+ <os family='windows'/>
+ </condition>
<!--
Executing qmake on all Qt components defined under the system definition file.
--- a/buildframework/helium/tools/compile/qt/templates/run-qmake.ant.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/qt/templates/run-qmake.ant.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -30,36 +30,54 @@
<#if unit.@proFile[0]??>
<#assign prefix="" />
</#if>
- <#assign bldinf="${r'$'}{build.drive}/${unit.@bldFile}"?replace('\\', '/')?replace('//', '/')>
+ <#if ant['iswindows'] == "false" && ant['sysdef3.enabled'] == "true">
+ <#assign bldinf="${unit.@bldFile}"?replace('\\', '/')?replace('//', '/')>
+ <#else>
+ <#assign bldinf="${r'$'}{build.drive}/${unit.@bldFile}"?replace('\\', '/')?replace('//', '/')>
+ </#if>
<sequential>
<echo>Running qmake for ${bldinf}/${unit['@${prefix}proFile'][0]?xml}</echo>
<if>
- <available file="${bldinf}" type="dir"/>
+ <os family='windows'/>
<then>
- <exec executable="cmd" osfamily="windows" dir="${bldinf}" failonerror="false">
- <arg value="/C"/>
- <arg value="qmake"/>
- <arg value="-listgen"/>
- <#if unit['@${prefix}qmakeArgs'][0]??>
- <arg line="${unit['@${prefix}qmakeArgs'][0]?xml}"/>
- <#else>
- <arg line="${ant['qt.qmake.default.args']?xml}"/>
- </#if>
- <arg value="${unit['@${prefix}proFile'][0]?xml}"/>
- </exec>
- <exec osfamily="unix" executable="sh" dir="${bldinf}" failonerror="false">
- <arg value="${(ant['epocroot'] + "/")?replace('//', '/')}epoc32/tools/qmake"/>
- <arg value="-listgen"/>
- <#if unit['@${prefix}qmakeArgs'][0]??>
- <arg line="${unit['@${prefix}qmakeArgs'][0]?xml}"/>
- <#else>
- <arg line="${ant['qt.qmake.default.args']?xml}"/>
- </#if>
- <arg value="${unit['@${prefix}proFile'][0]?xml}"/>
- </exec>
+ <if>
+ <available file="${bldinf}" type="dir"/>
+ <then>
+ <exec executable="cmd" dir="${bldinf}" failonerror="false">
+ <arg value="/C"/>
+ <arg value="qmake"/>
+ <arg value="-listgen"/>
+ <#if unit['@${prefix}qmakeArgs'][0]??>
+ <arg line="${unit['@${prefix}qmakeArgs'][0]?xml}"/>
+ <#else>
+ <arg line="${ant['qt.qmake.default.args']?xml}"/>
+ </#if>
+ <arg value="${unit['@${prefix}proFile'][0]?xml}"/>
+ </exec>
+ </then>
+ <else>
+ <echo message="ERROR: Directory ${bldinf} doesn't exist."/>
+ </else>
+ </if>
</then>
<else>
- <echo message="ERROR: Directory ${bldinf} doesn't exist."/>
+ <if>
+ <available file="${bldinf}" type="dir"/>
+ <then>
+ <exec executable="${ant['build.drive']}/epoc32/tools/qmake" dir="${bldinf}" failonerror="false">
+ <arg value="-listgen"/>
+ <#if unit['@${prefix}qmakeArgs'][0]??>
+ <arg line="${unit['@${prefix}qmakeArgs'][0]?xml}"/>
+ <#else>
+ <arg line="${ant['qt.qmake.default.args']?xml}"/>
+ </#if>
+ <arg value="${unit['@${prefix}proFile'][0]?xml}"/>
+ </exec>
+ </then>
+ <else>
+ <echo message="ERROR: Directory ${bldinf} doesn't exist."/>
+ </else>
+ </if>
</else>
</if>
</sequential>
--- a/buildframework/helium/tools/compile/qt/templates/run-qmake.mk.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/qt/templates/run-qmake.mk.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -31,12 +31,16 @@
<#if unit.@proFile[0]??>
<#assign prefix="" />
</#if>
- <#assign bldinf="${ant['build.drive']}/${unit.@bldFile}"?replace('\\', '/')?replace('//', '/')>
+ <#if ant['iswindows'] == "false" && ant['sysdef3.enabled'] == "true">
+ <#assign bldinf="${unit.@bldFile}"?replace('\\', '/')?replace('//', '/')>
+ <#else>
+ <#assign bldinf="${ant['build.drive']}/${unit.@bldFile}"?replace('\\', '/')?replace('//', '/')>
+ </#if>
##########################################################################
${bldinf}/bld.inf: ${bldinf}/${unit['@${prefix}proFile'][0]}
- @echo cd ${bldinf} ^&^& qmake -listgen <#if unit['@${prefix}qmakeArgs'][0]??>${unit['@${prefix}qmakeArgs'][0]}<#else>${ant['qt.qmake.default.args']}</#if><#if "${ant['build.system']?lower_case}" = 'sbs-ec'> -spec symbian-sbsv2</#if> ${unit['@${prefix}proFile'][0]}
- -@cd ${bldinf} && qmake -listgen <#if unit['@${prefix}qmakeArgs'][0]??>${unit['@${prefix}qmakeArgs'][0]}<#else>${ant['qt.qmake.default.args']}</#if> ${unit['@${prefix}proFile'][0]}
+ @echo "cd ${bldinf} && ${ant['build.drive']}/epoc32/tools/qmake -listgen <#if unit['@${prefix}qmakeArgs'][0]??>${unit['@${prefix}qmakeArgs'][0]}<#else>${ant['qt.qmake.default.args']}</#if><#if "${ant['build.system']?lower_case}" = 'sbs-ec'> -spec symbian-sbsv2</#if> ${unit['@${prefix}proFile'][0]}"
+ -@cd ${bldinf} && ${ant['build.drive']}/epoc32/tools/qmake -listgen <#if unit['@${prefix}qmakeArgs'][0]??>${unit['@${prefix}qmakeArgs'][0]}<#else>${ant['qt.qmake.default.args']}</#if> ${unit['@${prefix}proFile'][0]}
all:: ${bldinf}/bld.inf
--- a/buildframework/helium/tools/compile/sbs/sbs.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/compile/sbs/sbs.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -212,7 +212,7 @@
<if>
<or>
<istrue value="${coverity.enabled}" />
- <isset property="enabled.coverity"/>
+ <istrue value="${enabled.coverity}"/>
</or>
<then>
<hlm:coveritybuild sbsinput="@{sbs.input}"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/templates/coverity.summary.html.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,79 @@
+<#--
+============================================================================
+Name : coverity.summary.html.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
+ <title>
+ Coverity tool summary information.
+ </title>
+ <style type="text/css">
+ body{font-family:Verdana; font-size:8pt; line-height:1.1em; padding: 10px 10px; background-color:#F8F8F2;}
+ h1{
+ font-size:14pt;
+ color:#000;
+ padding: 20px 15px;
+ margin:0;
+ }
+ h2 {
+ font-size:10pt;
+ margin: 1em 0;
+ }
+ h5{
+ font-size:10pt;
+ text-align:center;
+ background-color:#4682B4;
+ color:"black";
+ heigth:20pt;
+ padding: 5px 15px;
+
+ }
+ .data{color:#00F;font-family:Verdana; font-size:10pt;color:"black";}
+ span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+ span.bold{font-weight:bold; display:block; padding: 1em 0;}
+ p.maintext{padding-top: 1em;}
+ p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+ p.distrib{font-weight:bold;}
+
+
+ a:link,a:visited{color:#00E;}
+
+ </style>
+ </head>
+ <body>
+ <div id="coveritysummary">
+ <h5>Coverity Summary</h5>
+ <#assign htmlString = covsummary?replace("["," ")>
+ <#assign htmlString = htmlString?replace("]"," ")>
+ <#list htmlString?split(",") as line>
+ <#if line?starts_with(" ")>
+ ${line}<br />
+ <#elseif !line?contains("cov-analyze")>
+ ${line}<br />
+ </#if>
+ </#list>
+ </div>
+ </br>
+ </body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/compile/templates/coverity.summary.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,36 @@
+<#--
+============================================================================
+Name : coverity.summary.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<coverity>
+ <#assign htmlString = covsummary?replace("["," ")>
+ <#assign htmlString = htmlString?replace("]"," ")>
+ <#list htmlString?split(",") as line>
+ <#if !line?contains("cov-analyze") && !line?starts_with("---") && !line?contains("summary") && !line?contains("defects") >
+ <#assign words = line?split(":")>
+ <#if words[1]??>
+ <#assign firstword=words[0]?trim secondword=words[1]?trim>
+<summary message="${firstword}" value="${secondword}"/>
+ </#if>
+ </#if>
+ </#list>
+</coverity>
+
--- a/buildframework/helium/tools/logging/logging.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/logging/logging.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -288,7 +288,7 @@
</hlm:metadatarecord>
<!-- todo: check to add for usage and add genbuildstatus macro -->
<basename property="log.name" file="@{log}"/>
- <fmpp sourceFile="${helium.dir}/tools/common/templates/db2xml.xml.ftl"
+ <fmpp sourceFile="${helium.dir}/tools/logging/templates/db2xml.xml.ftl"
outputfile="@{log}.xml">
<data expandProperties="yes">
dbPath: ${metadata.dbfile}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/logging/templates/db2xml.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,32 @@
+<#--
+============================================================================
+Name : db2xml.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#assign table_info = pp.loadData('com.nokia.helium.metadata.SQLFMPPLoader', "${dbPath}") >
+<?xml version="1.0" encoding="utf-8"?>
+<log filename="${log}">
+<build>
+
+<#list table_info['select * from metadata INNER JOIN logfiles ON logfiles.id=metadata.logfile_id INNER JOIN severity ON severity.id=metadata.severity_id where severity=\'ERROR\' and path like \'${r\'%\'}${log}\''] as recordentry >
+<message severity="error"><![CDATA[${recordentry['data']}]]></message>
+</#list>
+
+</build>
+</log>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/logging/templates/logging.conf.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,58 @@
+<#--
+============================================================================
+Name : logging.conf.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+[formatters]
+keys: simple,detailed
+
+[handlers]
+keys: console,syslog
+
+[loggers]
+keys: root,dp
+
+[formatter_simple]
+format: %(levelname)s:%(name)s:%(message)s
+
+[formatter_detailed]
+format: %(levelname)s:%(name)s: %(module)s:%(lineno)d: %(message)s
+
+[handler_console]
+class: StreamHandler
+args: []
+formatter: simple
+
+[handler_syslog]
+class: handlers.SysLogHandler
+args: [('myhost.mycorp.net', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER]
+formatter: detailed
+
+[logger_root]
+level: INFO
+handlers: syslog
+
+[logger_dp]
+<#if ant?keys?seq_contains("dp.debug") || ant?keys?seq_contains("debug")>
+level: DEBUG
+<#else>
+level: INFO
+</#if>
+handlers: console
+qualname: dp
\ No newline at end of file
--- a/buildframework/helium/tools/preparation/bom/bom.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/preparation/bom/bom.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -63,71 +63,68 @@
import traceback
session = None
-try:
- runccm = ant.get_property(r'${ccm.enabled}')
- database = ant.get_property(r'${ccm.database}')
- username = ant.get_property(r'${ccm.user.login}')
- password = ant.get_property(r'${ccm.user.password}')
- engine = ant.get_property(r'${ccm.engine.host}')
- dbpath = ant.get_property(r'${ccm.database.path}')
- waroot = ant.get_property(r'${create.bom.workarea.root}')
- buildid = ant.get_property(r'${build.id}')
- buildlogdir = ant.get_property(r'${build.log.dir}')
- deliveryfile = ant.get_property(r'${prep.delivery.conf.parsed}')
- oldbom = ant.get_property(r'${old.bom.log}')
- bom = None
- bomfilename = r"%s/%s_bom.xml" % (buildlogdir, buildid)
- if runccm and deliveryfile:
- cache = None
- if ant.get_property(r'${ccm.cache.xml}') is not None:
- cache = str(ant.get_property(r'${ccm.cache.xml}'))
- provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
-
- configBuilder = configuration.NestedConfigurationBuilder(open(deliveryfile, 'r'))
- configSet = configBuilder.getConfiguration()
- for config in configSet.getConfigurations():
- waroot = config['dir']
- print "Found wa for project %s" % waroot
-
- if database != None:
- session = provider.get(username, password, database=database)
- else:
- session = provider.get(username, password, engine, dbpath)
-
- ccmproject = ccm.extra.get_toplevel_project(session, waroot)
+
+runccm = ant.get_property(r'${ccm.enabled}')
+database = ant.get_property(r'${ccm.database}')
+username = ant.get_property(r'${ccm.user.login}')
+password = ant.get_property(r'${ccm.user.password}')
+engine = ant.get_property(r'${ccm.engine.host}')
+dbpath = ant.get_property(r'${ccm.database.path}')
+waroot = ant.get_property(r'${create.bom.workarea.root}')
+buildid = ant.get_property(r'${build.id}')
+buildlogdir = ant.get_property(r'${build.log.dir}')
+deliveryfile = ant.get_property(r'${prep.delivery.conf.parsed}')
+oldbom = ant.get_property(r'${old.bom.log}')
+bom = None
+bomfilename = r"%s/%s_bom.xml" % (buildlogdir, buildid)
+if deliveryfile and runccm == 'true':
+ cache = None
+ if ant.get_property(r'${ccm.cache.xml}') is not None:
+ cache = str(ant.get_property(r'${ccm.cache.xml}'))
+ provider = ccm.extra.CachedSessionProvider(opener=nokia.nokiaccm.open_session, cache=cache)
+
+ configBuilder = configuration.NestedConfigurationBuilder(open(deliveryfile, 'r'))
+ configSet = configBuilder.getConfiguration()
+ for config in configSet.getConfigurations():
+ waroot = config['dir']
+ print "Found wa for project %s" % waroot
+
+ if database != None:
+ session = provider.get(username, password, database=database)
+ else:
+ session = provider.get(username, password, engine, dbpath)
- config_data = {'delivery': deliveryfile, 'prep.xml': ant.get_property(r'${prep.config.file.parsed}'), 'build.id': buildid, 'ccm.database': database, 'symbian_rel_week': ant.get_property(r'${symbian.version.week}'), 'symbian_rel_ver': ant.get_property(r'${symbian.version}'), 'symbian_rel_year': ant.get_property(r'${symbian.version.year}'), 's60_version': ant.get_property(r'${s60.version}'), 's60_release': ant.get_property(r'${s60.release}'), 'currentRelease.xml': ant.get_property(r'${build.drive}') + "/currentRelease.xml", 'release_regexp': ant.get_property(r'${bom.release.regex}') }
- config = configuration.Configuration(config_data)
-
- # let's only support the new spec model!
- bom = build.model.SynergyBOM(config, ccmproject, username=username, password=password, provider=provider)
-
- xml_writer = build.model.BOMXMLWriter(bom)
- xml_writer.write(bomfilename)
- if not bom and os.path.exists(bomfilename):
- config_data = {'prep.xml': ant.get_property(r'${prep.config.file.parsed}'), 'build.id': buildid, 'symbian_rel_week': ant.get_property(r'${symbian.version.week}'), 'symbian_rel_ver': ant.get_property(r'${symbian.version}'), 'symbian_rel_year': ant.get_property(r'${symbian.version.year}'), 's60_version': ant.get_property(r'${s60.version}'), 's60_release': ant.get_property(r'${s60.release}'), 'currentRelease.xml': ant.get_property(r'${build.drive}') + "/currentRelease.xml"}
- config = configuration.Configuration(config_data)
- bom = build.model.SimpleBOM(config, bomfilename)
- if os.path.exists(oldbom):
- xml_delta_writer = build.model.BOMDeltaXMLWriter(bom, oldbom)
- xml_delta_writer.write(buildlogdir + "/" + buildid + "_bom_delta.xml")
- delta_bom_content_validity = xml_delta_writer.validate_delta_bom_contents(buildlogdir + "/" + buildid + "_bom_delta.xml", bomfilename, oldbom)
- if((delta_bom_content_validity == False) and (ant.get_property(r'${hlm.enable.asserts}') is not None)):
- print 'Bom delta contents are not matching'
- raise Exception
- elif((delta_bom_content_validity == True) or (delta_bom_content_validity == None)):
- print 'Bom delta contents are matching.'
- elif(delta_bom_content_validity == False):
- print 'Bom delta contents are not matching.'
- else:
- print 'Old BOM log cannot be found ' + oldbom + ', skipping BOM delta creation.'
- if runccm:
- bom.close()
- if session:
- session.close()
-except Exception, ex:
- print 'Caught exception in BOM: ' + str(ex)
- traceback.print_exc()
+ ccmproject = ccm.extra.get_toplevel_project(session, waroot)
+
+ config_data = {'delivery': deliveryfile, 'prep.xml': ant.get_property(r'${prep.config.file.parsed}'), 'build.id': buildid, 'ccm.database': database, 'symbian_rel_week': ant.get_property(r'${symbian.version.week}'), 'symbian_rel_ver': ant.get_property(r'${symbian.version}'), 'symbian_rel_year': ant.get_property(r'${symbian.version.year}'), 's60_version': ant.get_property(r'${s60.version}'), 's60_release': ant.get_property(r'${s60.release}'), 'currentRelease.xml': ant.get_property(r'${build.drive}') + "/currentRelease.xml", 'release_regexp': ant.get_property(r'${bom.release.regex}') }
+ config = configuration.Configuration(config_data)
+
+ # let's only support the new spec model!
+ bom = build.model.SynergyBOM(config, ccmproject, username=username, password=password, provider=provider)
+
+ xml_writer = build.model.BOMXMLWriter(bom)
+ xml_writer.write(bomfilename)
+if not bom and os.path.exists(bomfilename):
+ config_data = {'prep.xml': ant.get_property(r'${prep.config.file.parsed}'), 'build.id': buildid, 'symbian_rel_week': ant.get_property(r'${symbian.version.week}'), 'symbian_rel_ver': ant.get_property(r'${symbian.version}'), 'symbian_rel_year': ant.get_property(r'${symbian.version.year}'), 's60_version': ant.get_property(r'${s60.version}'), 's60_release': ant.get_property(r'${s60.release}'), 'currentRelease.xml': ant.get_property(r'${build.drive}') + "/currentRelease.xml"}
+ config = configuration.Configuration(config_data)
+ bom = build.model.SimpleBOM(config, bomfilename)
+if bom and os.path.exists(oldbom):
+ xml_delta_writer = build.model.BOMDeltaXMLWriter(bom, oldbom)
+ xml_delta_writer.write(buildlogdir + "/" + buildid + "_bom_delta.xml")
+ delta_bom_content_validity = xml_delta_writer.validate_delta_bom_contents(buildlogdir + "/" + buildid + "_bom_delta.xml", bomfilename, oldbom)
+ if((delta_bom_content_validity == False) and (ant.get_property(r'${hlm.enable.asserts}') is not None)):
+ print 'Bom delta contents are not matching'
+ raise Exception
+ elif((delta_bom_content_validity == True) or (delta_bom_content_validity == None)):
+ print 'Bom delta contents are matching.'
+ elif(delta_bom_content_validity == False):
+ print 'Bom delta contents are not matching.'
+else:
+ print 'Old BOM log cannot be found ' + oldbom + ', skipping BOM delta creation.'
+if runccm == 'true':
+ bom.close()
+if session:
+ session.close()
</hlm:python>
<if>
<available file="${build.log.dir}/${build.id}_bom.xml"/>
@@ -136,7 +133,7 @@
<xmltask source="${build.log.dir}/${build.id}_bom.xml" dest="${build.log.dir}/${build.id}_bom.xml" outputter="simple">
<replace path="//bom/build/text()" withText="${build.id}"/>
</xmltask>
- <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
+ <fmpp sourceRoot="${helium.dir}/tools/preparation/bom/templates"
outputRoot="${prep.log.dir}" includes="bom.html.*,bom.txt.*" removeExtensions="ftl">
<freemarkerLinks expandProperties="yes">
macro: ${helium.dir}/tools/common/templates/macro
@@ -189,10 +186,13 @@
</if>
<if>
- <available file="${old.bom.log}"/>
+ <and>
+ <available file="${old.bom.log}"/>
+ <available file="${build.log.dir}/${build.id}_bom_delta.xml"/>
+ </and>
<then>
<hlm:assertFileExists file="${build.log.dir}/${build.id}_bom_delta.xml"/>
- <fmpp sourceRoot="${helium.dir}/tools/preparation/bom"
+ <fmpp sourceRoot="${helium.dir}/tools/preparation/bom/templates"
outputRoot="${prep.log.dir}" includes="bom_delta.*" removeExtensions="ftl">
<freemarkerLinks expandProperties="yes">
macro: ${helium.dir}/tools/common/templates/macro
@@ -287,7 +287,7 @@
<if>
<isset property="email.ldap.server"/>
<then>
- <hlm:ldap url="${email.ldap.server}" rootdn="${email.ldap.rootdn}" filter="uid=${task.owner}" outputproperty="task.owner.email" key="mail"/>
+ <hlm:ldap url="${email.ldap.server}" rootdn="${email.ldap.rootdn}" filter="uid=${task.owner}" outputproperty="task.owner.email" key="mail" failonerror="false"/>
<if>
<isset property="task.owners.email"/>
<then>
--- a/buildframework/helium/tools/preparation/bom/bom.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,104 +0,0 @@
-<#--
-============================================================================
-Name : bom.html.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
- <#include "/@macro/logger/logger.ftl" />
- <head>
- <title>Bill of Materials</title>
- <@helium_logger_html_head/>
- </head>
- <body>
-
-
-<#macro printtype project title type>
- <#assign helium_node_id = helium_node_id + 1>
- <@helium_logger_node_head nodeid="${helium_node_id}" title="${title}">
- <@helium_message_box nodeid="${helium_node_id}" type="${type}" count=project?size/>
- </@helium_logger_node_head>
- <@helium_logger_node_content nodeid="${helium_node_id}">
- <#list project as node>
- <@helium_logger_print type="${type}">
- ${node}
- </@helium_logger_print>
- </#list>
- </@helium_logger_node_content>
-</#macro>
-
-<#macro printTasks project>
- <#list project.task as node>
- <@helium_logger_print type="task">
- ${node.id}:${node.synopsis}
- </@helium_logger_print>
- </#list>
-</#macro>
-
-<#macro printTasksAndFolders project title>
- <#assign helium_node_id = helium_node_id + 1>
- <@helium_logger_node_head nodeid="${helium_node_id}" title="${title}">
- <@helium_message_box nodeid="${helium_node_id}" type="task" count=project["count(//task)"]/>
- </@helium_logger_node_head>
- <@helium_logger_node_content nodeid="${helium_node_id}">
- <@printTasks project=project/>
- <#list project.folder as node>
- <#assign helium_node_id = helium_node_id + 1>
- <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.name}">
- <@helium_message_box nodeid="${helium_node_id}" type="task" count=project.task?size/>
- </@helium_logger_node_head>
- <@helium_logger_node_content nodeid="${helium_node_id}">
- <@printTasks project=node/>
- </@helium_logger_node_content>
- </#list>
- </@helium_logger_node_content>
-</#macro>
-
-<#macro printproject project>
- <#assign helium_node_id = helium_node_id + 1>
- <@helium_logger_node_head nodeid="${helium_node_id}" title="${project.name}">
- <@helium_message_box nodeid="${helium_node_id}" type="baseline" count=project.baseline?size/>
- <@helium_message_box nodeid="${helium_node_id}" type="task" count=project["count(//task)"]/>
- <@helium_message_box nodeid="${helium_node_id}" type="fix" count=project.fix?size/>
- </@helium_logger_node_head>
- <@helium_logger_node_content nodeid="${helium_node_id}">
- <@printtype project=project.baseline title="Baselines" type="baseline"/>
- <@printTasksAndFolders project=project title="Tasks"/>
- <@printtype project=project.fix title="Fix" type="fix"/>
- </@helium_logger_node_content>
-</#macro>
-
-
-
- <@helium_logger_header title="${doc.bom.build} build"/>
-
- <@helium_logger_content title="Baseline and Task details">
- <#list doc.bom.content.project as project>
- <@printproject project=project />
- </#list>
- </@helium_logger_content>
-
- <@helium_logger_content title="ICDs / ICFs">
- <@printtype project=doc.bom.content.input.icds.icd.name title="ICDs / ICFs" type="icd"/>
- </@helium_logger_content>
-
- </body>
-</html>
-
--- a/buildframework/helium/tools/preparation/bom/bom.txt.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-<#--
-============================================================================
-Name : bom.txt.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-Bill Of Materials
-=================
-
-Build: ${doc.bom.build}
-
-<#list doc.bom.content.project as project>
-
-Project
--------
-
-${project.name}
-
-Baselines
-`````````
-<#list project.baseline as baseline>
-${baseline}
-</#list>
-
-Tasks
-`````
-<#list project.task as task>
-${task.id}
-${task.synopsis}
-</#list>
-<#list project.folder as folder>
-<#list folder.task as task>
-${task.id}
-${task.synopsis}
-</#list>
-</#list>
-
-Folders
-```````
-<#list project.folder as folder>
-<#list folder.name as name>
-${name}
-</#list>
-</#list>
-</#list>
-
-Symbian ICD/ICFs
-----------------
-
-<#list doc.bom.content.input.icds.icd as icd>
-${icd.name}
-</#list>
-
--- a/buildframework/helium/tools/preparation/bom/bom_delta.html.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-<#--
-============================================================================
-Name : bom_delta.html.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-<#assign delta = doc.bomDelta>
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
- "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>BOM delta for ${delta.buildTo}</title>
-
- <link rel ="stylesheet" type="text/css" href="stylesheet.css" title="style"/>
- <style type="text/css">
- body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
- h1{
- font-size:14pt;
- background-color:#3366ff;
- color:#000;
- margin:0;
- color:#fff;
- heigth:20pt;
- padding: 5px 15px;
- text-align: center
- border-left:2px solid #5A6FA0;
- border-bottom:2px solid #5A6FA0;
- border-top:2px solid #98A6C6;
- border-right:2px solid #98A6C6;
-
-
- }
- h2{font-size:12pt;}
- h3{
- font-size:14pt;
- color:#00f;
- padding: 20px 15px;
- margin:0;
- }
- h5{
- font-size:10pt;
- background-color:#8495BA;
- color:#fff;
- heigth:20pt;
- padding: 5px 15px;
- border-left:2px solid #5A6FA0;
- border-bottom:2px solid #5A6FA0;
- border-top:2px solid #98A6C6;
- border-right:2px solid #98A6C6;
- margin:0;
- }
-
-
- p {
- font-size:10pt;
- padding: 0em 1em 1em 1em;
- margin: 0 1em 0.5em 1em;
- border-right:1px solid #5A6FA0;
- border-top:0;
- border-bottom:1px solid #98A6C6;
- border-left:1px solid #98A6C6;
- background-color:#CDE4EB;
- white-space:normal;
- }
-
- .data{color:#00F;}
- .added{color:#24A22D;font-weight:normal; display:block; margin-bottom: 0em;padding-top: 0em;}
- .deleted{color:#F00;font-weight:normal; display:block; margin-bottom: 0em;padding-top: 0em;}
-
- span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
-
- span.bold{font-weight:bold; display:block; padding: 1em 0;}
- p.maintext{padding-top: 1em;}
- p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
- p.distrib{font-weight:bold;}
-
- a:link,a:visited{color:#00E;}
- </style>
- </head>
- <body>
- <h1>BOM delta for ${delta.buildTo}</h1>
- <div id="buildname">
- <h3>Build from ${delta.buildFrom} to ${delta.buildTo} </h3>
- </div>
-
- <div id="foldername">
- <h5>Task added </h5>
- <p class="maintext">
- <span class="data">
- <#list delta.content.task as tasks>
- <#if tasks.@status == "added">
- <span class="added"> ${tasks}</span>
- </#if>
- </#list>
- </span>
- </p>
- </div>
- <div id="foldername">
- <h5>Task removed</h5>
- <p class="logfolder">
- <#list delta.content.task as tasks>
- <#if tasks.@status == "deleted">
- <span class="deleted"> ${tasks}</span>
- </#if>
- </#list>
- </p>
- </div>
- <div id="foldername">
- <h5>Baseline added</h5>
- <p class="maintext">
- <#list delta.content.baseline as baselines>
- <#if baselines.@status == "added">
- <span class="added">${baselines}</span>
- </#if>
- </#list>
- </p>
- </div>
- <div id="foldername">
- <h5>Baseline removed</h5>
- <p class="logfolder">
- <#list delta.content.baseline as baselines>
- <#if baselines.@status == "deleted">
- <span class="deleted"> ${baselines}</span>
- </#if>
- </#list>
- </div>
-
- </body>
-</html>
-
-
--- a/buildframework/helium/tools/preparation/bom/bom_delta.txt.ftl Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-<#--
-============================================================================
-Name : bom_delta.txt.ftl
-Part of : Helium
-
-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 the License "Eclipse Public License v1.0"
-which accompanies this distribution, and is available
-at the URL "http://www.eclipse.org/legal/epl-v10.html".
-
-Initial Contributors:
-Nokia Corporation - initial contribution.
-
-Contributors:
-
-Description:
-
-============================================================================
--->
-Bill Of Materials
-=================
-
-Build from: ${doc.bomDelta.buildFrom}
-Build to: ${doc.bomDelta.buildTo}
-
-
-Baselines
----------
-<#list doc.bomDelta.content.baseline as baseline>
-<#if baseline.@status == "added">
-+ ${baseline}
-</#if>
-<#if baseline.@status == "deleted">
-- ${baseline}
-</#if>
-</#list>
-
-Tasks
------
-<#list doc.bomDelta.content.task as task>
-<#if task.@status == "added">
-+ ${task}
-</#if>
-<#if task.@status == "deleted">
-- ${task}
-</#if>
-</#list>
-
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/templates/bom.html.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,104 @@
+<#--
+============================================================================
+Name : bom.html.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+ <#include "/@macro/logger/logger.ftl" />
+ <head>
+ <title>Bill of Materials</title>
+ <@helium_logger_html_head/>
+ </head>
+ <body>
+
+
+<#macro printtype project title type>
+ <#assign helium_node_id = helium_node_id + 1>
+ <@helium_logger_node_head nodeid="${helium_node_id}" title="${title}">
+ <@helium_message_box nodeid="${helium_node_id}" type="${type}" count=project?size/>
+ </@helium_logger_node_head>
+ <@helium_logger_node_content nodeid="${helium_node_id}">
+ <#list project as node>
+ <@helium_logger_print type="${type}">
+ ${node}
+ </@helium_logger_print>
+ </#list>
+ </@helium_logger_node_content>
+</#macro>
+
+<#macro printTasks project>
+ <#list project.task as node>
+ <@helium_logger_print type="task">
+ ${node.id}:${node.synopsis}
+ </@helium_logger_print>
+ </#list>
+</#macro>
+
+<#macro printTasksAndFolders project title>
+ <#assign helium_node_id = helium_node_id + 1>
+ <@helium_logger_node_head nodeid="${helium_node_id}" title="${title}">
+ <@helium_message_box nodeid="${helium_node_id}" type="task" count=project["count(//task)"]/>
+ </@helium_logger_node_head>
+ <@helium_logger_node_content nodeid="${helium_node_id}">
+ <@printTasks project=project/>
+ <#list project.folder as node>
+ <#assign helium_node_id = helium_node_id + 1>
+ <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.name}">
+ <@helium_message_box nodeid="${helium_node_id}" type="task" count=project.task?size/>
+ </@helium_logger_node_head>
+ <@helium_logger_node_content nodeid="${helium_node_id}">
+ <@printTasks project=node/>
+ </@helium_logger_node_content>
+ </#list>
+ </@helium_logger_node_content>
+</#macro>
+
+<#macro printproject project>
+ <#assign helium_node_id = helium_node_id + 1>
+ <@helium_logger_node_head nodeid="${helium_node_id}" title="${project.name}">
+ <@helium_message_box nodeid="${helium_node_id}" type="baseline" count=project.baseline?size/>
+ <@helium_message_box nodeid="${helium_node_id}" type="task" count=project["count(//task)"]/>
+ <@helium_message_box nodeid="${helium_node_id}" type="fix" count=project.fix?size/>
+ </@helium_logger_node_head>
+ <@helium_logger_node_content nodeid="${helium_node_id}">
+ <@printtype project=project.baseline title="Baselines" type="baseline"/>
+ <@printTasksAndFolders project=project title="Tasks"/>
+ <@printtype project=project.fix title="Fix" type="fix"/>
+ </@helium_logger_node_content>
+</#macro>
+
+
+
+ <@helium_logger_header title="${doc.bom.build} build"/>
+
+ <@helium_logger_content title="Baseline and Task details">
+ <#list doc.bom.content.project as project>
+ <@printproject project=project />
+ </#list>
+ </@helium_logger_content>
+
+ <@helium_logger_content title="ICDs / ICFs">
+ <@printtype project=doc.bom.content.input.icds.icd.name title="ICDs / ICFs" type="icd"/>
+ </@helium_logger_content>
+
+ </body>
+</html>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/templates/bom.txt.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,68 @@
+<#--
+============================================================================
+Name : bom.txt.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+Bill Of Materials
+=================
+
+Build: ${doc.bom.build}
+
+<#list doc.bom.content.project as project>
+
+Project
+-------
+
+${project.name}
+
+Baselines
+`````````
+<#list project.baseline as baseline>
+${baseline}
+</#list>
+
+Tasks
+`````
+<#list project.task as task>
+${task.id}
+${task.synopsis}
+</#list>
+<#list project.folder as folder>
+<#list folder.task as task>
+${task.id}
+${task.synopsis}
+</#list>
+</#list>
+
+Folders
+```````
+<#list project.folder as folder>
+<#list folder.name as name>
+${name}
+</#list>
+</#list>
+</#list>
+
+Symbian ICD/ICFs
+----------------
+
+<#list doc.bom.content.input.icds.icd as icd>
+${icd.name}
+</#list>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/templates/bom_delta.html.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,147 @@
+<#--
+============================================================================
+Name : bom_delta.html.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#assign delta = doc.bomDelta>
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE HTML PUBLIC "-//w3c//dtd xhtml 1.0 strict//en"
+ "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>BOM delta for ${delta.buildTo}</title>
+
+ <link rel ="stylesheet" type="text/css" href="stylesheet.css" title="style"/>
+ <style type="text/css">
+ body{font-family:Verdana; font-size:10pt; line-height:1.1em; padding: 10px 10px; background-color:#E4F0F4;}
+ h1{
+ font-size:14pt;
+ background-color:#3366ff;
+ color:#000;
+ margin:0;
+ color:#fff;
+ heigth:20pt;
+ padding: 5px 15px;
+ text-align: center
+ border-left:2px solid #5A6FA0;
+ border-bottom:2px solid #5A6FA0;
+ border-top:2px solid #98A6C6;
+ border-right:2px solid #98A6C6;
+
+
+ }
+ h2{font-size:12pt;}
+ h3{
+ font-size:14pt;
+ color:#00f;
+ padding: 20px 15px;
+ margin:0;
+ }
+ h5{
+ font-size:10pt;
+ background-color:#8495BA;
+ color:#fff;
+ heigth:20pt;
+ padding: 5px 15px;
+ border-left:2px solid #5A6FA0;
+ border-bottom:2px solid #5A6FA0;
+ border-top:2px solid #98A6C6;
+ border-right:2px solid #98A6C6;
+ margin:0;
+ }
+
+
+ p {
+ font-size:10pt;
+ padding: 0em 1em 1em 1em;
+ margin: 0 1em 0.5em 1em;
+ border-right:1px solid #5A6FA0;
+ border-top:0;
+ border-bottom:1px solid #98A6C6;
+ border-left:1px solid #98A6C6;
+ background-color:#CDE4EB;
+ white-space:normal;
+ }
+
+ .data{color:#00F;}
+ .added{color:#24A22D;font-weight:normal; display:block; margin-bottom: 0em;padding-top: 0em;}
+ .deleted{color:#F00;font-weight:normal; display:block; margin-bottom: 0em;padding-top: 0em;}
+
+ span.items{text-indent:-1em; padding-left: 1em; display:block; word-wrap:normal;}
+
+ span.bold{font-weight:bold; display:block; padding: 1em 0;}
+ p.maintext{padding-top: 1em;}
+ p.logfolder{color:#000;font-weight:bold; padding-top: 1em;}
+ p.distrib{font-weight:bold;}
+
+ a:link,a:visited{color:#00E;}
+ </style>
+ </head>
+ <body>
+ <h1>BOM delta for ${delta.buildTo}</h1>
+ <div id="buildname">
+ <h3>Build from ${delta.buildFrom} to ${delta.buildTo} </h3>
+ </div>
+
+ <div id="foldername">
+ <h5>Task added </h5>
+ <p class="maintext">
+ <span class="data">
+ <#list delta.content.task as tasks>
+ <#if tasks.@status == "added">
+ <span class="added"> ${tasks}</span>
+ </#if>
+ </#list>
+ </span>
+ </p>
+ </div>
+ <div id="foldername">
+ <h5>Task removed</h5>
+ <p class="logfolder">
+ <#list delta.content.task as tasks>
+ <#if tasks.@status == "deleted">
+ <span class="deleted"> ${tasks}</span>
+ </#if>
+ </#list>
+ </p>
+ </div>
+ <div id="foldername">
+ <h5>Baseline added</h5>
+ <p class="maintext">
+ <#list delta.content.baseline as baselines>
+ <#if baselines.@status == "added">
+ <span class="added">${baselines}</span>
+ </#if>
+ </#list>
+ </p>
+ </div>
+ <div id="foldername">
+ <h5>Baseline removed</h5>
+ <p class="logfolder">
+ <#list delta.content.baseline as baselines>
+ <#if baselines.@status == "deleted">
+ <span class="deleted"> ${baselines}</span>
+ </#if>
+ </#list>
+ </div>
+
+ </body>
+</html>
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/bom/templates/bom_delta.txt.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,50 @@
+<#--
+============================================================================
+Name : bom_delta.txt.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+Bill Of Materials
+=================
+
+Build from: ${doc.bomDelta.buildFrom}
+Build to: ${doc.bomDelta.buildTo}
+
+
+Baselines
+---------
+<#list doc.bomDelta.content.baseline as baseline>
+<#if baseline.@status == "added">
++ ${baseline}
+</#if>
+<#if baseline.@status == "deleted">
+- ${baseline}
+</#if>
+</#list>
+
+Tasks
+-----
+<#list doc.bomDelta.content.task as task>
+<#if task.@status == "added">
++ ${task}
+</#if>
+<#if task.@status == "deleted">
+- ${task}
+</#if>
+</#list>
+
--- a/buildframework/helium/tools/preparation/ci.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/preparation/ci.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -73,8 +73,6 @@
try:
self.log(str("Removing %s" % dir_))
fileutils.rmtree(dir_)
- except Exception, exc:
- self.log(str("ERROR: %s" % exc))
except IOException, ioExc:
self.log(str("ERROR: %s" % ioExc))
@@ -183,14 +181,10 @@
update_session = False
if update_session:
- try:
- self.log(str("Opening a new session for %s..." % database))
- session = nokia.nokiaccm.open_session(database=database, engine=engine, dbpath=dbpath)
- session.close_on_exit = False
- config[database] = session.addr()
- except Exception, exc:
- traceback.print_exc()
- raise exc
+ self.log(str("Opening a new session for %s..." % database))
+ session = nokia.nokiaccm.open_session(database=database, engine=engine, dbpath=dbpath)
+ session.close_on_exit = False
+ config[database] = session.addr()
self.log(str("Updating the file %s..." % sessionFile))
config.store(open(sessionFile, 'w+'))
--- a/buildframework/helium/tools/preparation/ido-prep.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/preparation/ido-prep.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -30,31 +30,16 @@
* IBY export (old way)
</description>
- <!-- Path to a INI file that contains the mapping between the ADO from Synergy WA and it's location on the BA.
- @type string
- @scope private
- -->
- <property name="ado.mapping.file" location="${build.output.dir}/build/ado_mapping.ini"/>
- <!-- Path to a INI file that contains the mapping between the ADO from Synergy WA and it's location on the BA for quality targets.
+ <!-- Path to the cenrep root. Default value is "${build.drive}/epoc32/tools/cenrep/ido/src"
@type string
@scope private
-->
- <property name="ado.quality.mapping.file" location="${build.output.dir}/build/ado_quality_mapping.ini"/>
- <!-- Path to the build romtree; the location contains iby files. Default value is "${build.drive}${env.EPOCROOT}/epoc32/rom/include"
+ <property name="ido.cenrep.root" location="${build.drive}/epoc32/tools/cenrep/ido/src" />
+ <!-- Path to the cenrep target directory. Default value is "${build.drive}/epoc32/data/z/private/10202be9"
@type string
@scope private
-->
- <property name="ido.romtree" location="${build.drive}${env.EPOCROOT}/epoc32/rom/include" />
- <!-- Path to the cenrep root. Default value is "${build.drive}${env.EPOCROOT}/epoc32/tools/cenrep/ido/src"
- @type string
- @scope private
- -->
- <property name="ido.cenrep.root" location="${build.drive}${env.EPOCROOT}/epoc32/tools/cenrep/ido/src" />
- <!-- Path to the cenrep target directory. Default value is "${build.drive}${env.EPOCROOT}/epoc32/data/z/private/10202be9"
- @type string
- @scope private
- -->
- <property name="ido.cenrep.target" value="${build.drive}${env.EPOCROOT}/epoc32/data/z/private/10202be9" />
+ <property name="ido.cenrep.target" value="${build.drive}/epoc32/data/z/private/10202be9" />
<!-- Defines the location of Codescanner output.
@type string
-->
@@ -78,6 +63,27 @@
@type boolean
@scope private
-->
+
+ <!-- Path to a INI file that contains the mapping between the ADO from Synergy WA and it's location on the BA for quality targets.
+ @type string
+ @scope private
+ @deprecated since 12.0 Not used, ido-create-ado-mapping is not used, it is replaced with macro createAdoMappingMacro.
+ -->
+ <property name="ado.mapping.file" location="${build.output.dir}/build/ado_mapping.ini"/>
+
+ <!-- Path to a INI file that contains the quality mapping between the ADO from Synergy WA and it's location on the BA for quality targets.
+ @type string
+ @scope private
+ @deprecated since 12.0 Not used, ido-create-ado-mapping is not used, it is replaced with macro createAdoMappingMacro.
+ -->
+ <property name="ado.quality.mapping.file" location="${build.output.dir}/build/ado_quality_mapping.ini"/>
+
+ <!-- Path to the build romtree; the location contains iby files. Default value is "${build.drive}${env.EPOCROOT}/epoc32/rom/include"
+ deprecated: Not used, ido-create-ado-mapping is not used, it is replaced with macro createAdoMappingMacro.
+ @type string
+ @scope private
+ @deprecated 12.0 since Not used, ido-create-ado-mapping is not used, it is replaced with macro createAdoMappingMacro.
+ -->
<!--* @property cmt.enabled
Enables to run cmt, testing code coverage tool.
@@ -107,8 +113,14 @@
@scope public
@since 11.0
-->
- <property name="codescanner.enabled" value="true"/>
+ <property name="codescanner.enabled" value="true"/>
+ <!--* @property codescanner.lxr.source.url
+ Enables source files referring to lxr url path in codescanner output html files. Should not include source path on platform.
+ @type string
+ @scope public
+ @since 12.0
+ -->
<!--* @property internal.codescanner.enabled
Enables codescanner targets to run if codescanner.enabled is set to true.
@@ -184,63 +196,100 @@
</not>
</and>
</condition>
-
+
+ <!--
+ @deprecated: since 12.0: Use createAdoMappingMacro
+ -->
<target name="ido-create-ado-mapping">
- <mkdir dir="${build.output.dir}/build"/>
- <mkdir dir="${temp.build.dir}"/>
- <if>
- <istrue value="${sysdef3.enabled}" />
- <then>
- <hlm:createPackageMapping epocroot="${build.drive}" destFile="${ado.mapping.file}">
- <path refid="system.definition.files" />
- </hlm:createPackageMapping>
- <if>
- <isreference refid="ado.quality.dirs" />
- <then>
- <hlm:createPackageMapping epocroot="${build.drive}" destFile="${ado.quality.mapping.file}"
- filterDirSet="ado.quality.dirs" >
- <path refid="system.definition.files" />
- </hlm:createPackageMapping>
- </then>
- <else>
- <copy file="${ado.mapping.file}" tofile="${ado.quality.mapping.file}" overwrite="true" />
- </else>
- </if>
- </then>
- <else>
- <tempfile property="prep.dynamic.sysdef.config" suffix=".txt" deleteonexit="false" destdir="${temp.build.dir}"/>
- <trycatch property="error.message">
- <try>
- <hlm:referenceToFileMacro refid="system.definition.files" output="${prep.dynamic.sysdef.config}"/>
- </try>
- <catch>
- <propertyregex property="message" input="${error.message}"
- regexp=":(.*)$"
- select="\1" casesensitive="false" />
- <fail message="Error: ${message}" />
- </catch>
- </trycatch>
- <trycatch>
- <try>
- <pathconvert pathsep="," property="ado.quality.dirs.path">
- <dirset refid="ado.quality.dirs"/>
- </pathconvert>
- </try>
- </trycatch>
- <script language="jython" setbeans="false">
+ <hlm:createAdoMappingMacro adoMapFile="${ado.mapping.file}" />
+ <hlm:createAdoMappingMacro adoMapFile="${ado.quality.mapping.file}" mapForQuality="true"/>
+ </target>
+
+ <!-- Internal target to generate ado mapping for old sysdef format, this would be deprecated once
+ the sysdef3 is deployed.
+ -->
+ <scriptdef name="adoMappingOldSysdefMacro" language="jython" uri="http://www.nokia.com/helium">
+ <attribute name="adomapfile" />
+ <attribute name="mapforquality" />
+import os
import idoprep
-idoprep.create_ado_mapping(project.getProperty(r"prep.dynamic.sysdef.config"), project.getProperty(r"ado.mapping.file"), project.getProperty(r"ado.quality.mapping.file"), project.getProperty(r"build.drive"), project.getProperty("ado.quality.dirs.path"))
- </script>
- </else>
- </if>
- </target>
-
+idoprep.create_ado_mapping(project.getProperty(r"prep.dynamic.sysdef.config"), attributes.get(r"adomapfile"), attributes.get(r"mapforquality"), project.getProperty(r"build.drive"), project.getProperty(r"ado.quality.dirs.path"))
+ </scriptdef>
+
+ <!-- Generates ado mapping file which could be used to identify the new sources.
+ e.g:
+ <pre>
+ <property name="prep.copy.mapping.file" location="${build.output.dir}/build/ado_mapping_copy.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${prep.copy.mapping.file}" />
+ </pre>
+
+ Usage example:
+ <pre>
+ <target name="ido-map-file">
+ <property name="prep.copy.mapping.file" location="${build.output.dir}/build/ado_mapping_copy.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${prep.copy.mapping.file}" />
+ </target>
+ </pre>
+ -->
+ <macrodef name="createAdoMappingMacro" uri="http://www.nokia.com/helium">
+ <attribute name="adoMapFile"/>
+ <attribute name="mapForQuality" default="false"/>
+ <sequential>
+ <mkdir dir="${build.output.dir}/build"/>
+ <mkdir dir="${temp.build.dir}"/>
+ <if>
+ <istrue value="${sysdef3.enabled}" />
+ <then>
+ <if>
+ <and>
+ <isreference refid="ado.quality.dirs" />
+ <equals arg1="@{mapForQuality}" arg2="true" />
+ </and>
+ <then>
+ <hlm:createPackageMapping epocroot="${build.drive}" destFile="@{adoMapFile}"
+ filterDirSet="ado.quality.dirs" >
+ <path refid="system.definition.files" />
+ </hlm:createPackageMapping>
+ </then>
+ <else>
+ <hlm:createPackageMapping epocroot="${build.drive}" destFile="@{adoMapFile}">
+ <path refid="system.definition.files" />
+ </hlm:createPackageMapping>
+ </else>
+ </if>
+ </then>
+ <else>
+ <tempfile property="prep.dynamic.sysdef.config" suffix=".txt" deleteonexit="false" destdir="${temp.build.dir}"/>
+ <trycatch property="error.message">
+ <try>
+ <hlm:referenceToFileMacro refid="system.definition.files" output="${prep.dynamic.sysdef.config}"/>
+ </try>
+ <catch>
+ <propertyregex property="message" input="${error.message}"
+ regexp=":(.*)$"
+ select="\1" casesensitive="false" />
+ <fail message="Error: ${message}" />
+ </catch>
+ </trycatch>
+ <trycatch>
+ <try>
+ <pathconvert pathsep="," property="ado.quality.dirs.path">
+ <dirset refid="ado.quality.dirs"/>
+ </pathconvert>
+ </try>
+ </trycatch>
+ <hlm:adoMappingOldSysdefMacro adomapfile="@{adoMapFile}" mapforquality="@{mapForQuality}" />
+ </else>
+ </if>
+ </sequential>
+ </macrodef>
+
<!-- Target to generate cenreps using cone tool -->
<target name="ido-gen-cenrep">
<mkdir dir="${post.log.dir}" />
<mkdir dir="${temp.build.dir}" />
<tempfile property="cenrep.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}"/>
- <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-cenrep-gen.xml.ftl"
+ <fmpp sourceFile="${helium.dir}/tools/preparation/templates/ido-cenrep-gen.xml.ftl"
outputfile="${cenrep.dynamic.config}">
<data expandProperties="yes">
dbPath: ${metadata.dbfile}
@@ -276,7 +325,7 @@
<mkdir dir="${post.log.dir}" />
<mkdir dir="${temp.build.dir}" />
<tempfile property="confml.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}"/>
- <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-confml-validate.ant.xml.ftl"
+ <fmpp sourceFile="${helium.dir}/tools/preparation/templates/ido-confml-validate.ant.xml.ftl"
outputfile="${confml.dynamic.config}">
<data expandProperties="yes">
dbPath: ${metadata.dbfile}
@@ -317,7 +366,7 @@
@type string
@scope public
-->
- <property name="ido.prep.copy.template" location="${helium.dir}/tools/common/templates/ido/ido-ant-copy.xml.ftl" />
+ <property name="ido.prep.copy.template" location="${helium.dir}/tools/preparation/templates/ido-ant-copy.xml.ftl" />
<!-- Target that uses the information from the system.definition.files to prepare the IDO build area.
It relies on the fact that layer_real_source_path entity is declared in each ADO configuration.
@@ -325,13 +374,15 @@
By default it deletes the previous content. If you want to backup what was previoulsy used please
defined '''keep.old.source.enabled''' property.
-->
- <target name="ido-prep-copy" depends="ido-create-ado-mapping">
+ <target name="ido-prep-copy">
+ <property name="prep.copy.mapping.file" location="${build.output.dir}/build/ado_mapping_copy.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${prep.copy.mapping.file}" />
<mkdir dir="${temp.build.dir}"/>
<tempfile property="prep.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}"/>
<fmpp sourceFile="${ido.prep.copy.template}"
outputFile="${prep.dynamic.config}">
<data expandProperties="yes">
- inputfile: antProperty(ado.mapping.file)
+ inputfile: antProperty(prep.copy.mapping.file)
ant: antProperties()
data: eval('
java.io.FileInputStream pin = new java.io.FileInputStream(filename);
@@ -347,9 +398,9 @@
<!--
Run cleanup system definition configuration. The configuration name are
- generated from the '''sysdef.configurations.list''' property, appending '_clean'
+ generated from the ``sysdef.configurations.list`` property, appending '_clean'
at the end of each configuration also reversing their build order.
- if '''sysdef.clean.configurations.list''' is defined it overrides
+ if ``sysdef.clean.configurations.list`` is defined it overrides
the previous beharvious and is used to cleanup the environment.
-->
<target name ="ido-prep-clean">
@@ -364,7 +415,7 @@
<script language="jython" setbeans="false">
rev_names = ""
for sysdef in project.getProperty("sysdef.configurations.list").split(","):
- rev_names = sysdef + "_clean," + rev_names;
+ rev_names = sysdef + "_clean," + rev_names
project.setProperty("sysdef.clean.configurations.list", rev_names)
</script>
</then>
@@ -385,24 +436,34 @@
<!--
This targets run the codescanner application on each discovered ADO.
- The location of the output is defined byt '''ido.codescanner.output.dir''' property.
- And the type is defined by '''ido.codescanner.output.type''' (default is HTML).
+ The location of the output is defined byt ``ido.codescanner.output.dir`` property.
+ And the type is defined by ``ido.codescanner.output.type`` (default is HTML).
+ To update the HTML files with lxr source URL you need to set the property ``codescanner.lxr.source.url``
+ URL should not include source path on platform.
-->
- <target name="ido-codescanner" depends="ido-create-ado-mapping" if="internal.codescanner.enabled">
-
- <!--hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="ado.src.path"/-->
+ <target name="ido-codescanner" if="internal.codescanner.enabled">
+ <property name="codescanner.mapping.file" location="${build.output.dir}/build/ado_mapping_codescanner.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${codescanner.mapping.file}" mapForQuality="true"/>
+ <!--hlm:iniKeys2Path ini="${codescanner.mapping.file}" pathid="ado.src.path"/-->
<!-- Defines the format of Codescanner output (html|xml|std).
@type string
-->
- <property name="ido.codescanner.output.type" value="html"/>
- <script language="jython" setbeans="false">
-""" internal.codescanner.drive """
+ <hlm:resourceaccess lockName="subst-drive">
+ <property name="ido.codescanner.output.type" value="html"/>
+
+ <!-- Defines the fmpp template for Codescanner.
+ @type string
+ @scope private
+ -->
+ <property name="ido.codescanner.template" value="${helium.dir}/tools/preparation/templates/ido-codescanner.ant.xml.ftl"/>
+ <script language="jython" setbeans="false">
+#internal.codescanner.drive
import os
import fileutils
import configuration
import pathaddition.relative
-config = configuration.PropertiesConfiguration(stream=open(str(project.getProperty("ado.quality.mapping.file")), 'r'))
+config = configuration.PropertiesConfiguration(stream=open(str(project.getProperty("codescanner.mapping.file")), 'r'))
prefix = pathaddition.relative.commonprefix(config.keys())
if not os.path.exists(prefix):
raise Exception("Could not find common prefix for the following paths:\n" + "\n".join(config.keys()))
@@ -423,14 +484,37 @@
pe = path.createPathElement()
pe.setPath(location)
project.addReference('substed.ado.src.path', path)
- </script>
+ </script>
+ </hlm:resourceaccess>
<trycatch property="codescanner.thrown">
<try>
- <hlm:codescanner dest="${ido.codescanner.output.dir}"
- format="${ido.codescanner.output.type}"
- configuration="${ido.codescanner.config}">
- <path refid="substed.ado.src.path"/>
- </hlm:codescanner>
+ <if>
+ <isset property="codescanner.lxr.source.url"/>
+ <then>
+ <tempfile property="codescanner.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}"/>
+ <fmpp sourceFile="${ido.codescanner.template}"
+ outputFile="${codescanner.dynamic.config}">
+ <data expandProperties="yes">
+ inputfile: antProperty(codescanner.mapping.file)
+ ant: antProperties()
+ data: eval('
+ java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+ java.util.Properties props = new java.util.Properties();
+ props.load(pin);
+ return props;
+ ', {filename:get(inputfile)})
+ </data>
+ </fmpp>
+ <ant antfile="${codescanner.dynamic.config}"/>
+ </then>
+ <else>
+ <hlm:codescanner dest="${ido.codescanner.output.dir}"
+ format="${ido.codescanner.output.type}"
+ configuration="${ido.codescanner.config}">
+ <path refid="substed.ado.src.path"/>
+ </hlm:codescanner>
+ </else>
+ </if>
</try>
<catch>
<fail message="${codescanner.thrown}" />
@@ -439,6 +523,7 @@
<hlm:unsubst drive="${internal.codescanner.drive}"/>
</finally>
</trycatch>
+
</target>
<!-- CMT Tool target. Complexity tool measures. Supported options for cmt tool macro is
@@ -446,12 +531,13 @@
2. output - output xml file (file size is huge 68MB for JAVA IDO, if this needs to be send, need to consider
3. config - input config .
-->
- <target name="ido-cmt" depends="ido-create-ado-mapping" if="internal.cmt.enabled">
-
- <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-cmt-ant.xml.ftl"
+ <target name="ido-cmt" if="internal.cmt.enabled">
+ <property name="cmt.mapping.file" location="${build.output.dir}/build/ado_mapping_cmt.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${cmt.mapping.file}" mapForQuality="true"/>
+ <fmpp sourceFile="${helium.dir}/tools/preparation/templates/ido-cmt-ant.xml.ftl"
outputFile="${temp.build.dir}/ido-cmt.ant.xml">
<data expandProperties="yes">
- inputfile: antProperty(ado.quality.mapping.file)
+ inputfile: antProperty(cmt.mapping.file)
ant: antProperties()
data: eval('
java.io.FileInputStream pin = new java.io.FileInputStream(filename);
@@ -492,16 +578,16 @@
</target>
- <!-- Internal target that generates a temporary file that allow the
- either export of iby or either key*.xls. The generated Ant build file
- contains two targets with copy insturctions and generic set of fileset rules.
+ <!-- Target to copy files based on ado mapping.
-->
- <target name="ido-create-copy-file" depends="ido-create-ado-mapping">
+ <target name="ido-create-copy-file">
+ <property name="create.copy.mapping.file" location="${build.output.dir}/build/ado_mapping_create_copy.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${create.copy.mapping.file}" />
<tempfile property="copyfile.dynamic.config" suffix=".ant.xml" deleteonexit="false" destdir="${temp.build.dir}"/>
- <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-export.ant.xml.ftl"
+ <fmpp sourceFile="${helium.dir}/tools/preparation/templates/ido-export.ant.xml.ftl"
outputFile="${copyfile.dynamic.config}">
<data expandProperties="yes">
- inputfile: antProperty(ado.mapping.file)
+ inputfile: antProperty(create.copy.mapping.file)
ant: antProperties()
data: eval('
java.io.FileInputStream pin = new java.io.FileInputStream(filename);
@@ -550,94 +636,172 @@
</target>
<!-- Gets the contents from a network drive or Dragonfly -->
- <target name="ido-check-latest-release" depends="ido-check-latest-release-grace" unless="env.HLM_SUBCON">
+ <target name="ido-check-latest-release" depends="ido-check-latest-release-network" unless="env.HLM_SUBCON">
<runtarget target="ido-check-latest-release-dragonfly"/>
</target>
+ <!--* @property s60.grace.service
+ File service to look into.
+ @type string
+ @editable required
+ @scope public
+ @deprecated since 12.0
+ -->
+ <!--* @property download.release.service
+ File service to look into.
+ @type string
+ @editable required
+ @scope public
+ -->
+ <condition property="download.release.service" value="${s60.grace.service}">
+ <isset property="s60.grace.service" />
+ </condition>
+
<!--* @property s60.grace.server
UNC path to file server.
@type string
@editable required
@scope public
+ @deprecated since 12.0
-->
- <!--* @property s60.grace.service
- File service to look into.
+ <!--* @property download.release.server
+ UNC path to file server.
@type string
@editable required
@scope public
-->
+ <condition property="download.release.server" value="${s60.grace.server}">
+ <isset property="s60.grace.server" />
+ </condition>
+
<!--* @property s60.grace.product
Product to look into.
@type string
@editable required
@scope public
+ @deprecated since 12.0
-->
+ <!--* @property download.release.product
+ Product to look into.
+ @type string
+ @editable required
+ @scope public
+ -->
+ <condition property="download.release.product" value="${s60.grace.product}">
+ <isset property="s60.grace.product" />
+ </condition>
+
<!--* @property s60.grace.release
Regular expression to match a particular realease.
@type string
@editable required
@scope public
+ @deprecated since 12.0
+ -->
+
+ <!--* @property download.release.regex
+ Regular expression to match a particular realease.
+ @type string
+ @editable required
+ @scope public
-->
- <!--* @property s60.grace.release.fixbuildregex
- Regular expression to match a particular release fixbuilds. Example _(.*?)$ or _(\d+)$
+ <condition property="download.release.regex" value="${s60.grace.release}">
+ <isset property="s60.grace.release" />
+ </condition>
+
+ <!-- Regular expression to match a particular release fixbuilds. Example _(.*?)$ or _(\d+)$
+ @type string
+ @editable required
+ @scope public
+ @deprecated since 12.0
+ -->
+ <property name="s60.grace.release.fixbuildregex" value="_(.*?)$" />
+
+ <!-- Regular expression to match a particular release fixbuilds. Example _(.*?)$ or _(\d+)$
@type string
@editable required
@scope public
-->
+ <property name="download.release.fixbuildregex" value="${s60.grace.release.fixbuildregex}" />
+
<!--* @property s60.grace.cache
- Location of the Grace result cache for a builder.
+ Location of the result cache for a builder.
+ @type string
+ @editable required
+ @scope public
+ @deprecated since 12.0
+ -->
+ <!--* @property download.release.cache
+ Location of the result cache for a builder.
@type string
@editable required
@scope public
-->
- <!--* @property s60.grace.checkmd5
- Enable MD5 validation for release metadata (default: false).
- @type boolean
- @editable required
- @scope public
- @deprecate Since 11.0
- -->
+ <condition property="download.release.cache" value="${s60.grace.cache}">
+ <isset property="s60.grace.cache" />
+ </condition>
<!--* @property s60.grace.checkmd5.enabled
Enable MD5 validation for release metadata (default: false).
@type boolean
@editable required
@scope public
+ @deprecated since 12.0
-->
-
- <!--* @property internal.s60.grace.checkmd5.enabled
- set if s60.grace.checkmd5.enabled set to true.
+ <!--* @property download.release.checkmd5.enabled
+ Enable MD5 validation for release metadata (default: false).
@type boolean
- @scope private
+ @editable required
+ @scope public
-->
-
+
<!--* @property s60.grace.revision
Defined the regular expression to find a particular revision.
@type string
@editable required
@scope public
+ @deprecated since 12.0
+ -->
+ <!--* @property download.release.revision
+ Defined the regular expression to find a particular revision.
+ @type string
+ @editable required
+ @scope public
-->
+ <condition property="download.release.revision" value="${s60.grace.revision}">
+ <isset property="s60.grace.revision" />
+ </condition>
+
<!--* @property s60.grace.usetickler
Enable the detection of ready release using release tickler mechanism.
@type boolean
@editable required
@scope public
+ @deprecated since 12.0
-->
+ <!--* @property download.release.usetickler
+ Enable the detection of ready release using release tickler mechanism.
+ @type string
+ @editable required
+ @scope public
+ -->
+ <condition property="download.release.usetickler" value="${s60.grace.usetickler}">
+ <isset property="s60.grace.usetickler" />
+ </condition>
- <!-- Check is the s60.grace.checkmd5.enabled is set -->
- <condition property="internal.s60.grace.checkmd5.enabled" else="false" value="true">
+ <condition property="internal.release.checkmd5.enabled" else="false" value="true">
<or>
<istrue value="${s60.grace.checkmd5.enabled}"/>
- <istrue value="${s60.grace.checkmd5}"/>
+ <istrue value="${download.release.checkmd5.enabled}"/>
</or>
</condition>
<!-- Checks the contents from the release. -->
- <target name="ido-check-latest-release-grace" unless="internal.dragonfly.enabled">
+ <target name="ido-check-latest-release-network" unless="internal.dragonfly.enabled">
<script language="jython" setbeans="false">
import os
import idoprep
-
-result = idoprep.get_s60_env_details(project.getProperty('s60.grace.server'), project.getProperty('s60.grace.service'), project.getProperty('s60.grace.product'), project.getProperty('s60.grace.release'), project.getProperty('s60.grace.revision'), project.getProperty('s60.grace.cache'), project.getProperty('internal.s60.grace.checkmd5.enabled'), project.getProperty('s60.grace.usetickler'))
+from com.nokia.ant.util import Helper
+result = idoprep.get_s60_env_details(Helper.getProperty(project, 'download.release.server'), Helper.getProperty(project, 'download.release.service'), Helper.getProperty(project, 'download.release.product'), Helper.getProperty(project, 'download.release.regex'), project.getProperty('download.release.revision'), project.getProperty('download.release.cache'), project.getProperty('internal.release.checkmd5.enabled'), project.getProperty('download.release.usetickler'))
resultname = os.path.basename(result[0])
project.setProperty('s60.getenv.path', str(result[0]))
project.setProperty('s60.getenv.release', str(resultname))
@@ -646,6 +810,11 @@
project.setProperty('s60.getenv.update', "1")
</script>
</target>
+
+ <!-- Replaced by ido-update-build-area-network.
+ @deprecated since 12.0
+ -->
+ <target name="ido-update-build-area-grace" depends="ido-update-build-area-network"/>
<!-- Updates the build area from either a network drive or Dragonfly server.-->
<target name="ido-update-build-area" depends="backup-subst-drives,ido-update-build-area-grace" unless="env.HLM_SUBCON">
@@ -653,9 +822,9 @@
</target>
<!-- Creates the build area by getting the contents from the release.-->
- <target name="ido-update-build-area-grace" if="s60.getenv.update" depends="ido-check-latest-release" unless="internal.dragonfly.enabled">
+ <target name="ido-update-build-area-network" if="s60.getenv.update" depends="ido-check-latest-release" unless="internal.dragonfly.enabled">
<!-- Just get S60 for IDOs -->
- <echo>Location of the new S60 release:${s60.getenv.path}</echo>
+ <echo>Location of the new release:${s60.getenv.path}</echo>
<tstamp>
<format property="getenv.tstamp" pattern="yyyyMMddHHmmss"/>
</tstamp>
@@ -703,7 +872,7 @@
variant_pkg = rel_metadata.getVariantPackage(project.getProperty('ido.variant'))
project.setProperty('ido.variant.package', os.path.join(rel_path, variant_pkg))
</script>
- <unzip src="${ido.variant.package}" dest="${build.drive}${env.EPOCROOT}"/>
+ <unzip src="${ido.variant.package}" dest="${build.drive}/"/>
</target>
--- a/buildframework/helium/tools/preparation/password.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/preparation/password.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -75,12 +75,6 @@
<hlm:filterRecordStopMacro/>
</target>
- <!-- Retrieve the GRACE password from the .netrc file and store it into release.grace.password property. -->
- <target name="grace-password" if="release.grace">
- <hlm:netrcPasswordMacro output-prop="release.grace.password" result-prop="grace.password.available" type="grace"/>
- <hlm:logreplace regexp="${release.grace.password}"/>
- </target>
-
<!-- Retrieve the NOE password from the .netrc file and store it into noe.password property. -->
<target name="noe-password">
<hlm:netrcPasswordMacro output-prop="noe.password" result-prop="noe.password.available" type="noe"/>
@@ -190,18 +184,5 @@
<!-- check synergy is available needs ccm.enabled to be set to 'true' as well.-->
<target name="ccm-check" unless="skip.password.validation" if="internal.ccm.enabled">
<hlm:ccmAvailableMacro resultproperty="ccm.session.created"/>
- <echo>ccm.session.created = ${ccm.session.created}</echo>
- <if>
- <equals arg1="${ccm.session.created}" arg2="-1"/>
- <then>
- <fail message="Unable to create CCM session."/>
- </then>
- </if>
- <if>
- <equals arg1="${ccm.session.created}" arg2="-2"/>
- <then>
- <fail message="Access Denied for user."/>
- </then>
- </if>
</target>
</project>
--- a/buildframework/helium/tools/preparation/preparation.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/preparation/preparation.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -120,7 +120,7 @@
<!-- Gets a release from network drive. -->
- <target name="preparation-getenv" if="base_release.path" depends="init-build-area">
+ <target name="preparation-getenv" if="base_release.path" depends="init-build-area,start-ant-log">
<!-- Making sure we have nothing to pass -->
<property name="base_release.path" value=""/>
<property name="base_release.getenv_options" value=""/>
@@ -373,7 +373,6 @@
<propertyset id="password.list.ref">
<propertyref name="ccm.password.rc" />
<propertyref name="ccm.user.password" />
- <propertyref name="release.grace.password" />
<propertyref name="unix.password" />
<propertyref name="release.notes.password" />
<propertyref name="nwiki.password" />
@@ -443,7 +442,10 @@
<script language="jython" setbeans="false">
from java.io import *
import time
+import os
prep_build_dir_str = project.getProperty('prep.build.dir')
+if prep_build_dir_str.endswith(os.sep):
+ prep_build_dir_str = prep_build_dir_str[:-1]
prep_build_dir = File(prep_build_dir_str)
print prep_build_dir
if prep_build_dir.exists():
--- a/buildframework/helium/tools/preparation/synergy/ccmgetinput.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/preparation/synergy/ccmgetinput.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -76,26 +76,15 @@
# enabling logging
logging.basicConfig(level=logging.INFO)
-builder = None
+configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
+configSet = configBuilder.getConfiguration()
+password = ant.get_property(r'${ccm.user.password}')
+builder = preparation.PreparationBuilder(configSet.getConfigurations(), ant.get_property(r'${ccm.user.login}'), password, cache=ant.get_property(r'${ccm.cache.xml}'))
try:
- configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
- configSet = configBuilder.getConfiguration()
- password = ant.get_property(r'${ccm.user.password}')
- builder = preparation.PreparationBuilder(configSet.getConfigurations(), ant.get_property(r'${ccm.user.login}'), password, cache=ant.get_property(r'${ccm.cache.xml}'))
builder.check()
builder.get_content()
+finally:
builder.close()
-except Exception, e:
- print "ERROR: error found during preparation phase:"
- for l in traceback.format_exc().splitlines(False):
- print "ERROR: %s" % l
- print "ERROR: this is a critical error, build will fail now:"
- for l in str(e).splitlines(False):
- print "ERROR: %s" % l
- if builder != None:
- builder.close()
- sys.exit(-1)
-sys.exit(0)
</hlm:python>
</try>
<finally>
@@ -130,25 +119,14 @@
# enabling logging
logging.basicConfig(level=logging.INFO)
-builder = None
+configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
+configSet = configBuilder.getConfiguration()
+password = ant.get_property(r'${ccm.user.password}')
+builder = preparation.PreparationBuilder(configSet.getConfigurations(), ant.get_property(r'${ccm.user.login}'), password, cache=ant.get_property(r'${ccm.cache.xml}'))
try:
- configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
- configSet = configBuilder.getConfiguration()
- password = ant.get_property(r'${ccm.user.password}')
- builder = preparation.PreparationBuilder(configSet.getConfigurations(), ant.get_property(r'${ccm.user.login}'), password, cache=ant.get_property(r'${ccm.cache.xml}'))
builder.cleanup()
+finally:
builder.close()
-except Exception, e:
- print "ERROR: error found during preparation phase:"
- for l in traceback.format_exc().splitlines(False):
- print "ERROR: %s" % l
- print "ERROR: this is a critical error, build will fail now:"
- for l in str(e).splitlines(False):
- print "ERROR: %s" % l
- if builder != None:
- builder.close()
- sys.exit(-1)
-sys.exit(0)
</hlm:python>
</try>
<finally>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/templates/ido-ant-copy.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,68 @@
+<#--
+============================================================================
+Name : ido-ant-copy.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0"?>
+<project name="ido-ant-copy" default="all">
+ <target name="delete">
+ <parallel threadCount="${r'$'}{number.of.threads}">
+ <#list data?keys as component>
+ <sequential>
+ <#if ((ant['keep.old.source.enabled']=="true") || ant?keys?seq_contains('ido.keep.old'))>
+ <delete dir="${data[component]}_old" failonerror="false"/>
+ <move file="${data[component]}" todir="${data[component]}_old" failonerror="false"/>
+ <#else>
+ <delete dir="${data[component]}" failonerror="false"/>
+ </#if>
+ </sequential>
+ </#list>
+ </parallel>
+ </target>
+
+ <target name="copy">
+ <#list data?keys as component>
+ <mkdir dir="${data[component]}"/>
+ </#list>
+ <parallel threadCount="${r'$'}{number.of.threads}">
+ <#list data?keys as component>
+ <sequential>
+ <copy todir="${data[component]}" verbose="false" failonerror="false" overwrite="true">
+ <fileset dir="${component}" casesensitive="false" >
+ <exclude name="**/_ccmwaid.inf"/>
+ <exclude name="**/.ccmwaid.inf"/>
+ <#if ((ant['keep.internal.folders.enabled'] == "false")&& (!ant?keys?seq_contains('keep.internals')))>
+ <exclude name="**/internal/**"/>
+ </#if>
+ <exclude name="**/.hg/**"/>
+ <exclude name="**/.svn/**"/>
+ </fileset>
+ </copy>
+ <#-- Below operation is not required on linux as copy task will changes
+ the file permissions to write mode -->
+ <exec executable="attrib" osfamily="windows" dir="${data[component]}">
+ <arg line="-R /S /D .\*"/>
+ </exec>
+ </sequential>
+ </#list>
+ </parallel>
+ </target>
+
+ <target name="all" depends="delete,copy" />
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/templates/ido-cenrep-gen.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,58 @@
+<#--
+============================================================================
+Name : ido-cenrep-gen.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#assign table_info = pp.loadData('com.nokia.helium.metadata.ORMFMPPLoader',
+ "${dbPath}") >
+
+<project name="cenrep-generation" default="all">
+ <#if os?lower_case?starts_with('win')>
+ <#assign exe_file="cmd.exe"/>
+ <#else>
+ <#assign exe_file="bash"/>
+ </#if>
+ <target name="ido-cenrep-generation">
+ <sequential>
+ <#list table_info['native:java.lang.String']['select distinct w.member FROM WhatLogEntry w where w.member like \'%.confml\''] as confmlfile>
+ <exec executable="${exe_file}" dir="${ant['build.drive']}/epoc32/tools" failonerror="false" output="${ant['post.log.dir']}/${ant['build.id']}_cenrep.cone.log">
+ <#if os?lower_case?starts_with('win')>
+ <arg value="/c"/>
+ <arg value="cone.cmd"/>
+ <#else>
+ <arg value="cone"/>
+ </#if>
+ <arg value="generate" />
+ <arg value="-p"/>
+ <arg value="${ant['build.drive']}\epoc32\rom\config\assets\s60" />
+ <arg value="-o" />
+ <arg value="${ant['build.drive']}\epoc32\release\winscw\urel\z" />
+ <arg value="-c"/>
+ <arg value="root.confml" />
+ <arg value="-i"/>
+ <arg value="${confmlfile}" />
+ </exec>
+ </#list>
+ </sequential>
+ </target>
+
+ <target name="all" depends="ido-cenrep-generation" />
+</project>
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/templates/ido-cmt-ant.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,46 @@
+<#--
+============================================================================
+Name : ido-cmt-ant.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0"?>
+<project name="ido-cmt-ant" default="all" xmlns:hlm="http://www.nokia.com/helium">
+<import file="${ant['helium.dir']}/helium.ant.xml"/>
+<#assign targetlist=""/>
+<#assign cmtid=1/>
+ <#list data?keys as component>
+ <#if (cmtid > 1)>
+ <#assign targetlist="${targetlist}" + ","/>
+ </#if>
+ <basename property="componentbase${cmtid}" file="${data[component]}"/>
+ <target name="cmt-${cmtid}">
+ <hlm:cmt output="${ant['build.log.dir']}/${ant['build.id']}_cmt/${ant['build.id']}_${r'$'}{componentbase${cmtid}}_${cmtid}.txt" failonerror="${ant['failonerror']}"
+ htmlOutputDir="${ant['ido.cmt.html.output.dir']}">
+ <fileset id="input" dir="${data[component]}">
+ <include name="**/*.h"/>
+ <include name="**/*.cpp"/>
+ </fileset>
+ </hlm:cmt>
+ </target>
+
+ <#assign targetlist="${targetlist}" + "cmt-${cmtid}"/>
+ <#assign cmtid=cmtid+1/>
+ </#list>
+ <target name="all" depends="${targetlist}" />
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/templates/ido-codescanner.ant.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,48 @@
+<#--
+============================================================================
+Name : ido-codescanner.ant.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0"?>
+<project name="ido-codescanner" default="gen-codescanner-report" xmlns:hlm="http://www.nokia.com/helium">
+ <target name="gen-codescanner-report">
+ <parallel>
+ <#assign componentLXRPath = "">
+ <#assign no_of_components = data?size>
+ <#list data?keys as component>
+ <#if (no_of_components > 1)>
+ <#assign componentName = data[component]?split("/")?last>
+ <hlm:codescanner format="${ant['ido.codescanner.output.type']}"
+ configuration="${ant['ido.codescanner.config']}"
+ sourcedir="${ant['internal.codescanner.drive']}/${componentName}"
+ dest="${ant['ido.codescanner.output.dir']}/${componentName}"
+ lxrurl="${ant['codescanner.lxr.source.url']}${data[component]?substring(ant['build.drive']?length)}/"
+ failonerror="false"/>
+ <#else>
+ <hlm:codescanner format="${ant['ido.codescanner.output.type']}"
+ configuration="${ant['ido.codescanner.config']}"
+ sourcedir="${ant['internal.codescanner.drive']}\"
+ dest="${ant['ido.codescanner.output.dir']}"
+ lxrurl="${ant['codescanner.lxr.source.url']}${data[component]?substring(ant['build.drive']?length)}/"
+ failonerror="false"/>
+ </#if>
+ </#list>
+ </parallel>
+ </target>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/templates/ido-confml-validate.ant.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,60 @@
+<#--
+============================================================================
+Name : ido-confml-validate.ant.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<#assign table_info = pp.loadData('com.nokia.helium.metadata.ORMFMPPLoader',
+ "${dbPath}") >
+<?xml version="1.0"?>
+<project name="validate-confml" default="validate-confml-file">
+
+ <target name="validate-confml-file">
+ <#if os?lower_case?starts_with('win')>
+ <#assign exe_file="cmd.exe"/>
+ <#else>
+ <#assign exe_file="bash"/>
+ </#if>
+ <sequential>
+ <exec executable="${exe_file}" dir="${ant['build.drive']}/epoc32/tools" failonerror="false" output="${ant['post.log.dir']}/${ant['build.id']}_validate_confml.log">
+ <#if os?lower_case?starts_with('win')>
+ <arg value="/c"/>
+ <arg value="cone.cmd"/>
+ <#else>
+ <arg value="cone"/>
+ </#if>
+ <arg value="validate" />
+ <#list table_info['native:java.lang.String']['select distinct w.member FROM WhatLogEntry w where w.member like \'%.confml\''] as confmlfile>
+ <arg value="--confml-file"/>
+ <arg value="${confmlfile}" />
+ </#list>
+ <#list table_info['native:java.lang.String']['select distinct w.member FROM WhatLogEntry w where w.member like \'%.crml\''] as crmlfile>
+ <arg value="--implml-file"/>
+ <arg value="${crmlfile}" />
+ </#list>
+ <arg value="--report-type"/>
+ <arg value="xml" />
+ <arg value="--report"/>
+ <arg value="${ant['post.log.dir']}/${ant['build.id']}_validate_confml.xml" />
+ </exec>
+ </sequential>
+ </target>
+
+</project>
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/templates/ido-export.ant.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,47 @@
+<#--
+============================================================================
+Name : ido-export.ant.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0"?>
+<project name="ido-copy">
+
+ <target name="ido-copy-iby">
+ <#list data?keys as name>
+ <copy todir="${ant['ido.romtree']}" verbose="true" overwrite="true" flatten="true">
+ <fileset dir="${data[name]}" casesensitive="no">
+ <include name="**/rom/*.iby"/>
+ <exclude name="**/internal/**"/>
+ <exclude name="**/tsrc/**"/>
+ </fileset>
+ </copy>
+ </#list>
+ </target>
+
+ <target name="ido-copy-cenrep">
+ <#list data?keys as name>
+ <copy todir="${ant['ido.cenrep.root']}" verbose="true" overwrite="true" flatten="true">
+ <fileset dir="${data[name]}" casesensitive="no">
+ <include name="**/cenrep/keys_*.xls"/>
+ </fileset>
+ </copy>
+ </#list>
+ </target>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/test/test_ido-prep.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_ido-prep.ant.xml
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test_ido-prep" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>
+ Preparation Testing targets
+ </description>
+
+ <property name="helium.dir" location="../../.." />
+ <property name="sysdef3.enabled" value="true"/>
+ <import file="../../../build.xml" />
+
+ <path id="system.definition.files">
+ <fileset dir="${helium.dir}/tests/minibuilds" includes="*.sysdef.xml"/>
+ </path>
+
+ <target name="test-ido-create-ado-mapping">
+ <property name="ado.mapping.file" location="${build.output.dir}/build/ado_mapping.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${policy.src.mapping.file}" />
+ <au:assertFileExists file="${ado.mapping.file}" />
+ </target>
+
+</project>
--- a/buildframework/helium/tools/preparation/test/test_preparation.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/preparation/test/test_preparation.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -36,6 +36,7 @@
<property name="prep.root.dir" value="../../../build/test/preproot" />
<property name="helium.dir" location="../../.." />
+ <property name="sysdef3.enabled" value="true"/>
<!--<import file="../../../build.xml"/>-->
<!-- in the normal run we should not have the same build.drive content in the second run
@@ -224,7 +225,7 @@
<antcall target="create-directory-structure" />
<au:assertLogContains text="'directory.structure.config' reference not found, so not any directory structure will be created." />
</target>
-
+
<target name="test-create-directory-structure">
<antcall target="create-directory-structure">
<reference refid="test.directory.structure.config" torefid="directory.structure.config" />
@@ -238,4 +239,5 @@
<available file="${preparation.temp.dir}/dir2" type="dir" />
</au:assertTrue>
</target>
+
</project>
--- a/buildframework/helium/tools/preparation/test/test_synergyjavataks.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/preparation/test/test_synergyjavataks.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -34,7 +34,7 @@
<condition property="run.ccm.71">
<istrue value="${synergy71.enabled}" />
</condition>
-
+
<target name="suiteSetUp" if="run.ccm.71">
<mkdir dir="${synergy71.project.wa}"/>
<mkdir dir="${synergy71.snapshot.wa}"/>
@@ -89,6 +89,24 @@
</hlm:ccm>
<au:assertLogContains text="Modifying work area for the project : MinibuildDomain-hlm_71_test"/>
+ <!-- To unmaintain the project workarea -->
+ <delete dir="${synergy71.project.wa}"/>
+ <hlm:ccm >
+ <hlm:sessionset refid="test.session" />
+ <hlm:workarea project="MinibuildDomain-hlm_71_test" maintain="false" recursive="true" path="${synergy71.project.wa}"/>
+ </hlm:ccm>
+ <au:assertLogContains text="Modifying work area for the project : MinibuildDomain-hlm_71_test"/>
+ <au:assertFileDoesntExist file="${synergy71.project.wa}/MinibuildDomain/MinibuildDomain/_ccmwaid.inf" />
+
+ <!-- To unmaintain the project workarea for snapshot-->
+ <delete dir="${synergy71.snapshot.wa}"/>
+ <hlm:ccm >
+ <hlm:sessionset refid="test.session" />
+ <hlm:workarea project="MinibuildDomain-hlm_71_test" maintain="false" recursive="true" path="${synergy71.snapshot.wa}"/>
+ </hlm:ccm>
+ <au:assertLogContains text="Modifying work area for the project : MinibuildDomain-hlm_71_test"/>
+ <au:assertFileDoesntExist file="${synergy71.snapshot.wa}/MinibuildDomain/MinibuildDomain/_ccmwaid.inf" />
+
<!-- To add the tasks into folders -->
<hlm:ccm >
<hlm:sessionset refid="test.session" />
--- a/buildframework/helium/tools/publish/publish.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/publish/publish.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -30,7 +30,7 @@
<hlm:envdata id="helium.tools.envdata">
<hlm:executable name="7za" versionArgs="" versionRegex="7-Zip (\S+)"/>
<hlm:executable name="ant" versionArgs="-version" versionRegex="Apache Ant version (\S+)"/>
- <hlm:executable name="armcc" versionArgs="" versionRegex="RVCT(.+)" output="stderr"/>
+ <hlm:executable name="armcc" versionArgs="" versionRegex="RVCT(.+)"/>
<hlm:executable name="ccm" versionArgs="version -c" versionRegex="(\S+)"/>
<hlm:executable name="codescanner" versionArgs="" versionRegex="version (\S+)"/>
<hlm:executable name="ctc" versionArgs="" versionRegex="This is CTC\+\+ \(v(\S+)\)"/>
@@ -98,7 +98,7 @@
@scope public
@since 11.0
-->
- <property name="archiving.enabled" value="true"/>
+ <property name="archiving.enabled" value="true"/>
<!--* @property internal.archiving.enabled
@@ -327,44 +327,40 @@
def merge_filelist(merger, filelist):
for filename in filelist:
- try:
- LOGGER.info("Merging %s" % filename)
- merger.merge(filename)
- os.unlink(filename)
- except Exception, exc:
- LOGGER.warning("Warning: %s" % exc)
+ LOGGER.info("Merging %s" % filename)
+ merger.merge(filename)
+ os.unlink(filename)
-try:
- builder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'@{file}')), 'r')
- configSet = builder.getConfiguration()
- configs = configSet.getConfigurations(ant.get_property(r'@{config}'))
+filename = ant.get_property(r'@{file}')
+if filename == None:
+ raise IOError(r'@{file} not found')
+builder = configuration.NestedConfigurationBuilder(open(filename), 'r')
+configSet = builder.getConfiguration()
+configs = configSet.getConfigurations(ant.get_property(r'@{config}'))
+
+if len(configs) > 0:
+ filelist = []
+ for config in configs:
+ if config.get_boolean("release.metadata", False):
+ metadata = os.path.join(config['archives.dir'], config['name']+ ".metadata.xml")
+ if os.path.exists(metadata):
+ LOGGER.info("Found %s" % metadata)
+ filelist.append(metadata)
- if len(configs) > 0:
- filelist = []
- for config in configs:
- if config.get_boolean("grace.metadata", False):
- metadata = os.path.join(config['archives.dir'], config['name']+ ".metadata.xml")
- if os.path.exists(metadata):
- LOGGER.info("Found %s" % metadata)
- filelist.append(metadata)
-
- merger = None
- metadata_main = os.path.join(configs[0]['archives.dir'], "release_metadata.xml")
- if os.path.exists(metadata_main):
- merger = symrec.MetadataMerger(metadata_main)
- merge_filelist(merger, filelist)
- LOGGER.info(str("Writing %s" % metadata_main))
- merger.save()
- elif len(filelist) > 0:
- input = filelist.pop(0)
- merger = symrec.MetadataMerger(input)
- merge_filelist(merger, filelist)
- LOGGER.info(str("Writing %s" % metadata_main))
- merger.save(metadata_main)
- os.unlink(input)
-except Exception, e:
- LOGGER.error('ERROR: %s' % e)
- sys.exit(-1)
+ merger = None
+ metadata_main = os.path.join(configs[0]['archives.dir'], "release_metadata.xml")
+ if os.path.exists(metadata_main):
+ merger = symrec.MetadataMerger(metadata_main)
+ merge_filelist(merger, filelist)
+ LOGGER.info(str("Writing %s" % metadata_main))
+ merger.save()
+ elif len(filelist) > 0:
+ input = filelist.pop(0)
+ merger = symrec.MetadataMerger(input)
+ merge_filelist(merger, filelist)
+ LOGGER.info(str("Writing %s" % metadata_main))
+ merger.save(metadata_main)
+ os.unlink(input)
]]>
</hlm:python>
</sequential>
@@ -405,31 +401,27 @@
if ant.get_property(r'@{filters}') is not None:
filters = ant.get_property(r'@{filters}').split(r',')
-try:
- filename = ant.get_property(r'@{file}')
- archive = ant.get_property(r'@{archive}')
- if not os.path.exists(filename):
- raise Exception("Could not find file: %s" % filename)
- if not os.path.exists(archive):
- raise Exception("Could not find file: %s" % archive)
+filename = ant.get_property(r'@{file}')
+archive = ant.get_property(r'@{archive}')
+if not os.path.exists(filename):
+ raise Exception("Could not find file: %s" % filename)
+if not os.path.exists(archive):
+ raise Exception("Could not find file: %s" % archive)
- LOGGER.info(str("Opening %s" % filename))
- md = symrec.ReleaseMetadata(filename)
- if os.path.basename(archive) not in md.keys():
- LOGGER.info(str("Adding %s to metadata" % os.path.basename(archive)))
- md.add_package(os.path.basename(archive), md5checksum=fileutils.getmd5(archive), size=os.path.getsize(archive), filters=filters)
- else:
- LOGGER.info(str("Updating %s to metadata" % os.path.basename(archive)))
- result = md[os.path.basename(archive)]
- result['md5checksum'] = unicode(fileutils.getmd5(archive))
- result['size'] = unicode(os.path.getsize(archive))
- if filters is not None:
- result['filters'] = filters
- md[os.path.basename(archive)] = result
- md.save()
-except Exception, e:
- LOGGER.error('ERROR: %s' % e)
- sys.exit(-1)
+LOGGER.info(str("Opening %s" % filename))
+md = symrec.ReleaseMetadata(filename)
+if os.path.basename(archive) not in md.keys():
+ LOGGER.info(str("Adding %s to metadata" % os.path.basename(archive)))
+ md.add_package(os.path.basename(archive), md5checksum=fileutils.getmd5(archive), size=os.path.getsize(archive), filters=filters)
+else:
+ LOGGER.info(str("Updating %s to metadata" % os.path.basename(archive)))
+ result = md[os.path.basename(archive)]
+ result['md5checksum'] = unicode(fileutils.getmd5(archive))
+ result['size'] = unicode(os.path.getsize(archive))
+ if filters is not None:
+ result['filters'] = filters
+ md[os.path.basename(archive)] = result
+md.save()
]]>
</hlm:python>
</sequential>
@@ -462,26 +454,24 @@
logging.basicConfig(level=logging.INFO)
# Reading the config from Ant
-try:
- config_filename = ant.get_property(r'@{file}')
- spec_name = ant.get_property(r'@{config}')
- # Loading the config file.
- builder = configuration.NestedConfigurationBuilder(open(config_filename, 'r'))
- configSet = builder.getConfiguration()
- configs = configSet.getConfigurations(spec_name)
+config_filename = ant.get_property(r'@{file}')
+spec_name = ant.get_property(r'@{config}')
+# Loading the config file.
+if config_filename == None:
+ raise IOError(r'@{file} not found')
+builder = configuration.NestedConfigurationBuilder(open(config_filename, 'r'))
+configSet = builder.getConfiguration()
+configs = configSet.getConfigurations(spec_name)
- if len(configs) > 0:
- if os.path.exists(os.path.join(configs[0]['archives.dir'], "release_metadata.xml")):
- md5update = symrec.MD5Updater(os.path.join(configs[0]['archives.dir'], "release_metadata.xml"))
- md5update.update()
- md5update.save()
- else:
- LOGGER.warning(str('WARNING: Could not find %s.' % os.path.join(configs[0]['archives.dir'], "release_metadata.xml")))
+if len(configs) > 0:
+ if os.path.exists(os.path.join(configs[0]['archives.dir'], "release_metadata.xml")):
+ md5update = symrec.MD5Updater(os.path.join(configs[0]['archives.dir'], "release_metadata.xml"))
+ md5update.update()
+ md5update.save()
else:
- LOGGER.warning('WARNING: No config.')
-except Exception, e:
- LOGGER.error('ERROR: %s' % e)
- sys.exit(-1)
+ LOGGER.warning(str('WARNING: Could not find %s.' % os.path.join(configs[0]['archives.dir'], "release_metadata.xml")))
+else:
+ LOGGER.warning('WARNING: No config.')
]]>
</hlm:python>
</sequential>
@@ -643,6 +633,8 @@
toAppendEmakeRoot = prebuilder.checkRootDirValue(builder, config_parsed_filename, project.getProperty('build.drive'), config_type)
if toAppendEmakeRoot is not None:
project.setProperty("emake.root.to.append", str(toAppendEmakeRoot))
+ else:
+ project.setProperty("emake.root.to.append", "")
prebuilder.writeTopLevel(os.path.join(project.getProperty('build.drive') + os.sep, 'ZIP_' + config_type + outputext), project.getProperty('temp.build.dir'), config_parsed_filename)
else:
raise Exception('There are no archive configs to build. Looked for %s' % config_type)
@@ -894,19 +886,19 @@
<move file="${delta.zip.delete.file}" todir="${delta.zip.temp.location}" />
<move file="${md5.signature.file}" todir="${delta.zip.temp.location}" />
-
- <exec executable="C:\APPS\symrec\symrec" failonerror="${failonerror}">
+
+ <exec osfamily="windows" executable="C:\APPS\symrec\symrec" failonerror="${failonerror}">
<arg value="create" />
<arg value="-ser" />
- <arg value="${release.grace.service}" />
+ <arg value="${hydra.service}" />
<arg value="-pro" />
- <arg value="${release.grace.product}" />
+ <arg value="${hydra.product}" />
<arg value="-rel" />
<arg value="${release.label}" />
<arg value="-relroot" />
<arg value="${delta.zip.location}" />
<arg value="-dep" />
- <arg value="${release.grace.service}/${release.grace.product}/${old.release.label}" />
+ <arg value="${hydra.service}/${hydra.product}/${old.release.label}" />
</exec>
<move file="${delta.zip.temp.location}/specialInstructions.xml" tofile="${delta.zip.delete.file}" />
@@ -952,20 +944,6 @@
<!-- Creates a delta from the prevous build to the current one -->
<target name="delta-zip" depends="delta-use-last-build,build-md5,generate-delta" description="Generate a delta between two build areas" />
-
-
- <!-- Upload the delta and config into Grace -->
- <target name="delta-zip-grace-upload">
- <fileset id="grace.delta.zips.id" dir="${delta.zip.location}">
- <include name="**/*.zip" />
- <include name="**/*.xml" />
- </fileset>
-
- <antcall target="grace-upload">
- <reference refid="grace.delta.zips.id" torefid="release.zips" />
- </antcall>
- </target>
-
<!-- Publishes the Ant build log.
@@ -1046,11 +1024,13 @@
<!-- This target will zip the WA depending on the ado mapping file -->
- <target name="zip-wa" depends="ido-create-ado-mapping" if="internal.archive.wa.enabled">
+ <target name="zip-wa" if="internal.archive.wa.enabled">
+ <property name="zip.mapping.file" location="${build.output.dir}/build/ado_mapping_zip.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${zip.mapping.file}" />
<tempfile property="zipwa.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}"/>
- <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/zip-ant-wa-copy.xml.ftl" outputFile="${zipwa.dynamic.config}">
+ <fmpp sourceFile="${helium.dir}/tools/publish/templates/zip-ant-wa-copy.xml.ftl" outputFile="${zipwa.dynamic.config}">
<data expandProperties="yes">
- inputfile: antProperty(ado.mapping.file)
+ inputfile: antProperty(zip.mapping.file)
ant: antProperties()
data: eval('
java.io.FileInputStream pin = new java.io.FileInputStream(filename);
--- a/buildframework/helium/tools/publish/synergy.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/publish/synergy.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -93,7 +93,7 @@
<available file="${build.log.dir}/${build.id}_bom.xml" />
<then>
<mkdir dir="${temp.build.dir}" />
- <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/task-publish.ant.xml.ftl" outputFile="${temp.build.dir}/task-publish.ant.xml">
+ <fmpp sourceFile="${helium.dir}/tools/publish/templates/task-publish.ant.xml.ftl" outputFile="${temp.build.dir}/task-publish.ant.xml">
<freemarkerLinks expandProperties="yes">
macro: ${helium.dir}/tools/common/templates/macro
</freemarkerLinks>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/templates/task-publish.ant.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,48 @@
+<#--
+============================================================================
+Name : task-publish.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0"?>
+<project name="task-publish" default="all" xmlns:hlm="http://www.nokia.com/helium">
+
+ <target name="all">
+ <#if (ant?keys?seq_contains('ccm.cache.xml'))>
+ <hlm:createSessionMacro database="${ant['ccm.database']}" reference="publish.session" cache="${ant['ccm.cache.xml']}"/>
+ <#else>
+ <hlm:createSessionMacro database="${ant['ccm.database']}" reference="publish.session"/>
+ </#if>
+ <hlm:ccm verbose="false">
+ <!-- Defining some session to use. -->
+ <hlm:sessionset refid="publish.session"/>
+
+ <hlm:addtask folder="${ant['publish.ccm.folder']}">
+ <#list bom['/bom/content//task/id'] as task>
+ <task name="${task?trim}"/>
+ </#list>
+ </hlm:addtask>
+ <#if (!ant?keys?seq_contains('ccm.cache.xml'))>
+ <hlm:close/>
+ </#if>
+ </hlm:ccm>
+ </target>
+
+ <!-- this is needed to include ccmtask support. -->
+ <import file="${ant['helium.dir']}/helium.ant.xml"/>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/publish/templates/zip-ant-wa-copy.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,34 @@
+<#--
+============================================================================
+Name : zip-ant-wa-copy.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0"?>
+<project name="zip-wa-ant-copy" default="all">
+ <target name="all">
+ <#list data?keys as component>
+ <sequential>
+ <#assign ba_path= data[component]?substring(3)/>
+ <zip destfile="${ant['zip.wa.file']}" update="true" excludes="_ccmwaid.inf">
+ <zipfileset dir="${component}" prefix="${ba_path}"/>
+ </zip>
+ </sequential>
+ </#list>
+ </target>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/compatibility_analyser/ca.cfg.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,60 @@
+<?xml version="1.0" ?>
+<!--
+============================================================================
+Name :
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+<build>
+ <config name="compatibility.analyser.cfg">
+ <set name="BASELINE_NAME" value="'SDK 3rd Edition'" />
+ <set name="BASELINE_SDK_DIR" value="C:\Symbian\9.2\S60_3rd_FP1_2" />
+ <set name="BASELINE_SDK_S60_VERSION" value="3.0" />
+ <set name="CURRENT_NAME" value="RnD SDK wk26" />
+ <set name="CURRENT_SDK_DIR" value="${build.drive}" />
+ <set name="CURRENT_SDK_S60_VERSION" value="3.1" />
+ <set name="TEMP" value="" />
+ <set name="USE_THREAD" value="" />
+ <set name="BASELINE_HEADERS" value="" />
+ <set name="CURRENT_HEADERS" value="" />
+ <set name="BASELINE_SYSTEMINCLUDEDIR" value="" />
+ <set name="CURRENT_SYSTEMINCLUDEDIR" value="" />
+ <set name="BASELINE_FORCED_HEADERS" value="" />
+ <set name="CURRENT_FORCED_HEADERS" value="" />
+ <set name="USE_PLATFORM_DATA" value="" />
+ <set name="RECURSIVE_HEADERS" value="" />
+ <set name="EXCLUDE_DIR_HEADERS" value="" />
+ <set name="REPLACE_HEADERS" value="" />
+ <set name="TOOLCHAIN" value="" />
+ <set name="TOOLCHAIN_PATH" value="" />
+ <set name="BASELINE_BUILDTARGET" value="" />
+ <set name="CURRENT_BUILDTARGET" value="" />
+ <set name="BASELINE_IMPORTLIBRARIES" value="" />
+ <set name="CURRENT_IMPORTLIBRARIES" value="" />
+ <set name="BASELINE_IMPORTDLLS" value="" />
+ <set name="CURRENT_IMPORTDLLS" value="" />
+ <set name="REPORT_FILE_HEADERS" value="" />
+ <set name="FILTER_FILE_HEADERS" value="" />
+ <set name="REPORT_FILE_LIBRARIES" value="" />
+ <set name="FILTER_FILE_LIBRARIES" value="" />
+ <set name="REPORT_FILE_FILTER" value="" />
+ <set name="OUTPUT_FILE_FILTER" value="" />
+ <set name="ISSUES_FILE" value="" />
+ </config>
+</build>
--- a/buildframework/helium/tools/quality/compatibility_analyser/ca_config_template.txt Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-#
-# Copyright (c) 2008, 2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of the License "Eclipse Public License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description: End-user Interface for Core Tools execution
-#
-
-########## GUIDELINES
-#
-# - If any paths contain spaces, place them in "Quotes"
-# - If some parameter is not to be used, it can be empty or completely removed
-# from the config file
-
-
-########## MANDATORY COMMON PARAMETERS
-#
-# Name for baseline file set
-BASELINE_NAME='SDK 3rd Edition'
-
-# Root directory for files in baseline directory. It's a mandatory parameter.
-BASELINE_SDK_DIR=C:\Symbian\9.2\S60_3rd_FP1_2
-
-# S60 version of baseline set.It can be any of the following
-# 3.0, 3.1, 3.2, 5.0, 9.1, 9.2,,10.1, S^1, S^2,S^3,S^4 (S^1, S^2,S^3,S^4 are for symbian 1,2,3,4 SDk versions respectively).
-BASELINE_SDK_S60_VERSION=3.0
-
-# Name for current file set
-CURRENT_NAME=RnD SDK wk26
-
-# Root directory for files in current directory. It's a mandatory parameter.
-CURRENT_SDK_DIR=Y:\
-
-# S60 version of current set.It can be any of the following
-# 3.0, 3.1, 3.2, 5.0, 9.1, 9.2,,10.1, S^1, S^2,S^3,S^4 (S^1, S^2,S^3,S^4 are for symbian 1,2,3,4 SDk versions respectively).
-CURRENT_SDK_S60_VERSION=3.1
-
-
-########## OPTIONAL COMMON PARAMETERS
-#
-# Defines the path for intermediate temporary files
-# Uses system defined paths if empty
-TEMP=
-
-
-########## OPTIONAL HEADER ANALYSIS SPECIFIC PARAMETERS
-
-# Mark as 'true', if Public vs Rnd sdk or small no of headers ( count < 3000) analysis will be done.
-# defaults to 'false' if not defined. Analysis time will be increased.
-# When analysing large no of headers, multiple Thread logic needs to be disabled to avoid issues due to high memory consumption .
-USE_THREAD=
-
-# Analyse any header directory, other than \epoc32\include. This will override
-# the default SDK paths. Multiple names separated by ‘;’ can be input. If they
-# are relative paths, BASELINE_SDK_DIR\epoc32\include and
-# CURRENT_SDK_DIR\epoc32\include will be inserted at the begining.
-BASELINE_HEADERS=
-CURRENT_HEADERS=
-
-# Specifies the dependant header directories. Multiple names separated by ‘;’
-# can be input. If defined or not, default system defined inputs will be taken
-# along with these always. If they are relative paths,
-# BASELINE_SDK_DIR\epoc32\include and CURRENT_SDK_DIR\epoc32\include will be
-# inserted at the begining.
-BASELINE_SYSTEMINCLUDEDIR=
-CURRENT_SYSTEMINCLUDEDIR=
-
-# Additional headers that have to be included for successful compilation of the
-# header files. Multiple names separated by ‘;’ can be input.
-BASELINE_FORCED_HEADERS=
-CURRENT_FORCED_HEADERS=
-
-# Usage of platform data to resolve compile time dependency information,
-# defaults to 'true' if not defined
-USE_PLATFORM_DATA=
-
-# Recurse the directory hierarchy while scanning for files under verification,
-# defaults to 'true' if not defined
-RECURSIVE_HEADERS=
-
-# If the recursive scan is enabled, optionally exclude some subdirectories,
-# defaults to be none if not defined. Multiple names separated by ‘;’ can
-# be input.
-EXCLUDE_DIR_HEADERS=
-
-# File pairs to be compared, if names change between base & current releases,
-# Format, OLD:NEW, each such set is separated by ‘;’, defaults to none
-REPLACE_HEADERS=
-
-# Report file for header analysis, report file created under reports directory
-# with a default file name if not specified
-REPORT_FILE_HEADERS=Y:/output/logs/BC/headers_report.xml
-
-# Similar as above, but this is the path of the filtered report file, otherwise
-# the same file name is used
-FILTER_FILE_HEADERS=
-
-
-########## OPTIONAL LIBRARY ANALYSIS SPECIFIC PARAMETERS
-#
-# Type of the tool chain (GCC/GGCE/RVCT) which is used fetch information from the
-# import libraries under analysis, defaults to GCCE if not specified
-TOOLCHAIN=
-
-# Path to the tool chain mentioned above, path found automatically if not specified
-TOOLCHAIN_PATH=
-
-# Target build directories of the import libraries (eg ARMV5/ARMV6). Defaults to
-# ARMV5. Please note that WINSCW is not supported. Multiple names separated by
-# ‘;’ can be input.
-BASELINE_BUILDTARGET=
-CURRENT_BUILDTARGET=
-
-# Analyse any other import library directory than from under \epoc32\release.
-# This will override target builds mentioned above. Multiple names separated
-# by ‘;’ can be input. If they are relative paths,
-# BASELINE_SDK_DIR\epoc32\release and CURRENT_SDK_DIR\epoc32\release will be
-# inserted at the begining. If any of these param is mentioned, corresponding
-# dll path also needs to be mentioned.
-BASELINE_IMPORTLIBRARIES=
-CURRENT_IMPORTLIBRARIES=
-
-# Analyse any other dll directory than from under \epoc32\release. This will
-# override target builds mentioned above. Multiple names separated by ‘;’ can
-# be input. If they are relative paths, BASELINE_SDK_DIR\epoc32\release and
-# CURRENT_SDK_DIR\epoc32\release will be inserted at the begining. If any of
-# these param is mentioned,corresponding lib path is also needs to be mentioned.
-BASELINE_IMPORTDLLS=
-CURRENT_IMPORTDLLS=
-
-# Report file for library analysis, report file created under reports directory
-# with a default file name if not specified
-REPORT_FILE_LIBRARIES=Y:/output/logs/BC/libraries_report.xml
-
-# Similar as above, but this is the path of the filtered report file, otherwise
-# the same file name is used
-FILTER_FILE_LIBRARIES=
-
-
-########## OPTIONAL REPORT FILTERING SPECIFIC PARAMETERS
-#
-# Report files to be filtered, multiple reports can be mentioned here separated
-# by ';'. In addition, peport paths mentioned in headers, libraries section are
-# also filtered
-REPORT_FILE_FILTER=
-
-# Same as above, but specifies paths for filtered report files. There is a
-# correspondance between report file above and the output file. If a report
-# file does not have a corresponding Output file mentioned then it is filtered
-# in-place.
-OUTPUT_FILE_FILTER=
-
-# Defines paths for knownissues files separated by ';' which can be either local
-# directory or a server path. Defaults to the default knownissues file
-# delivered by the tool
-ISSUES_FILE=
--- a/buildframework/helium/tools/quality/compatibility_analyser/compatibility.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/quality/compatibility_analyser/compatibility.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -20,7 +20,7 @@
============================================================================
-->
-<project name="compatibility.analyser" xmlns:hlm="http://www.nokia.com/helium">
+<project name="compatibility.analyser" xmlns:hlm="http://www.nokia.com/helium" xmlns:au="org.apache.ant.antunit">
<description>
Compatibility Analyser - BC (Binary Comparison) needs the property ca.enabled to
be set to true in order to run the targets bc-check and ca-generate-diamond-summary
@@ -32,25 +32,17 @@
@editable required
@scope public
-->
- <property name="bctools.root" location="E:\brtaylor\Apps\carbide\plugins\com.nokia.s60tools.compatibilityanalyser.corecomponents_2.0.0\BCTools" />
+ <property name="bc.tools.root" location="${build.drive}/epoc32/tools/s60rndtools/bctools/compatibilityanalyser" />
- <!-- Place where the CheckBC default configuration file is - required (see compatibility analyser user guide for details)
- it is copied from this location to the output folder for use by checkBC.py
- @type string
- @editable required
- @scope public
- -->
- <property name="default.bc.config" location="${helium.dir}/tools/quality/compatibility_analyser/ca_config_template.txt" />
-
- <!-- The bc_config_template.txt file (default configuration file) will be copied from the folder
+ <!-- The ca.cfg.xml file (default configuration file) will be copied from the folder
it is saved in within helium to the location named in this property where it will be used.
@type string
@editable required
@scope public
-->
- <property name="bc.config.dir" location="${build.log.dir}/bc" />
+ <property name="bc.build.dir" location="${build.log.dir}/bc" />
- <!-- The bc_config_template.txt file (default configuration file) will be copied from the
+ <!-- The ca.cfg.xml file (default configuration file) will be copied from the
folder it is saved in within helium to the location and file name named in this property
where it will be used. You need to make sure this is
not the same name as any other IDO or person using the build area
@@ -58,101 +50,239 @@
@editable required
@scope public
-->
- <property name="bc.config.file" location="${bc.config.dir}/bc.config" />
+ <property name="bc.config.file" location="${bc.build.dir}/bc_config.txt" />
<!-- Enables the Binary Comparison for libraries when set to true
@type boolean
@editable required
@scope public
-->
- <property name="bc.check.libraries.enabled" value="true" />
+ <property name="bc.check.libraries.enabled" value="false" />
- <!-- Defines the parameter that checkBC.py is called with
+ <!--* @property bc.lib.param.val
+ Defines which library files will be compared, user can define or leave as default value '-la'.
+ If the property 'bc.what.log.entry.enabled' is set to true 'bc.head.param.val' needs to be left unset.
-la (all libraries checked)
or -ls lib (single library checked) (lib = the name of library to check)
or -lm file.name (multiple libraries checked)
- the file.name is a file that contains the names of the library(ies) to check
+ the file.name is a file that contains the names of the library(ies) to check e.g.
+ property name="bc.lib.param.val" value="-ls J:\epoc32\release\armv5\lib\platsimopengles11.dso"
@type string
@editable required
@scope public
-->
- <property name="lib.param.val" value="-la" />
+ <!--* @property ca.enabled
+ when set to true enables the Compatibility Analyser code to function, when to to flase or not present CA is disabled
+ @type string
+ @editable required
+ @scope public
+ -->
+
+
<!-- Enables the Binary Comparison for headers when set to true
@type boolean
@editable required
@scope public
-->
- <property name="bc.check.headers.enabled" value="true" />
+ <property name="bc.check.headers.enabled" value="false" />
- <!-- Defines the parameter that checkBC.py is called with
+ <!--* @property bc.head.param.val
+ Defines which header files will be compared, user can define or leave as default value '-ha'.
+ If the property 'bc.what.log.entry.enabled' is set to true 'bc.head.param.val' needs to be left unset.
-ha (all headers checked)
or -hs file (single header checked) (file= name of header file to check)
or -hm file.name (multiple headers checked)
- the file.name is a file that contains the names of the header(s) to check
+ the file.name is a file that contains the names of the header(s) to check used when 'bc.what.log.entry.enabled' is set to 'true'.
+ e.g. property name="bc.head.param.val" value="-hs j:\epoc32\include\csy.rh
@type string
@editable required
@scope public
-->
- <property name="head.param.val" value="-ha" />
<!-- Adds this to the CA output file name to give it a unique name
@type string
@editable required
@scope public
-->
- <property name="bc.check.report.id" value="${build.name}_${build.number}" />
+ <property name="bc.check.report.id" value="${build.name}_${build.number}.xml" />
- <!-- Defines the location of CA output and the input for the diamonds creation target.
+ <!-- location of the config file that contains the values for checkbc.py config file (template.txt)
@type string
+ @editable required
+ @scope public
-->
- <property name="ido.ca.html.output.dir" location="${build.log.dir}/${build.id}_ca"/>
+ <property name="bc.prep.ca.file" location="./../ca.cfg.xml" />
+
+ <!-- Enables the use of whatlogentry (from the metadata DB) to generate the list of files
+ to be compared against the compiled code when set to true.
+ @type boolean
+ @editable required
+ @scope public
+ -->
+ <property name="bc.what.log.entry.enabled" value="false" />
+ <!--* @property bc.log.file.to.scan
+ the name of the log file that contains all the 'what' information. e.g. ${build.log.dir}/compile/${build.id}_dfs_build_armv5_compile.log
+ @type string
+ @editable required
+ @scope public
+ -->
+
+ <!-- If set to true fails the build if there is an error. If set to false does not fail the build if there is an error. Default value is false.
+ @type boolean
+ @editable required
+ @scope public
+ -->
+ <property name="bc.fail.on.error" value="false" />
+
+ <!-- check if it is enabled and set the flag to make the target run -->
<condition property="internal.run.ca">
<istrue value="${ca.enabled}" />
</condition>
+
+ <!-- create the parsed file name-->
+ <property name="prep.ca.conf.parsed" location="${bc.build.dir}\ca.cfg.xml.parsed" />
-<!-- static and dynamic BC Test target -->
- <target name="bc-check" if="internal.run.ca" >
- <!-- create BC dir -->
- <mkdir dir="${build.log.dir}/BC"/>
- <delete file="${bc.config.file}" quiet="true"/>
- <delete file="${build.log.dir}/BC/BBCResults.xsl" quiet="true"/>
+ <!-- the whatlogentry DB is scanned and the files written to the file named here -->
+ <var name="bc.db.output.file" value="" />
+
+ <!--location and name of the file that the checkbc.py script writes the output for the headers to
+ then used as the input to the target that summarises the output to go to diamonds -->
+ <property name="bc.header.output.file" location="${bc.build.dir}/ca_header_${bc.check.report.id}" />
+ <!--location and name of the file that the checkbc.py script writes the output for the libraries to
+ then used as the input to the target that summarises the output to go to diamonds -->
+ <property name="bc.library.output.file" location="${bc.build.dir}/ca_library_${bc.check.report.id}" />
- <copy file="${default.bc.config}" tofile="${bc.config.file}" failonerror="false" verbose="true"/>
+ <!--setup property so can be tested - location of the FMPP template file-->
+ <property name="ca.template.file" location="${helium.dir}/tools/common/templates/log/ca_content.txt.ftl" />
+
+ <property name="bc.template.macro" location="${helium.dir}/tools/common/templates/macro" />
+
+ <!-- scan the whatlogentry contents and retrieve the files to compare within the headers and libraries-->
+ <target name="get-whatlogentry-contents-for-ca" >
+ <fmpp sourceFile="${ca.template.file}"
+ outputfile="${bc.db.output.file}">
+ <freemarkerLinks expandProperties="yes">
+ macro: ${bc.template.macro}
+ </freemarkerLinks>
+ <data expandProperties="yes">
+ dbPath: ${build.log.dir}/${build.id}_metadata_db
+ logfilename: ${bc.log.file.to.scan}
+ checktype: ${bc.check.type}
+ ant: antProperties()
+ </data>
+ </fmpp>
+ </target>
+
+ <!--takes the ca BC config file and runs it through the parser to replace ant properties with
+ real values, taken out here so that some testing of the CA code can be done-->
+ <target name="parse-ca-config" >
+ <!-- run through the bc.prep.ca.file and replace all the ant properties with real values-->
+ <copy file="${bc.prep.ca.file}" tofile="${prep.ca.conf.parsed}" overwrite="true">
+ <filterchain>
+ <expandproperties />
+ </filterchain>
+ </copy>
+ <!-- run through the parsed bc.prep.ca.file and take the 'set' name and write this to a text file
+ with the '=' sign after it and write the 'set' value after the '=' sign. This is to create the
+ checkbc.py configuration file which contains all its configration values -->
+ <hlm:python>
+import configuration
+
+configBuilder = configuration.NestedConfigurationBuilder(open(r'${prep.ca.conf.parsed}', 'r'))
+configSet = configBuilder.getConfiguration()
+outputFile = open(r'${bc.config.file}', 'w')
+for config in configSet.getConfigurations('compatibility.analyser.cfg'):
+ for x in config.keys():
+ outputFile.write(x)
+ outputFile.write('=')
+ outputFile.write(config[x])
+ outputFile.write('\n')
+
+outputFile.close()
+ </hlm:python>
+ </target>
+
+ <!-- static and dynamic BC Test target -->
+ <target name="bc-check" if="internal.run.ca" >
+ <!-- create BC dir -->
+ <mkdir dir="${bc.build.dir}"/>
+ <delete file="${bc.config.file}" quiet="true"/>
+ <delete file="${bc.build.dir}/BBCResults.xsl" quiet="true"/>
<!--copy the CSS file to the output folder-->
- <copy file="${bctools.root}/reports/BBCResults.xsl" tofile="${build.log.dir}/BC/BBCResults.xsl" failonerror="false" verbose="true"/>
+ <copy file="${bc.tools.root}/reports/BBCResults.xsl" tofile="${bc.build.dir}/BBCResults.xsl"
+ failonerror="false" verbose="true"/>
- <if> <!--the library check enaled flag is set then run the check on the lirary files-->
+ <runtarget target="parse-ca-config" />
+
+ <if> <!--the library check enabled flag is set then run the check on the library files-->
<istrue value="${bc.check.libraries.enabled}"/>
<then>
- <exec executable="python" dir="${build.log.dir}/BC" failonerror="true">
- <arg value="${bctools.root}/CheckBC.py"/>
+ <if>
+ <!-- check to see if the whatlogentry needs to be scanned for list of files to compare
+ if it is not set then the bc.lib.param.val as defined by the user will be used-->
+ <istrue value="${bc.what.log.entry.enabled}"/>
+ <then>
+ <var name="bc.check.type" value="lib" />
+ <var name="bc.db.output.file" value="${bc.build.dir}/ca_libraries.txt" />
+ <runtarget target="get-whatlogentry-contents-for-ca" failonerror="${bc.fail.on.error}"/>
+ <property name="bc.lib.param.val" value="-lm ${bc.db.output.file}"/>
+ </then>
+ </if>
+ <condition property="bc.lib.param.val" value="-la">
+ <not>
+ <isset property="bc.lib.param.val" />
+ </not>
+ </condition>
+ <exec executable="python" dir="${build.log.dir}/bc" failonerror="${bc.fail.on.error}">
+ <arg value="${bc.tools.root}/CheckBC.py"/>
<arg value="${bc.config.file}"/>
- <arg line="${lib.param.val}"/>
+ <arg line="${bc.lib.param.val}"/>
<arg value="-f"/>
<arg value="${bc.check.report.id}"/>
</exec>
+ <copy file="${bc.tools.root}/reports/Libraries_CompatibilityReport_${bc.check.report.id}"
+ tofile="${bc.library.output.file}" />
</then>
</if>
<if> <!-- if the header check flag is set then run the checks on the headers-->
<istrue value="${bc.check.headers.enabled}"/>
<then>
- <exec executable="python" dir="${build.log.dir}/BC" failonerror="true">
- <arg value="${bctools.root}/CheckBC.py"/>
+ <if>
+ <!-- check to see if the whatlogentry needs to be scanned for list of files to compare
+ if it is not set then the bc.lib.param.val as defined by the user will be used-->
+ <istrue value="${bc.what.log.entry.enabled}"/>
+ <then>
+ <var name="bc.check.type" value="header" />
+ <var name="bc.db.output.file" value="${bc.build.dir}/ca_headers.txt" />
+ <runtarget target="get-whatlogentry-contents-for-ca" failonerror="${bc.fail.on.error}"/>
+ <property name="bc.head.param.val" value="-hm ${bc.db.output.file}"/>
+ </then>
+ </if>
+ <condition property="bc.head.param.val" value="-ha">
+ <not>
+ <isset property="bc.head.param.val" />
+ </not>
+ </condition>
+ <exec executable="python" dir="${build.log.dir}/bc" failonerror="${bc.fail.on.error}">
+ <arg value="${bc.tools.root}/CheckBC.py"/>
<arg value="${bc.config.file}"/>
- <arg line="${head.param.val}"/>
+ <arg line="${bc.head.param.val}"/>
<arg value="-f"/>
<arg value="${bc.check.report.id}"/>
</exec>
+ <copy file="${bc.tools.root}/reports/Headers_CompatibilityReport_${bc.check.report.id}"
+ tofile="${bc.header.output.file}" />
</then>
</if>
+ <runtarget target="ca-generate-diamond-summary" />
</target>
-
+ <!-- used to summarise the output of the CA and pass the summary on to Diamonds for display -->
<target name="ca-generate-diamond-summary" if="internal.run.ca">
<!--use the header.ftl template file to create the init part of the output file
that can be copied to the final output file by the java class-->
@@ -163,6 +293,7 @@
<fmpp sourcefile="${helium.dir}/tools/common/templates/diamonds/diamonds_footer.ftl"
outputfile="${temp.diamonds.footer.xml}" quiet="true"/>
+ <!-- just in case it does not exist-->
<mkdir dir="${diamonds.build.output.dir}" />
<if> <!-- if the header check flag is set then run the checks on the headers-->
@@ -171,8 +302,8 @@
<hlm:casummary diamondsHeaderFileName="${temp.diamonds.header.xml}" diamondsFooterFileName="${temp.diamonds.footer.xml}"
header="true"
outputFile="${diamonds.build.output.dir}/ca_summary_header.xml"
- inputFile="${bc.config.dir}/headers_report_${bc.check.report.id}.xml"
- />
+ inputFile="${bc.header.output.file}"
+ failOnError="${bc.fail.on.error}"/>
</then>
</if>
@@ -182,8 +313,8 @@
<hlm:casummary diamondsHeaderFileName="${temp.diamonds.header.xml}" diamondsFooterFileName="${temp.diamonds.footer.xml}"
header="false"
outputFile="${diamonds.build.output.dir}/ca_summary_library.xml"
- inputFile="${bc.config.dir}/libraries_report_${bc.check.report.id}.xml"
- />
+ inputFile="${bc.library.output.file}"
+ failOnError="${bc.fail.on.error}"/>
</then>
</if>
@@ -191,4 +322,5 @@
<delete file="${temp.diamonds.footer.xml}" failonerror="false" />
</target>
+
</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/compatibility_analyser/test/test_ca-bc.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+============================================================================
+Name : test_ca-bc.ant.xml
+Part of : Helium AntLib
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="test-ca-bc" xmlns:au="org.apache.ant.antunit" xmlns:hlm="http://www.nokia.com/helium">
+ <description>Helium antlib Quality Compatibility Analyser related tests.</description>
+
+
+ <taskdef resource="com/nokia/helium/quality/ant/antlib.xml" uri="http://www.nokia.com/helium" />
+ <!--place the output is written to-->
+ <property name="ca.output.dir" location="./output"/>
+ <!-- add the Ca folder to the output dir-->
+ <property name="build.log.dir" location="${ca.output.dir}/ca"/>
+ <!-- location and name of the bc.config file used by checkbc.py-->
+ <property name="bc.config.file" location="${build.log.dir}/bc.config" />
+ <!-- name of the parsed config file-->
+ <property name="prep.ca.conf.parsed" location="${build.log.dir}/ca.cfg.xml.parsed" />
+ <!--name of the ant CA config file-->
+ <property name="ca.ant.config.file" location="ca-ant-config.xml" />
+ <!-- used by the compatibility analyser to define the build log that is to be
+ scanned and the output used for the comparison-->
+ <property name="log.file.to.scan" location="${build.log.dir}/compile/${build.id}_armv5_compile.log" />
+
+ <!--setup property so can be tested - location of the FMPP template file-->
+ <property name="ca.template.file" location="./../../../common/templates/log/ca_content.txt.ftl" />
+
+ <property name="template.macro" location="./../../../common/templates/macro" />
+
+
+ <!--import the file under test-->
+ <import file="./../compatibility.ant.xml" />
+
+ <!-- is called prior to the test -->
+ <target name="setUp">
+ <delete dir="${build.log.dir}" failonerror="false" />
+ <mkdir dir="${build.log.dir}" />
+
+ </target>
+
+ <!-- is called after the test, even if that caused an error -->
+ <target name="tearDown">
+ <delete dir="${build.log.dir}" failonerror="false" />
+ </target>
+
+ <!-- tests part of the CA code that parses the input file-->
+ <target name="test-ca-parse-config" depends="parse-ca-config">
+
+ <au:assertFileExists file="${prep.ca.conf.parsed}" />
+ <au:assertFileExists file="${bc.config.file}" />
+ <loadfile property="ca.one.id" srcfile="${bc.config.file}">
+ <filterchain>
+ <replaceregex pattern="\\(:|\\)" replace="\1" flags="g" />
+ </filterchain>
+ </loadfile>
+ <echo>${ca.one.id}</echo>
+ <au:assertTrue message="file not parsed correctly">
+ <contains string="${ca.one.id}"
+ substring="BASELINE_NAME='SDK 3rd Edition'" />
+ </au:assertTrue>
+ <delete file="${prep.ca.conf.parsed}" quiet="true" />
+ <delete dir="${ca.output.dir}" quiet="true" />
+ </target>
+
+
+ <!--tests the scanning of the whatlog NOT WORKING YET-->
+ <!--target name="test_ftl_file_header">
+ <echo> helium dir = ${helium.dir} </echo>
+ <var name="check.type" value="header" />
+ <var name="bc.db.output.file" value="${build.log.dir}/ca_headers.txt" />
+ <runtarget target="get-whatlogentry-contents-for-ca" />
+ <au:assertFileExists file="${bc.db.output.file}"/>
+ </target>
+
+ <target name="test_ftl_file_lib">
+ <echo> helium dir = ${helium.dir} </echo>
+ <var name="check.type" value="lib" />
+ <var name="bc.db.output.file" value="${build.log.dir}/ca_libraries.txt" />
+ <runtarget target="get-whatlogentry-contents-for-ca" />
+ <au:assertFileExists file="${bc.db.output.file}"/>
+ </target-->
+
+</project>
\ No newline at end of file
--- a/buildframework/helium/tools/quality/cone-validate.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/quality/cone-validate.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -54,7 +54,7 @@
<mkdir dir="${temp.build.dir}" />
<tempfile property="cone.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}"/>
- <fmpp sourceFile="${helium.dir}/tools/common/templates/quality/cone-validate.xml.ftl"
+ <fmpp sourceFile="${helium.dir}/tools/quality/templates/cone-validate.xml.ftl"
outputfile="${cone.dynamic.config}">
<data expandProperties="yes">
ant: antProperties()
--- a/buildframework/helium/tools/quality/conflict-checker.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/quality/conflict-checker.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -81,7 +81,7 @@
<!-- Render the build duplicates xml file into an HTML output. -->
<target name="render-build-duplicates" depends="integration-build-duplicates" if="run.build.duplicates">
- <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/build-duplicates.html.ftl" outputFile="${build.log.dir}/${build.id}_build-duplicates.html">
+ <fmpp sourceFile="${helium.dir}/tools/quality/templates/build-duplicates.html.ftl" outputFile="${build.log.dir}/${build.id}_build-duplicates.html">
<freemarkerLinks expandProperties="yes">
macro: ${helium.dir}/tools/common/templates/macro
</freemarkerLinks>
--- a/buildframework/helium/tools/quality/internal-exports.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/quality/internal-exports.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -60,7 +60,7 @@
parser.parse()
for component in parser.internalexports.keys():
output.write(" <component name=\"%s\">\n" % component)
- output.write("".join(map(lambda x: " <file name=\"%s\"/>\n" % x, parser.internalexports[component])))
+ output.write("".join([" <file name=\"%s\"/>\n" % x for x in parser.internalexports[component]]))
output.write(" </component>\n")
output.write("</internalexports>\n")
output.close()
@@ -83,7 +83,7 @@
<!-- Render the build duplicates xml file into an HTML output. -->
<target name="render-internal-exports" depends="integration-internal-exports">
- <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/internal-exports.html.ftl"
+ <fmpp sourceFile="${helium.dir}/tools/quality/templates/internal-exports.html.ftl"
outputFile="${build.log.dir}/${build.id}_internal-exports.html">
<freemarkerLinks expandProperties="yes">
macro: ${helium.dir}/tools/common/templates/macro
--- a/buildframework/helium/tools/quality/lint.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/quality/lint.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -21,64 +21,7 @@
============================================================================
-->
<project name="lint" xmlns:hlm="http://www.nokia.com/helium"
- xmlns:cs="antlib:com.puppycrawl.tools.checkstyle">
-
- <!-- Run AntLint on project Ant XML files. -->
- <target name="antlint">
- <delete dir="${helium.build.dir}/jep"/>
- <delete dir="${helium.build.dir}/python"/>
- <delete dir="${helium.build.dir}/beanshell"/>
- <delete file="${helium.build.dir}/test_jython.xml"/>
- <mkdir dir="${helium.build.dir}/report/antlint" />
- <hlm:antlint>
- <fileset dir="${helium.dir}/tools">
- <include name="**/*.ant.xml"/>
- <include name="**/build.xml"/>
- <include name="**/*.antlib.xml"/>
- <exclude name="tests/**"/>
- <exclude name="**/test/test_*.xml"/>
- <exclude name="external/**"/>
- <exclude name="**/tests/data/**"/>
- <exclude name="build/**"/>
- </fileset>
- <hlm:checkTabCharacter severity="error" enabled="true"/>
- <hlm:checkPropertyName severity="warning" enabled="true" regexp="([a-z0-9[\\d\\_\\.\\@\\{\\}\\$]]*)" />
- <hlm:checkTargetName severity="warning" enabled="true" regexp="([a-z0-9[\\d\\-]]*)" />
- <hlm:checkIndentation severity="error" enabled="true"/>
- <hlm:checkPresetDefMacroDefName severity="warning" enabled="true" regexp="([a-z0-9][a-zA-Z0-9]*)" />
- <hlm:checkProjectName severity="warning" enabled="true" regexp="([a-z0-9[\\d\\.\\_\\-]]*)" />
- <hlm:checkDescription severity="warning" enabled="true"/>
- <hlm:checkFileName severity="warning" enabled="true" regexp="^build.xml$|ant.xml$|antlib.xml$" />
- <hlm:checkRunTarget severity="warning" enabled="true"/>
- <hlm:checkAntCall severity="warning" enabled="true"/>
- <hlm:checkScriptSize severity="warning" enabled="true"/>
- <hlm:checkUseOfIfInTargets severity="warning" enabled="true"/>
- <hlm:checkJythonScript severity="error" enabled="true" outputDir="${helium.build.dir}/jep"/>
- <hlm:checkScriptCondition severity="warning" enabled="true" outputDir="${helium.build.dir}/scriptcondition"/>
- <hlm:checkPythonTasks severity="warning" enabled="true" outputDir="${helium.build.dir}/python"/>
- <hlm:checkUseOfEqualsTask severity="warning" enabled="true"/>
- <hlm:checkScriptDefNameAttributes severity="error" enabled="true"/>
- <hlm:checkScriptDefStyle severity="warning" enabled="true"/>
- <hlm:checkScriptDef severity="error" enabled="true" outputDir="${helium.build.dir}/beanshell"/>
- <hlm:checkDuplicateNames severity="warning" enabled="true"/>
-
- <!-- Reporters -->
- <hlm:antlintCheckstyleReporter file="${helium.build.dir}/report/antlint/antlint_report.xml" />
- <hlm:antlintConsoleReporter />
- </hlm:antlint>
- <fileset id="jep.files" dir="${helium.build.dir}">
- <include name="jep/**/*.py"/>
- <include name="python/**/*.py"/>
- </fileset>
- <antcall target="pylint" inheritRefs="true">
- <reference refid="jep.files" torefid="python.files" />
- </antcall>
- <cs:checkstyle config="${helium.dir}/builder/java/config/java_checkstyle_config.xml">
- <fileset dir="${helium.build.dir}/beanshell" includes="**/*.java"/>
- <formatter type="plain"/>
- </cs:checkstyle>
- </target>
-
+ xmlns:cs="antlib:com.puppycrawl.tools.checkstyle">
<!-- Checks FTL files for lint issues. -->
<target name="ftllint">
--- a/buildframework/helium/tools/quality/mmp-to-target.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/quality/mmp-to-target.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -61,12 +61,13 @@
for filename in ds.getIncludedFiles():
filename = os.path.join(str(ds.getBasedir()), str(filename))
project.log("Analysing %s" % filename, 4)
- input = open(filename, 'r')
- for line in input.readlines():
+ inputfile = open(filename, 'r')
+ for line in inputfile.readlines():
m = match_target.match(line)
# do not match resource files.
if m != None and os.path.splitext(m.group(1))[1].lower() != ".rsc":
output.write("%s : %s\n" % (os.path.splitdrive(filename)[1], m.group(1)))
+ inputfile.close()
output.close()
]]>
</scriptdef>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/templates/build-duplicates.html.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,58 @@
+<#--
+============================================================================
+Name : build-duplicates.html.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+ <#include "/@macro/logger/logger.ftl" />
+ <head>
+ <title>Build duplicates</title>
+ <@helium_logger_html_head/>
+ </head>
+ <body>
+
+<#macro printconflict node>
+ <#assign helium_node_id = helium_node_id + 1>
+ <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.@name}">
+ <@helium_message_box nodeid="${helium_node_id}" type="conflict" count=node[".//component"]?size/>
+ </@helium_logger_node_head>
+ <@helium_logger_node_content nodeid="${helium_node_id}">
+ <#list node[".//component"] as component>
+ <@helium_logger_print type="conflict">
+ <a href="${component.@name}">${component.@name}</a>
+ </@helium_logger_print>
+ </#list>
+ </@helium_logger_node_content>
+</#macro>
+
+
+ <@helium_logger_header title="${ant['build.id']} build"/>
+
+
+ <@helium_logger_content title="Errors and warnings details">
+ <#list doc.buildconflicts["./file"] as conflict>
+ <@printconflict conflict/>
+ </#list>
+ </@helium_logger_content>
+
+ </body>
+</html>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/templates/cone-validate.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,58 @@
+<#--
+============================================================================
+Name : cone-validate.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+
+<project name="cone-validate" default="all">
+
+ <target name="product-cone-validate">
+ <#if os?lower_case?starts_with('win')>
+ <#assign exe_file="cmd.exe"/>
+ <#else>
+ <#assign exe_file="bash"/>
+ </#if>
+ <#list ant['product.list']?split(',') as product>
+ <sequential>
+ <echo>Validating cone configuration for ${product}_root.confml</echo>
+ <exec executable="${exe_file}" dir="${ant['build.drive']}/epoc32/tools" failonerror="false">
+ <#if os?lower_case?starts_with('win')>
+ <arg value="/c"/>
+ <arg value="cone.cmd"/>
+ <#else>
+ <arg value="cone"/>
+ </#if>
+ <arg value="validate" />
+ <arg value="--project"/>
+ <arg value="${ant['build.drive']}/epoc32/rom/config"/>
+ <arg value="--configuration"/>
+ <arg value="${product}_root.confml"/>
+ <arg value="--report-type"/>
+ <arg value="xml" />
+ <arg value="--report"/>
+ <arg value="${ant['post.log.dir']}/${ant['build.id']}_validate_cone_${product}.xml" />
+ </exec>
+ </sequential>
+ </#list>
+ </target>
+
+ <target name="all" depends="product-cone-validate" />
+</project>
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/templates/internal-exports.html.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,57 @@
+<#--
+============================================================================
+Name : internal-exports.html.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+ <#include "/@macro/logger/logger.ftl" />
+ <head>
+ <title>Internal Exports</title>
+ <@helium_logger_html_head/>
+ </head>
+ <body>
+
+<#macro printconflict node>
+ <#assign helium_node_id = helium_node_id + 1>
+ <@helium_logger_node_head nodeid="${helium_node_id}" title="${node.@name}">
+ <@helium_message_box nodeid="${helium_node_id}" type="InternalExport" count=node[".//file"]?size/>
+ </@helium_logger_node_head>
+ <@helium_logger_node_content nodeid="${helium_node_id}">
+ <#list node[".//file"] as file>
+ <@helium_logger_print type="InternalExport">
+ <a href="${file.@name}">${file.@name}</a>
+ </@helium_logger_print>
+ </#list>
+ </@helium_logger_node_content>
+</#macro>
+
+
+ <@helium_logger_header title="${ant['build.id']} build"/>
+
+ <@helium_logger_content title="Errors and warnings details">
+ <#list doc.internalexports["./component"] as component>
+ <@printconflict component/>
+ </#list>
+ </@helium_logger_content>
+
+ </body>
+</html>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/templates/validate-policy.log.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,43 @@
+<#--
+============================================================================
+Name : validate-policy.log.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+CSV validation:
+<#list doc["./policyvalidation/error[@type='unknownstatus']"] as unknownstatus>
+ ${unknownstatus.@message} (${unknownstatus.@value})
+</#list>
+
+Errors:
+<#list doc["./policyvalidation/error"] as error>
+ <#if error.@type=='A' || error.@type=='B' || error.@type=='C' || error.@type=='D'>
+ ${error.@type} Found incorrect for ${error.@message?replace('([\\\\/][^\\\\/]+?)$', '', 'ris')}, ${error.@value}
+ </#if>
+</#list>
+
+Missing policy files in:
+<#list doc["./policyvalidation/error[@type='missing']"] as missing>
+ ${missing.@message}
+</#list>
+
+
+Incorrect policy files in:
+<#list doc["./policyvalidation/error[@type='invalidencoding']"] as error>
+ ${error.@message}
+</#list>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/quality/templates/validate-policy.log.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,49 @@
+<#--
+============================================================================
+Name : validate-policy.log.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0" encoding="utf-8"?>
+<log filename="${ant['validate.policy.log']}">
+ <build>
+ <task name="CSV validation">
+<#list doc["./policyvalidation/error[@type='unknownstatus']"] as unknownstatus>
+ <message priority="error"><![CDATA[${unknownstatus.@message} (${unknownstatus.@value})]]></message>
+</#list>
+ </task>
+ <task name="Issues">
+<#list doc["./policyvalidation/error"] as error>
+ <#if error.@type=='A' || error.@type=='B' || error.@type=='C' || error.@type=='D'>
+ <message priority="error"><![CDATA[${error.@type} Found incorrect for ${error.@message?replace('([\\\\/][^\\\\/]+?)$', '', 'ris')}, ${error.@value}]]></message>
+ </#if>
+</#list>
+ </task>
+ <task name="Missing">
+Missing policy files in:
+<#list doc["./policyvalidation/error[@type='missing']"] as missing>
+ <message priority="error"><![CDATA[${missing.@message}]]></message>
+</#list>
+ </task>
+ <task name="Incorrect policy files">
+<#list doc["./policyvalidation/error[@type='invalidencoding']"] as error>
+ <message priority="error"><![CDATA[${error.@message}]]></message>
+</#list>
+ </task>
+ </build>
+</log>
--- a/buildframework/helium/tools/quality/validate-policy.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/quality/validate-policy.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -219,7 +219,7 @@
Render the policy validation xml file ('validate.policy.log') into an text output.
-->
<target name="render-validate-policy" depends="integration-validate-policy">
- <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/validate-policy.log.ftl" outputFile="${post.log.dir}/${build.id}_validate-policy.log">
+ <fmpp sourceFile="${helium.dir}/tools/quality/templates/validate-policy.log.ftl" outputFile="${post.log.dir}/${build.id}_validate-policy.log">
<freemarkerLinks expandProperties="yes">
macro: ${helium.dir}/tools/common/templates/macro
</freemarkerLinks>
@@ -228,7 +228,7 @@
ant: antProperties()
</data>
</fmpp>
- <fmpp sourceFile="${helium.dir}/tools/common/templates/integration/validate-policy.log.xml.ftl" outputFile="${validate.policy.log.xml}">
+ <fmpp sourceFile="${helium.dir}/tools/quality/templates/validate-policy.log.xml.ftl" outputFile="${validate.policy.log.xml}">
<freemarkerLinks expandProperties="yes">
macro: ${helium.dir}/tools/common/templates/macro
</freemarkerLinks>
@@ -249,9 +249,11 @@
</target>
<!-- Policy validation target for IDO. Only detected ADO will get scanned. -->
- <target name="ido-validate-policy" depends="ido-create-ado-mapping" if="internal.policy.file.validation.enabled">
+ <target name="ido-validate-policy" if="internal.policy.file.validation.enabled">
+ <property name="policy.mapping.file" location="${build.output.dir}/build/ado_mapping_policy.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${policy.mapping.file}" mapForQuality="true"/>
<hlm:record name="${temp.build.dir}/${build.id}_validate-policy.ant.log" action="start" />
- <hlm:iniKeys2Path ini="${ado.quality.mapping.file}" pathid="reference.policy.path.list"/>
+ <hlm:iniKeys2Path ini="${policy.mapping.file}" pathid="reference.policy.path.list"/>
<runtarget target="render-validate-policy" />
<hlm:record name="${temp.build.dir}/${build.id}_validate-policy.ant.log" action="stop" />
</target>
--- a/buildframework/helium/tools/release/release.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/release/release.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -32,43 +32,7 @@
@type string
@scope private
-->
- <property name="release.log.dir" location="${build.log.dir}/release"/>
-
-
- <!--* @property release.grace.service
- The Grace service used
- @type string
- @editable required
- @scope public
- -->
-
- <!--* @property release.grace.product
- The Grace product used
- @type string
- @editable required
- @scope public
- -->
-
- <!--* @property release.grace.mail.to
- To whom the completion mail is sent to
- @type string
- @editable required
- @scope public
- -->
-
- <!--* @property release.grace.mail.subject
- The subject of the Grace upload completion mail
- @type string
- @editable required
- @scope public
- -->
-
- <!--* @property release.grace.mail.message
- The message contents of the Grace upload completion mail
- @type string
- @editable required
- @scope public
- -->
+ <property name="release.log.dir" location="${build.log.dir}/release"/>
<!--* @property robot.release.enabled
Set to true to do build robot release after completing the build and if it successful.
@@ -94,13 +58,10 @@
<!-- Check, is robot release is enabled -->
<condition property="internal.robot.release.enabled">
- <and>
- <or>
- <istrue value="${robot.release.enabled}"/>
- <isset property="do.robot.release"/>
- </or>
- <isset property="s60.build.robot.path"/>
- </and>
+ <or>
+ <istrue value="${robot.release.enabled}"/>
+ <isset property="do.robot.release"/>
+ </or>
</condition>
<fileset id="release.files" dir="${publish.dir}">
@@ -152,16 +113,15 @@
mconfigstr = project.getProperty('s60.build.robot.date')
if mconfigstr != None:
for configstr in mconfigstr.split(';'):
- config = map(lambda x: x.strip(), configstr.split(','))
- try:
- if ido.is_in_interval(int(config[0]), config[1], int(config[2]), config[3]):
- self.log("It is release time!")
- projects.append(config[4])
- project.setProperty('robot.release.project', ",".join(projects))
- else:
- self.log("It is not release time!")
- except Exception, e:
- self.log("'%s' invalid configuration." % configstr)
+ config = [x.strip() for x in configstr.split(',')]
+ if len(config) < 4:
+ raise Exception(configstr + ' is invalid config')
+ if ido.is_in_interval(int(config[0]), config[1], int(config[2]), config[3]):
+ self.log("It is release time!")
+ projects.append(config[4])
+ project.setProperty('robot.release.project', ",".join(projects))
+ else:
+ self.log("It is not release time!")
else:
self.log("'s60.build.robot.date' is not defined.")
]]>
@@ -173,19 +133,21 @@
zip them all and send to the specified location. There is only one but mandatory
property to tell the location of the build server which is "s60.build.robot.path".
-->
- <target name="ido-sources-to-s60-build-robot" if="internal.robot.release.enabled" depends="ido-create-ado-mapping,check-robot-release,lookup-email">
+ <target name="ido-sources-to-s60-build-robot" if="internal.robot.release.enabled" depends="check-robot-release,lookup-email">
<if>
<isset property="robot.release.project"/>
<then>
+ <property name="robot.mapping.file" location="${build.output.dir}/build/ado_mapping_robot.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${robot.mapping.file}" />
<!-- Location of the ready.txt FMPP template (override that property if you want to customize the content).
@type string
@scope private
-->
- <property name="ido.template.robot.ready" location="${helium.dir}/tools/common/templates/ido/ready.txt.ftl" />
+ <property name="ido.template.robot.ready" location="${helium.dir}/tools/release/templates/ready.txt.ftl" />
<tempfile property="s60robot.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}" />
- <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-robot-zip.ant.xml.ftl" outputFile="${s60robot.dynamic.config}">
+ <fmpp sourceFile="${helium.dir}/tools/release/templates/ido-robot-zip.ant.xml.ftl" outputFile="${s60robot.dynamic.config}">
<data expandProperties="yes">
- inputfile: antProperty(ado.mapping.file)
+ inputfile: antProperty(robot.mapping.file)
ant: antProperties()
data: eval('
java.io.FileInputStream pin = new java.io.FileInputStream(filename);
--- a/buildframework/helium/tools/release/scm_release.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/release/scm_release.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -40,7 +40,7 @@
* update
* maintain the work area
-->
- <target name="release-work-area">
+ <target name="release-work-area" if="internal.ccm.enabled">
<mkdir dir="${release.log.dir}" />
<hlm:record name="${release.log.dir}/${build.id}_release_work_area.log" action="start"/>
<runtarget target="get-ccm-password"/>
@@ -61,25 +61,14 @@
# enabling logging
logging.basicConfig(level=logging.INFO)
-builder = None
+configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
+configSet = configBuilder.getConfiguration()
+password = ant.get_property(r'${ccm.user.password}')
+builder = preparation.PreparationBuilder(configSet.getConfigurations(), ant.get_property(r'${ccm.user.login}'), password, cache=ant.get_property(r'${ccm.cache.xml}'))
try:
- configBuilder = configuration.NestedConfigurationBuilder(open(ant.get_property(r'${prep.delivery.conf.parsed}'), 'r'))
- configSet = configBuilder.getConfiguration()
- password = ant.get_property(r'${ccm.user.password}')
- builder = preparation.PreparationBuilder(configSet.getConfigurations(), ant.get_property(r'${ccm.user.login}'), password, cache=ant.get_property(r'${ccm.cache.xml}'))
builder.extract_release_data(r'${release.log.dir}/${build.id}_releasable.xml')
+finally:
builder.close()
-except Exception, e:
- print "ERROR: error found during preparation phase:"
- for l in traceback.format_exc().splitlines(False):
- print "ERROR: %s" % l
- print "ERROR: this is a critical error, build will fail now:"
- for l in str(e).splitlines(False):
- print "ERROR: %s" % l
- if builder != None:
- builder.close()
- sys.exit(-1)
-sys.exit(0)
</hlm:python>
</try>
<finally>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/release/templates/ido-robot-zip.ant.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,46 @@
+<#--
+============================================================================
+Name : ido-robot-zip.ant.xml.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<?xml version="1.0"?>
+<project name="ido-zip" default="all">
+ <target name="all">
+ <delete file="${ant['build.output.dir']}/s60Sources.7z" failonerror="false"/>
+ <#if ((data?keys?size > 0) && (ant['robot.release.project']?split(';')?size > 0))>
+ <#list data?keys as name>
+ <#list ant['robot.release.project']?split(',') as project>
+ <#if name?replace('\\', '/')?lower_case?contains("/${project}/${project}"?lower_case)>
+ <#-- 7za u test.7z output/analysisdata/ -->
+ <exec executable="7za" dir="${name}/../">
+ <arg value="u"/>
+ <arg value="-xr!*/internal/*"/>
+ <arg value="-xr!*/doc/*"/>
+ <arg value="-xr!_ccmwaid.inf"/>
+ <arg value="-xr!abld.bat"/>
+ <arg value="${ant['build.output.dir']}/s60Sources.7z"/>
+ <arg value="${name?split("/")?last}/"/>
+ </exec>
+ </#if>
+ </#list>
+ </#list>
+ </#if>
+ <copy todir="${ant['s60.build.robot.path']}" file="${ant['build.output.dir']}/s60Sources.7z" failonerror="false" />
+ </target>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/release/templates/ready.txt.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+<#--
+============================================================================
+Name : ready.txt.ftl
+Part of : Helium
+
+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 the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+ido_name:${ant['build.name']}
+date(gt):${pp.now?string("EEE MMM d HH:mm:ss yyyy")}
+source_path:${ant['ccm.project.wa_path']}
+<#if ant?keys?seq_contains('email.from')>email:${ant['email.from']}</#if>
+<#if ant?keys?seq_contains('robot.email.to')><#list ant['robot.email.to']?split(',') as email>
+email:${email}
+</#list></#if>
+
--- a/buildframework/helium/tools/release/templates/release_ccm_project.ant.xml.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/release/templates/release_ccm_project.ant.xml.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -1,6 +1,6 @@
<#--
============================================================================
-Name : modificationset.log.xml.ftl
+Name : release_ccm_project.ant.xml.ftl
Part of : Helium
Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
--- a/buildframework/helium/tools/relnotes/relnotes.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/relnotes/relnotes.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -207,10 +207,7 @@
print 'Error: ' + waroot + ' must be a synergy project and still be in database'
else:
project.setProperty("ccm.toplevel.project", str(cmproject))
- session.close()
-except Exception, ex:
- print 'Caught exception: ' + str(ex)
- traceback.print_exc()
+finally:
if session:
session.close()
</script>
@@ -230,10 +227,7 @@
session = ccmutil.get_session(database, username, password, engine, dbpath)
cmproject = session.create(ant.get_property(r'${ccm.toplevel.project}'))
print cmproject.baseline
- session.close()
-except Exception, ex:
- print 'Caught exception: ' + str(ex)
- traceback.print_exc()
+finally:
if session:
session.close()
</hlm:python>
--- a/buildframework/helium/tools/rombuild/features/helium_upct.mk Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/rombuild/features/helium_upct.mk Mon Oct 18 10:23:52 2010 +0100
@@ -127,7 +127,7 @@
%-create-upct-config:
@echo Building $*
- -@imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f /epoc32/rom/config/helium_upct.mk -f $* step-CREATE_UPCT_CONF
+ -@imaker -p$(PRODUCT_NAME) -f /epoc32/rom/config/helium_upct.mk -f $* step-CREATE_UPCT_CONF
create-upct-configs: $(foreach config,$(ALL_UPCT_CONFS),$(config)-create-upct-config)
@@ -140,7 +140,7 @@
%-create-makeupct-config:
@echo Building $*
- -@imaker -p$(PRODUCT_NAME) -c$(COREPLAT_NAME) -f /epoc32/rom/config/helium_upct.mk -f $* step-MAKEUPCT_FOTA_CNF
+ -@imaker -p$(PRODUCT_NAME) -f /epoc32/rom/config/helium_upct.mk -f $* step-MAKEUPCT_FOTA_CNF
create-makeupct-configs: $(foreach config,$(ALL_MAKEUPCT_CONFS),$(config)-create-makeupct-config)
--- a/buildframework/helium/tools/rombuild/imaker.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/rombuild/imaker.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -29,7 +29,7 @@
<!--* @property imaker.engine
Defines which accelerator to use for running iMaker. (default value from build.system property)
@type string
- @scope private
+ @scope public
-->
<condition property="imaker.engine" value="imaker.engine.ec" else="imaker.engine.default">
@@ -116,7 +116,7 @@
@type string
@scope private
-->
- <property name="rombuild.buildinfo.output" location="${build.drive}${env.EPOCROOT}epoc32/rom/config/image_conf_buildinfo.mk" />
+ <property name="rombuild.buildinfo.output" location="${build.drive}/epoc32/rom/config/image_conf_buildinfo.mk" />
<fmpp sourceFile="${rombuild.buildinfo.template}" outputFile="${rombuild.buildinfo.output}">
<data expandProperties="yes">
ant: antProperties()
--- a/buildframework/helium/tools/testing/ats/ats.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/testing/ats/ats.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -25,7 +25,7 @@
<description>
ATS testing targets.
</description>
-
+
<!--* @property ats.enabled
Value must be set to execute ats-test target.
@type boolean
@@ -34,12 +34,88 @@
@since 11.0
-->
+ <!--* @property ats.bootuptest.enabled
+ Value must be set to execute ats-bootup-test target.
+ @type boolean
+ @scope public
+ @since 12.0
+ -->
+
<!--* @property internal.ats.enabled
Set to run ats targests if ats.enabled set to true.
@type boolean
@scope private
-->
+
+ <!--* @property ats.aste.testasset.location
+ Location of SW Test Assets, if the TestAsset is not packaged then it is first compressed to a .zip file. It should be a UNC path.
+ @type string
+ @editable required
+ @scope public
+ -->
+
+ <!--* @property eunit.test.package
+ The EUnit package name to be unzipped on the environment, for executing EUnit tests.
+ @type string
+ @scope public
+ -->
+
+ <!--* @property ats.script.type
+ There are two types of ats script files to send drop to ATS server, runx and import; only difference is that with import ATS doesn't have to have access rights to testdrop.zip file, as it is sent to the system over http and import doesn't need network shares. If that is not needed import should not be used. Default value is runx as import involves heavy processing on ATS server.
+ @type string
+ @scope public
+ -->
+
+ <!--* @property tsrc.path.list
+ Contains list of the tsrc directories. Gets the list from system definition layer files. Assuming that the test components are defined already in te layers.sysdef.xml files to get compiled. Not recommended, but the property value can be set if there are no System Definition file(s), and tsrc directories paths to set manually.
+ @type string
+ @scope public
+ -->
+
+ <!--* @property ats.diamonds.signal
+ Should be true so at end of the build diamonds is checked for test results and Helium fails if tests failed.
+ @type string
+ @scope public
+ -->
+
+ <!-- Contains a test filterset name. A filterset is used to select/unselect test components. The filter(s) is/are effective when the same filters are defined in the package definition file for component(s).
+ @type string
+ @editable required
+ @scope public
+ @since 10.79
+ -->
+ <property name="ats.test.filterset" value="sysdef.filters.test" />
+ <hlm:sysdefFilterSet id="sysdef.filters.test" >
+ <filter filter="test" />
+ </hlm:sysdefFilterSet>
+ <!--* @property tdriver.asset.location
+ The location of the test asset where ruby test files, sip profiles, hardware data etc are located.
+ @type string
+ @editable required
+ @scope public
+ -->
+
+ <!--* @property tdriver.test.profiles
+ Test profiles to be executed should be mentioned in this comma separated list e.g., 'bat, fute'.
+ @type string
+ @editable required
+ @scope public
+ -->
+
+ <!--* @property tdriver.tdrunner.enabled
+ Mustbe set to 'true' if TDrunner is engine is to be used. If true .sip files are used otherwise .rb (ruby) files are used to execute tests.
+ @type boolean
+ @editable required
+ @scope public
+ -->
+
+ <!--* @property tdriver.template.file
+ Location of the TDriver template file if user wants to use own template file instead of the default one.
+ @type string
+ @scope public
+ -->
+
<!--* @property enabled.ats
Value must be set to execute ats-test target. - deprecated: Start using ats.enabled property.
@type boolean
@@ -77,12 +153,19 @@
@scope public
@since 11.0
-->
-
+
<!--* @property internal.ats4.enabled
Set if ats4.enabled is set to true. To run ats4 dependent targets.
@type boolean
@scope private
-->
+
+ <!-- Execute test cases using stf on ats4. Defaults to True, Set it to False if you do not want to enable stf.
+ @type boolean
+ @scope public
+ @since 12.0
+ -->
+ <property name="ats.stf.enabled" value="true"/>
<!--* @property ats.product.name
Name of the product to be tested. For example: "PRODUCT"
@@ -106,14 +189,14 @@
-->
<!--* @property ats.password
- Password for ATS. This password might be different from NOE or HTTP/UNIX password.
+ Password for ATS3. This password might be different from NOE or HTTP/UNIX password.
@type string
@editable required
@scope public
-->
<!--* @property ats.username
- Username for ATS server. This is NOT the NOE or HTTP/UNIX username.
+ Username for ATS3 server. This is NOT the NOE or HTTP/UNIX username.
@type string
@editable required
@scope public
@@ -163,16 +246,16 @@
@deprecated since 11.0
-->
- <!--* @property matti.enabled
- Value must be set to true to enable testing with matti.
+ <!--* @property ats.tdriver.enabled
+ Value must be set to true to enable testing with TDriver.
@type boolean
@editable required
@scope public
@since 11.0
-->
- <!--* @property internal.matti.enabled
- Set to run matti targets if matti.enabled is set to true.
+ <!--* @property internal.ats.tdriver.enabled
+ Set to run TDriver targets if ats.tdriver.enabled is set to true.
@type boolean
@scope private
-->
@@ -185,12 +268,6 @@
@since 11.0
-->
- <!--* @property ats.delta.enabled
- Set to run ats delta target if ats.delta.enabled set to true.
- @type boolean
- @scope private
- -->
-
<!--* @property ats.disable.java.importer
To disable java importer for ats. - deprecated: Start using ats.java.importer.enabled property.
@type boolean
@@ -199,7 +276,7 @@
@deprecated since 11.0
-->
- <!-- To disable java importer for ats
+ <!-- To disable java importer for ats3
@type boolean
@editable required
@scope public
@@ -277,12 +354,17 @@
<isset property="enabled.aste"/>
</or>
</condition>
-
+
+ <!-- Check if bootup testing is enabled -->
+ <condition property="internal.ats.bootuptest.enabled">
+ <istrue value="${ats.bootuptest.enabled}" />
+ </condition>
+
<!-- Check is the ast4 enabled -->
<condition property="internal.ats4.enabled" value="true" else="false">
<istrue value="${ats4.enabled}" />
</condition>
-
+
<!-- Check is the ats emulator enabled -->
<condition property="internal.ats.emulator.enabled">
<or>
@@ -291,9 +373,13 @@
</or>
</condition>
- <!-- Check is the ats matti enabled -->
- <condition property="internal.matti.enabled">
- <istrue value="${matti.enabled}" />
+ <!-- Check is the ats TDriver enabled -->
+ <condition property="internal.ats.tdriver.enabled">
+ <or>
+ <istrue value="${ats.tdriver.enabled}" />
+ <istrue value="${tdriver.enabled}" />
+ <istrue value="${matti.enabled}" />
+ </or>
</condition>
<!-- Check is the ats ats delta enabled -->
@@ -321,7 +407,21 @@
</or>
</condition>
+ <!-- Should be "true" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Default value is "false", the values are case-sensitive.
+ @type boolean
+ @editable required
+ @scope public
+ -->
+ <property name="ats.ctc.enabled" value="false"/>
+ <!--* @property internal.ats.ctc.enabled
+ Set to run the ats ctc targets.
+ @type boolean
+ @scope private
+ -->
+ <condition property="internal.ats.ctc.enabled">
+ <istrue value="${ats.ctc.enabled}" />
+ </condition>
<!-- -->
<fileset id="reference.ats.flash.images" dir="${release.images.dir}">
@@ -345,7 +445,7 @@
<fileset id="reference.ats.sis.images" dir="${ats.sis.images.dir}">
<include name="**/*.sis" />
</fileset>
- <!-- Limit of minimum number of sis files to execute matti-test target, otherwise MATTI-drop.zip will not be generated. Default value is "1" files.
+ <!-- Limit of minimum number of sis files to execute tdriver-test target, otherwise TDriver-drop.zip will not be generated. Default value is "1" files.
@type string
@scope public
-->
@@ -406,20 +506,26 @@
<hlm:generateBuildStatus file="${test.log.dir}/${build.id}_aste.log" />
</target>
- <!-- The target creates the MATTI_drop.zip file including test.xml for MATTI tests. This target is executable.-->
- <target name="matti-test" if="internal.matti.enabled">
+ <!-- Old target for tdriver-test. Deprecated in Helium 12 -->
+ <target name="matti-test">
+ <runtarget target="tdriver-test" />
+ </target>
+
+ <!-- The target creates the TDriver_drop.zip file including test.xml for TDriver tests. This target is executable.-->
+ <target name="tdriver-test" if="internal.ats.tdriver.enabled">
<mkdir dir="${test.log.dir}"/>
<runtarget target="load-property-from-cache-file" />
<hlm:filterRecordStartMacro pattern="${ats.password}" category="ats"/>
- <runtarget target="do-ats-matti" />
- <hlm:filterRecordStopMacro log="${test.log.dir}/${build.id}_matti.log" append="false"/>
+ <runtarget target="copy-mon-sym" />
+ <runtarget target="do-ats-tdriver" />
+ <hlm:filterRecordStopMacro log="${test.log.dir}/${build.id}_tdriver.log" append="false"/>
<hlm:metadatarecord database="${metadata.dbfile}">
<hlm:textmetadatainput>
- <fileset casesensitive="false" file="${test.log.dir}/${build.id}_matti.log" />
- <metadatafilterset refid="filterset.matti" />
+ <fileset casesensitive="false" file="${test.log.dir}/${build.id}_tdriver.log" />
+ <metadatafilterset refid="filterset.tdriver" />
</hlm:textmetadatainput>
</hlm:metadatarecord>
- <hlm:generateBuildStatus file="${test.log.dir}/${build.id}_matti.log" />
+ <hlm:generateBuildStatus file="${test.log.dir}/${build.id}_tdriver.log" />
</target>
<!-- Sends drop file to ATS/ASTE. Please see `ats-test` for description. -->
@@ -455,6 +561,7 @@
<condition property="ats4.libs" value="${helium.dir}/extensions/nokia/external/ats4" else="${helium.dir}/external/antlibs">
<available type="dir" file="${helium.dir}/extensions/nokia/external/ats4"/>
</condition>
+ <echo message="Uploading using: -url http://${ats.server}/ServerService -path ${ats.drop.location.file} ${ats.import.arg}"/>
<java classname="com.nokia.ats.util.server.CommandLineClient" fork="true" maxmemory="1024m" failonerror="true">
<classpath>
<pathelement path="${java.class.path}"/>
@@ -511,7 +618,7 @@
ic = None
try:
ic = atsant.IConfigATS(project.getProperty('release.images.dir'), project.getProperty('ats.product.name'))
- except Exception, ex:
+ except IOError, ex:
print ex
if ic:
project.setProperty('ats.flash.images', ic.findimages())
@@ -538,6 +645,11 @@
<!-- Sets values common for ATS, this is a dependent target and shouldn't be used as an individual target -->
<target name="ats-common">
<property name="ats.config.file" value="" />
+
+ <!-- Text in name of PKG files to use eg. 'sanity' would only use xxxsanity.pkg files from components.
+ @type string
+ @scope public
+ -->
<property name="ats.specific.pkg" value="" />
<!-- Product HardWare ID (HWID) attached to ATS. By default the value of HWID is not set.
@@ -615,30 +727,17 @@
@editable required
-->
<property name="ats.trace.enabled" value="false"/>
-
- <!-- Should be "true" if coverage measurement and dynamic analysis (CTC) tool support is to be used by ATS. Default value is "false", the values are case-sensitive.
+ <!-- Should be ``true`` so a set is used for each pkg file in a component, this allows tests to run in parallel on several devices.
@type boolean
- @editable required
- @scope public
- -->
- <property name="ats.ctc.enabled" value="false"/>
-
- <!--* @property internal.ats.ctc.enabled
- Set to run the ats ctc targets.
- @type boolean
- @scope private
- -->
- <condition property="internal.ats.ctc.enabled">
- <istrue value="${ats.ctc.enabled}" />
- </condition>
-
- <!-- Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to "/E S60AppEnv /R Off".
- @type boolean
- @editable required
@scope public
-->
<property name="ats.multiset.enabled" value="false"/>
-
+
+ <!-- Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to "/E S60AppEnv /R Off".
+ @type string
+ @editable required
+ @scope public
+ -->
<property name="eunitexerunner.flags" value="/E S60AppEnv /R Off" />
<!--* @property ats.obey.pkgfiles.rule.enabled
@@ -685,10 +784,32 @@
<!-- Sets default values for the ASTE, this is a dependent target and shouldn't be used as an individual target -->
<target name="ats-set-defaults-aste" depends="ats-common">
<var name="ats.drop.file" value="ATSAsteDrop.zip" />
+ <!-- Type of test to run. Default is 'smoke'.
+ @type string
+ @scope public
+ -->
<property name="ats.aste.test.type" value="smoke" />
+ <!-- These are the cases that which tests should be run from the TestAsset. For example, value can be set as 100,101,102,103,105,106,. A comma is needed to separate case IDs
+ @type string
+ @scope public
+ -->
<property name="ats.aste.testasset.caseids" value="100,101,102,103,105,106,107,108,109,110,111,112,113,114,115" />
+ <!-- Version of the software to be tested. For example: 'W81'
+ @type string
+ @editable required
+ @scope public
+ -->
<property name="ats.aste.software.version" value="${build.id}" />
+ <!-- Variant Language to be tested. Default is 'English'
+ @type string
+ @scope public
+ -->
<property name="ats.aste.language" value="English" />
+ <!-- Flash images releases, for example 'SPP 51.32'.
+ @type string
+ @editable required
+ @scope public
+ -->
<property name="ats.aste.software.release" value="${build.name}" />
<!-- Modify the plan name if you have understanding of test.xml file or leave it as it is. Default value is "plan"
@type string
@@ -802,8 +923,10 @@
<arg value="--config=${ats.config.file}" />
<arg value="--obey-pkgfiles=${internal.ats.obey.pkgfiles.rule.enabled}" />
<arg value="--ats4-enabled=${internal.ats4.enabled}" />
+ <arg value="--ats-stf-enabled=${ats.stf.enabled}" />
<arg value="--specific-pkg=${ats.specific.pkg}" />
<arg value="--hti=${ats.hti.enabled}" />
+ <arg value="--minimum-execution-blocks=${ats.minimum.execution.blocks.enabled}" />
<arg value="--verbose" />
<arg line="${module.tsrc.@{module}}" />
</exec>
@@ -914,10 +1037,11 @@
<macrodef name="evalidMacro" uri="http://www.nokia.com/helium">
<attribute name="dir"/>
<sequential>
- <runtarget target="ido-create-ado-mapping"/>
+ <property name="evalid.mapping.file" location="${build.output.dir}/build/ado_mapping_evalid.ini" />
+ <hlm:createAdoMappingMacro adoMapFile="${evalid.mapping.file}" />
<hlm:python>
import delta_zip
-delta_zip.evalidAdomapping(r'${build.drive}', r'@{dir}', r'${ado.mapping.file}')
+delta_zip.evalidAdomapping(r'${build.drive}', r'@{dir}', r'${evalid.mapping.file}')
</hlm:python>
</sequential>
</macrodef>
@@ -945,8 +1069,8 @@
</script>
</target>
- <!-- Common target to run ats, aste and matti -->
- <target name="run-test" depends="ats-test,ats-aste,matti-test"/>
+ <!-- Common target to run ats, aste and TDriver -->
+ <target name="run-test" depends="ats-test,ats-aste,tdriver-test"/>
<!-- Zip build area for emulator -->
<target name="ats-emulator-zip" if="internal.ats.emulator.enabled">
@@ -986,48 +1110,109 @@
<runtarget target="do-ats-test" />
</target>
- <!-- a dependant target please do not call directly use matti-test,
- target calls the MATTI script that creates the MATTI_drop.zip file and runs the tests
+ <!-- a dependant target please do not call directly use tdriver-test,
+ target calls the TDriver script that creates the TDriver_drop.zip file and runs the tests
listed in test.rb. ats-set-flash-image-path and ats-set-sis-flash-image-path look for lists of files-->
- <target name="do-ats-matti" depends="ats-set-flash-image-path" >
+ <target name="do-ats-tdriver" depends="ats-set-flash-image-path" >
<runtarget target="ats-set-defaults-stifeunit" />
+
+ <!-- Separate but similar property to ats.test.timeout for TDriver tests.
+ @type string
+ @editable required
+ @scope public
+ -->
+ <property name="tdriver.test.timeout" value="60" />
+ <!-- There are special sis files required to execute with test execution. This is a comma separated list in which several sis files can be deifned in a certain format like '<src file on build area>#<destination to save the file on memory card>#<destination to install the file>' e.g. <x:dir1abc.sis#f:memory1abc.sis#c:phonememoryprivateabc.sis>
+ @type string
+ @editable required
+ @scope public
+ -->
+ <property name="tdriver.sis.files" value=""/>
+ <!-- TDrunner parameters are set using this property. e.g. 'teardown ordered'.
+ @type string
+ @editable required
+ @scope public
+ -->
+ <property name="tdriver.tdrunner.parameters" value=""/>
+ <!-- TDriver test parameters can be given through TDriver parameters xml file.
+ @type string
+ @editable required
+ @scope public
+ -->
+ <property name="tdriver.parameters" value=""/>
+ <!-- Alias name for the test cases to be used in test.xml files for ATS4 drops only.
+ @type string
+ @scope public
+ @since 11.0
+ -->
+ <property name="ats.alias.name" value="sut_s60"/>
+ <!-- The Subject for the ATS report email. This email is received in the end of the test execution.
+ @type string
+ @scope public
+ -->
+ <property name="ats.email.subject" value="${build.id} TDriver test results"/>
+ <!-- This specifies email format. E.g. to receive email without attachment 'simplelogger'.
+ @type string
+ @scope public
+ -->
+ <property name="ats.email.format" value="simplelogger"/>
+ <fail unless="tdriver.asset.location" message="Error: tdriver.asset.location property not defined" />
+
<!--need to set theseup for use by do-ats-test target-->
<mkdir dir="${build.output.dir}/ats" />
- <var name="ats.drop.file" value="ATSMattiDrop.zip" />
- <!-- execute the MattiDrops.py script with parameters-->
+ <var name="ats.drop.file" value="ATSTDriverDrop.zip" />
+ <!-- execute the tdriver.py script with parameters-->
<exec executable="python" resultproperty="script.response">
- <arg line="-m ats3.matti2" />
+ <arg line="-m ats3.tdriver" />
<arg value="--build-drive=${build.drive}" />
- <arg value="--test-profiles=${matti.test.profiles}" /> <!--"all, !bat1" -->
- <arg value="--sierra-enabled=${matti.sierra.enabled}" /> <!--"true/false" -->
- <arg value="--matti-timeout=${matti.test.timeout}" /> <!--"600" -->
+ <arg value="--test-profiles=${tdriver.test.profiles}" /> <!--"all, !bat1" -->
+ <arg value="--tdrunner-enabled=${tdriver.tdrunner.enabled}" /> <!--"true/false" -->
+ <arg value="--tdriver-timeout=${tdriver.test.timeout}" /> <!--"600" -->
<arg value="${internal.ats.diamonds.arg}" />
- <arg value="--testasset-location=${matti.asset.location}" /> <!--"local and/or network drive" -->
- <arg value="--file-store=${ats.output.dir}" /> <!--"network drive" -->
- <arg value="--testrun-name=${ats.testrun.name}" /> <!--"Matti_Profile_Name" -->
+ <arg value="--testasset-location=${tdriver.asset.location}" /> <!--"local and/or network drive" -->
+ <arg value="--file-store=${ats.report.location}" /> <!--"network drive" -->
+ <arg value="--testrun-name=${ats.testrun.name}" /> <!--"TDriver_Profile_Name" -->
<arg value="--alias-name=${ats.alias.name}" /> <!--"agents_alias_Name" -->
<arg value="--device-type=${ats.product.name}" />
<arg value="--flash-images=${ats.flash.images}" />
<arg value="--drop-file=${build.output.dir}/ats/${ats.drop.file}" />
<arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
- <arg value="--template-loc=${matti.template.file}" /> <!--"local and/or network drive. No comma separated list" -->
+ <arg value="--template-loc=${tdriver.template.file}" /> <!--"local and/or network drive. No comma separated list" -->
<arg value="--email-format=${ats.email.format}" /> <!--"Email Formatting. e.g. simplelogger" -->
- <arg value="--email-subject=${ats.email.subject}" /> <!--"Email Subject. e.g. Matti testing" -->
+ <arg value="--email-subject=${ats.email.subject}" /> <!--"Email Subject. e.g. TDriver testing" -->
<arg value="--report-email=${ats.email.list}" />
<arg value="--ats4-enabled=${internal.ats4.enabled}" />
- <arg value="--matti-sis-files=${matti.sis.files}" /> <!--"src#store#dst, src#store#dst" -->
- <arg value="--matti-parameters=${matti.parameters}" />
- <arg value="--sierra-parameters=${matti.sierra.parameters}" /> <!--Additional sierra parameters for matti task e.g. ordered teardown -->
+ <arg value="--tdriver-sis-files=${tdriver.sis.files}" /> <!--"src#store#dst, src#store#dst" -->
+ <arg value="--tdriver-parameters=${tdriver.parameters}" />
+ <arg value="--tdrunner-parameters=${tdriver.tdrunner.parameters}" /> <!--Additional TDrunner parameters for tdriver task e.g. ordered teardown -->
+ <arg value="--ctc-enabled=${ats.ctc.enabled}" />
</exec>
-
- <!-- Unset the internal property to overwrite with new value-->
- <var name="internal.ats.upload.enabled" unset="true"/>
- <!-- set internal property if python returns 0 value for matti test drop creation -->
- <condition property="internal.ats.upload.enabled">
- <equals arg1="${script.response}" arg2="0" />
- </condition>
<runtarget target="do-ats-test" />
</target>
+ <!-- The target is used to test ROM image files that whether device boots up -->
+ <target name="ats-bootup-test" depends="ats-common,ats-set-flash-image-path" if="internal.ats.bootuptest.enabled">
+ <!--need to set the setup for use by do-ats-test target-->
+ <mkdir dir="${build.output.dir}/ats" />
+ <var name="ats.drop.file" value="ATSBootupDrop.zip" />
+ <!-- execute the bootup_testing.py script with parameters-->
+ <exec executable="python" resultproperty="script.response">
+ <arg line="-m ats3.bootup_testing" />
+ <arg value="--build-drive=${build.drive}" />
+ <arg value="${internal.ats.diamonds.arg}" />
+ <arg value="--file-store=${ats.report.location}" /> <!--"network drive" -->
+ <arg value="--testrun-name=${ats.testrun.name}" /> <!--"bootup_test" -->
+ <arg value="--alias-name=${ats.alias.name}" /> <!--"agents_alias_Name" -->
+ <arg value="--device-type=${ats.product.name}" />
+ <arg value="--flash-images=${ats.flash.images}" />
+ <arg value="--drop-file=${build.output.dir}/ats/${ats.drop.file}" />
+ <arg value="--minimum-flash-images=${ats.flashfiles.minlimit}" />
+ <arg value="--email-format=${ats.email.format}" /> <!--"Email Formatting. e.g. simplelogger" -->
+ <arg value="--email-subject=${ats.email.subject}" /> <!--"Email Subject. e.g. TDriver testing" -->
+ <arg value="--report-email=${ats.email.list}" />
+ <arg value="--ats4-enabled=${internal.ats4.enabled}" />
+ </exec>
+ <runtarget target="do-ats-test" />
+ </target>
</project>
--- a/buildframework/helium/tools/testing/ats/templates/ats4_naviengine_template.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/testing/ats/templates/ats4_naviengine_template.xml Mon Oct 18 10:23:52 2010 +0100
@@ -87,7 +87,7 @@
<action>
<type>EmailAction</type>
<parameters>
- <parameter value="Release testing" name="subject"/>
+ <parameter value="ATS test results {{ test_plan['testrun_name'] }}" name="subject"/>
<parameter value="{{ test_plan['report_email'] }}" name="to"/>
<parameter value="simplelogger" name="format"/>
</parameters>
--- a/buildframework/helium/tools/testing/ats/templates/monsym-file-list.txt.ftl Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/testing/ats/templates/monsym-file-list.txt.ftl Mon Oct 18 10:23:52 2010 +0100
@@ -20,6 +20,6 @@
============================================================================
-->
${ant['build.drive']}/mon.sym
-<#list data["//unit"] as unit>
+<#list data["//unit[@bldFile]"] as unit>
${ant['build.drive']}${unit.@bldFile}/mon.sym
</#list>
--- a/buildframework/helium/tools/testing/eunit/eunit.ant.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/buildframework/helium/tools/testing/eunit/eunit.ant.xml Mon Oct 18 10:23:52 2010 +0100
@@ -40,12 +40,6 @@
@scope public
-->
- <!--* @property eunitexerunner.flags
- Flags for EUnit exerunner can be set by setting the value of this variable. The default flags are set to "/E S60AppEnv /R Off".
- @type string
- @editable required
- @scope public
- -->
<!-- Unzip test package to build drive. -->
<target name="prepare-eunit" if="internal.ats.enabled">
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/app-services/buildstubsis.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2006-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:
+# Meta information for stub .sis building extension template
+#
+
+platform win32
+makefile gnumake
+techstream app-services
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/app-services/buildstubsis.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,72 @@
+# Copyright (c) 2006-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:
+# Build Stub SIS file
+#
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+# Select appropriate directory and ensure it exists
+
+TARGETDIR=$(EPOCROOT)epoc32/data/z/system/install
+
+ifeq ($(PLATFORM),WINS)
+ TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/install
+else
+ifeq ($(PLATFORM),WINSCW)
+ TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/install
+endif
+endif
+
+$(TARGETDIR) :
+ $(call createdir,"$(TARGETDIR)")
+
+# Build stub SIS file
+
+SISFILE= $(TARGETDIR)/$(SISNAME).sis
+
+$(SISFILE) : $(EXTENSION_ROOT)/$(SRCDIR)/$(SISNAME).pkg
+ $(EPOCROOT)epoc32/tools/makesis -s $? $@
+
+do_nothing :
+ echo do_nothing
+
+# The targets invoked by abld
+
+MAKMAKE : do_nothing
+
+RESOURCE : $(TARGETDIR) $(SISFILE)
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : do_nothing
+
+CLEAN :
+ -$(ERASE) $(SISFILE)
+
+RELEASABLES :
+ @echo $(SISFILE)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/app-services/buildupgradesis.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2006-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:
+# Meta information for upgrade sis building extension template
+#
+
+platform win32
+makefile gnumake
+techstream app-services
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/app-services/buildupgradesis.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,72 @@
+# Copyright (c) 2006-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:
+# Build Upgrade SIS file
+#
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+# Select appropriate directory and ensure it exists
+
+TARGETDIR=$(EPOCROOT)epoc32/data/z/private/$(UID_DIR)
+ifeq ($(PLATFORM),WINS)
+ TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/$(UID_DIR)
+else
+ifeq ($(PLATFORM),WINSCW)
+ TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/$(UID_DIR)
+endif
+endif
+
+$(TARGETDIR) :
+ @$(call createdir,"$(TARGETDIR)")
+
+# Build stub SIS file
+
+SISFILE= $(TARGETDIR)/$(SISNAME).sis
+
+$(SISFILE) : $(EXTENSION_ROOT)/$(SRCDIR)/$(SISNAME).pkg
+ $(EPOCROOT)epoc32/tools/makesis -d$(EXTENSION_ROOT)/$(SRCDIR) $? $@
+
+
+do_nothing :
+# do_nothing
+
+# The targets invoked by abld
+
+MAKMAKE : do_nothing
+
+RESOURCE : $(TARGETDIR) $(SISFILE)
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : do_nothing
+
+CLEAN :
+ -$(ERASE) $(SISFILE)
+
+RELEASABLES :
+ @echo $(SISFILE)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/app-services/tzlocaltestserver.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2006-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:
+# Meta information for stub .sis building extension template
+#
+
+platform win32
+makefile gnumake
+techstream app-services
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/app-services/tzlocaltestserver.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,62 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# TzLocalTestServer - makefile for TimeZoneLocalization test data
+#
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+MBSDIR = $(EPOCROOT)epoc32/tools/shell
+include $(MBSDIR)/$(notdir $(basename $(SHELL))).mk
+
+
+# Erase resources command
+erase_res = $(ERASE) $(EPOCROOT)epoc32$/release$/$(PLATFORM)$/$(CFG)$/z$/resource$/timezonelocalization
+erase_data = $(ERASE) $(EPOCROOT)epoc32$/data$/z$/resource$/timezonelocalization
+do_nothing :
+
+RESOURCE :
+ -$(erase_res)$/$(TZ_RSC)
+ -$(erase_data)$/$(TZ_RSC)
+ -$(erase_res)$/$(TZ_R01)
+ -$(erase_data)$/$(TZ_R01)
+ -$(erase_res)$/$(TZ_R02)
+ -$(erase_data)$/$(TZ_R02)
+ -$(erase_res)$/$(TZ_GRP_RSC)
+ -$(erase_data)$/$(TZ_GRP_RSC)
+ -$(erase_res)$/$(TZ_GRP_R01)
+ -$(erase_data)$/$(TZ_GRP_R01)
+ -$(erase_res)$/$(TZ_GRP_R02)
+ -$(erase_data)$/$(TZ_GTP_R02)
+
+BLD : do_nothing
+
+MAKMAKE : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+CLEAN : do_nothing
+
+FINAL : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASEABLES : do_nothing
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/application-protocols/buildstubsis.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for stub .sis building extension template
+#
+
+platform win32
+makefile gnumake
+techstream application-protocols
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/application-protocols/buildstubsis.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,72 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# buildstubsis.mk - Build Stub SIS file
+#
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+# Select appropriate directory and ensure it exists
+
+TARGETDIR=$(EPOCROOT)epoc32/data/z/system/install
+
+ifeq ($(PLATFORM),WINS)
+ TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/install
+else
+ifeq ($(PLATFORM),WINSCW)
+ TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/install
+endif
+endif
+
+$(TARGETDIR) :
+ $(call createdir,"$(TARGETDIR)")
+
+# Build stub SIS file
+
+SISFILE= $(TARGETDIR)/$(SISNAME).sis
+
+$(SISFILE) : $(EXTENSION_ROOT)/$(SRCDIR)/$(SISNAME).pkg
+ $(EPOCROOT)epoc32/tools/makesis -s $? $@
+
+do_nothing :
+ echo do_nothing
+
+# The targets invoked by abld
+
+MAKMAKE : do_nothing
+
+RESOURCE : $(TARGETDIR) $(SISFILE)
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : do_nothing
+
+CLEAN :
+ -$(ERASE) $(SISFILE)
+
+RELEASABLES :
+ @echo $(SISFILE)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/base_rvct_common.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,69 @@
+# 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:
+# Some functions that are commonly used by base FLM
+
+define base__compile
+$(1) : $(2) : $(3)
+ $(call startrule,base__compile) \
+ $(CC) $(ARMCCFLAGS) $$< -o $$@ \
+ $(call endrule,base__compile)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
+define base__h2inc
+$(1) : $(2)
+ $(call startrule,base__h2inc) \
+ $(PERL) $(EPOCROOT)/epoc32/tools/h2inc.pl $$< $$@ ARMASM \
+ $(call endrule,base__h2inc)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
+define base__asm
+$(1) : $(2) : $(3)
+ $(call startrule,base__asm) \
+ $(ASM) $(AFLAGS) -o $$@ --LIST $(join $(basename $(1)),.lst) $$< \
+ $(call endrule,base__asm)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1) $(join $(basename $(1)),.lst)
+endef
+
+define base__link
+$(1) : $(2)
+ $(call startrule,base__link) \
+ $(LD) $(LFLAGS) -o $$@ $(FULLOBJECTS) \
+ $(call endrule,base__link)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
+define base__strip
+$(1) : $(2)
+ $(call startrule,base__strip) \
+ $(FROMELF) --bin --output $$@ $$< \
+ $(call endrule,base__strip)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
+define base__omapsig
+$(1) : $(2)
+ $(call startrule,base__omapsig) \
+ $(PERL) $(EPOCROOT)/epoc32/tools/omapsig.pl $(LINKBASE) $$< $$@ \
+ $(call endrule,base__omapsig)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/bootstrap.flm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,195 @@
+# Copyright (c) 2009-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:
+#
+
+ifeq ($($(NAME)_$(PLATFORM_PATH)_bootstrap_flm),)
+$(NAME)_$(PLATFORM_PATH)_bootstrap_flm := 1
+
+E32PATH := $(EXTENSION_ROOT)/$(E32PATH)
+SOURCES := $(foreach S,$(SOURCES),$(addprefix $(EXTENSION_ROOT)/,$(S)))
+INCLUDES2:=$(addprefix $(EXTENSION_ROOT)/,$(INCLUDES))
+EXTRA_INC_PATH := $(foreach S,$(EXTRA_INC_PATH),$(addprefix $(EXTENSION_ROOT)/,$(S)))
+GENINCLUDES_HEADERS := $(foreach H,$(GENINCLUDES_HEADERS),$(addprefix $(EXTENSION_ROOT)/,$(H)))
+
+ifndef LINKBASE
+LINKBASE := 0x00000000
+endif
+
+UNIQ:=$(E32PATH)$(PLATFORM_PATH)$(NAME)$(MEMMODEL)$(SOURCES)$(ASM_MACROS)
+UNIQ:=$(word 1,$(shell echo $(UNIQ) | $(GNUMD5SUM)))
+
+# Make the output build directory name unique, starting with NAME of the binary being built
+EPOCBLDABS := $(EPOCBLD)/$(NAME)_$(UNIQ)
+
+EPOCINC := $(EPOCROOT)/epoc32/include
+EPOCKERNINC := $(EPOCINC)/kernel
+EPOCCPUINC := $(EPOCKERNINC)/$(CPU)
+EPOCTRG := $(EPOCROOT)/epoc32/release/$(PLATFORM_PATH)
+TRG := $(EPOCTRG)/$(NAME).bin
+TEMPTRG := $(EPOCBLDABS)/$(NAME).bin
+ASMINCPATH :=
+ASM_MACROS :=
+CLEANTARGETS :=
+
+CLEANTARGETS := $(CLEANTARGETS) $(TRG) $(TEMPTRG) $(join $(basename $(TRG)),.sym)
+
+ifneq ($(EXTRA_INC_PATH),)
+ASMINCPATH := $(EXTRA_INC_PATH)
+endif
+
+ASMINCPATH := . $(EPOCBLDABS) $(ASMINCPATH) $(EXTENSION_ROOT) $(EPOCCPUINC) $(EXTRA_EPOC32_INC_PATH) $(E32PATH)/eka/include/kernel/$(CPU)
+
+ifeq ($(MEMMODEL),)
+$(error MEMMODEL parameter not specified)
+endif
+
+# Convert MEMMODEL parameter to lower case
+MEMMODEL := $(shell echo $(MEMMODEL) | tr A-Z a-z)
+
+ifeq ($(MEMMODEL),direct)
+CFG_MM := CFG_MMDirect
+HEADERS_MM :=
+endif
+ifeq ($(MEMMODEL),flexible)
+CFG_MM := CFG_MMFlexible
+HEADERS_MM := $(E32PATH)/eka/include/memmodel/epoc/flexible/$(CPU)/mmboot.h
+endif
+ifeq ($(MEMMODEL),moving)
+CFG_MM := CFG_MMMoving
+HEADERS_MM := $(E32PATH)/eka/include/memmodel/epoc/moving/$(CPU)/mmboot.h
+endif
+ifeq ($(MEMMODEL),multiple)
+CFG_MM := CFG_MMMultiple
+HEADERS_MM := $(E32PATH)/eka/include/memmodel/epoc/multiple/$(CPU)/mmboot.h
+endif
+ifndef CFG_MM
+$(error '$(MEMMODEL)' memory model unknown)
+endif
+
+ASM_MACROS := $(ASM_MACROS) $(CFG_MM)
+ifneq ($(SMP),)
+ASM_MACROS := $(ASM_MACROS) SMP
+endif
+
+ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
+ASM_MACROS := $(ASM_MACROS) USE_CXSF
+
+INCEXT := inc
+ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),--predefine "$(macro) SETL {TRUE}")
+AFLAGS := -g --keep $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
+LFLAGS := --ro-base $(LINKBASE) --entry $(LINKBASE) --map
+SYMOPT := --symdefs
+
+define bootstrap_asm
+$(1) : $(2) : $(3)
+ $(call startrule,bootstrap_rvct_asm) \
+ $(ASM) $(AFLAGS) -o $$@ --LIST $$(join $$(basename $$@),.lst) $$< \
+ $(call endrule,bootstrap_rvct_asm)
+endef
+
+define bootstrap_link
+$(EPOCBLDABS)/$(NAME).in : $(LINKOBJECTS) $(LINKFILE) | $(EPOCBLDABS)
+ $(call startrule,bootstrap_rvct_link) \
+ $(LD) $(LFLAGS) $(SYMOPT) $$(join $$(basename $$@),.sym) -o $$@ $$(filter %.o,$$^); \
+ $(GNUCP) $$@ $$(join $$(basename $(TRG)),.sym) \
+ $(call endrule,bootstrap_rvct_link)
+endef
+
+define bootstrap_strip
+$(TRG) : $(EPOCBLDABS)/$(NAME).in
+ $(call startrule,bootstrap_strip) \
+ $(FROMELF) --bin --output $$@ $$< \
+ $(call endrule,bootstrap_rvct_strip)
+endef
+
+define bootstrap_h2inc
+# How to translate the .h files to .inc
+$(1) : $(2)
+ $(call startrule,bootstrap_h2inc) \
+ $(PERL) $(EPOCROOT)/epoc32/tools/h2inc.pl $$< $$@ ARMASM \
+ $(call endrule, bootsrap_h2inc)
+endef
+
+# Joins two lists with a 1:1 mapping, separated by a ->
+# $(call bootstrap_joinlists,a b c,d e f) returns a->d b->e c->f
+define bootstrap_joinlists
+$(join $(1),$(addprefix ->,$(2)))
+endef
+
+# Path for generic source files
+BASESRCPATH := $(E32PATH)/eka/kernel/$(CPU)
+
+# Generic source files
+BASESOURCES := $(foreach S,$(BASESOURCES_NAMES),$(addprefix $(BASESRCPATH)/,$(S)))
+
+HEADERS:= $(E32PATH)/eka/include/kernel/kernboot.h $(E32PATH)/eka/include/kernel/arm/bootdefs.h $(E32PATH)/eka/include/e32rom.h $(GENINCLUDES_HEADERS) $(HEADERS_MM)
+
+# Generated include files
+BOOTSTRAP_GENINCLUDES := $(foreach f,$(HEADERS),$(basename $(notdir $(f))).$(INCEXT))
+
+# Non-generated generic include files
+ifeq ($(BASEINCLUDES),)
+BASEINCLUDES := $(E32PATH)/eka/include/kernel/$(CPU)/bootcpu.inc $(E32PATH)/eka/include/kernel/$(CPU)/bootmacro.inc
+endif
+INCLUDES2 := $(foreach f,$(INCLUDES2),$(basename $(f)).$(INCEXT))
+
+# Generic object files
+FULLBASEOBJECTS := $(foreach src, $(BASESOURCES_NAMES), $(addprefix $(EPOCBLDABS)/,$(basename $(src)).o))
+
+# Platform specific object files
+FULLOBJECTS := $(foreach src, $(SOURCES), $(addprefix $(EPOCBLDABS)/,$(basename $(notdir $(src))).o))
+
+LINKOBJECTS := $(FULLBASEOBJECTS) $(FULLOBJECTS)
+
+# Generated include files with paths
+FULLGENINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BOOTSTRAP_GENINCLUDES))
+
+CLEANTARGETS := $(CLEANTARGETS) $(FULLBASEOBJECTS) $(FULLOBJECTS) $(LINKOBJECTS) $(FULLGENINCLUDES)
+
+CLEANTARGETS := $(CLEANTARGETS) $(EPOCBLDABS)/$(NAME).in $(join $(basename $(EPOCBLDABS)/$(NAME).in),.sym)
+
+JOINED_INC := $(call bootstrap_joinlists,$(FULLGENINCLUDES),$(HEADERS))
+$(foreach J,$(JOINED_INC),$(eval $(call bootstrap_h2inc,$(word 1,$(subst ->, ,$(J))),$(word 2,$(subst ->, ,$(J))) | $(EPOCBLDABS))))
+
+# How to strip linked object to binary
+$(eval $(call bootstrap_strip,$(TRG),$(EPOCBLDABS)/$(NAME).in))
+
+LISTFILE := $(foreach f,$(FULLBASEOBJECTS),$(join $(basename $(f)),.lst)) $(foreach f,$(FULLOBJECTS),$(join $(basename $(f)),.lst))
+CLEANTARGETS := $(CLEANTARGETS) $(LISTFILE)
+
+JOINED_BASEOBJECTS := $(call bootstrap_joinlists,$(FULLBASEOBJECTS),$(BASESOURCES))
+
+$(foreach J,$(JOINED_BASEOBJECTS),$(eval $(call bootstrap_asm,$(word 1,$(subst ->, ,$(J))),$(EPOCBLDABS)/%.o,$(word 2,$(subst ->, ,$(J))) $(BASEINCLUDES) $(FULLGENINCLUDES) $(INCLUDES2) | $(EPOCBLDABS))))
+
+JOINED_OBJECTS := $(call bootstrap_joinlists,$(FULLOBJECTS),$(SOURCES))
+
+$(foreach J,$(JOINED_OBJECTS),$(eval $(call bootstrap_asm,$(word 1,$(subst ->, ,$(J))),$(EPOCBLDABS)/%.o,$(word 2,$(subst ->, ,$(J))) $(BASEINCLUDES) $(FULLGENINCLUDES) $(INCLUDES2) |$(EPOCBLDABS))))
+
+# How to link the object files
+$(eval $(bootstrap_link))
+
+# Hook into global targets
+TARGET :: $(TRG)
+
+#############################################
+
+# --what to show releasables
+$(eval $(call whatmacro,$(TRG),USERFLM))
+# create directory
+CREATABLEPATHS := $(EPOCBLDABS) $(EPOCTRG)
+$(call makepath,$(CREATABLEPATHS))
+# clean up
+$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(BUILDLOC)))
+
+endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/bootstrap.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2005-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:
+# Meta information for the boot strap extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/bootstrap.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,391 @@
+# Copyright (c) 2006-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:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+ifndef CPU
+CPU := arm
+endif
+
+ifndef LINKBASE
+LINKBASE := 0x00000000
+endif
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+PROCEED:=build
+ifneq "$(PBUILDPID)" ""
+ ifneq "$(CFG)" "UREL"
+ PROCEED:=skip
+ endif
+endif
+
+COPY := $(call ecopy)
+
+ifeq "$(CPU)" "x86"
+ ifeq "$(MEMMODEL)" "direct"
+ BLDSGL:=s
+ else
+ ifeq "$(MEMMODEL)" "flexible"
+ BLDSGL:=f
+ else
+ BLDSGL:=
+ endif
+ endif
+ ifdef SMP
+ BLDSMP:=smp
+ else
+ BLDSMP:=
+ endif
+ EPOCROOT:=$(subst /,\,$(EPOCROOT))
+ EPOCBLDABS := $(EPOCROOT)epoc32\build\tasm$(PBUILDPID)\$(BLDSGL)$(VNAME)$(BLDSMP)
+else
+ DRIVELETTER := $(shell cd 2>NUL)
+ DRIVELETTER_2 := $(word 1,$(subst \, ,$(DRIVELETTER)))
+ EPOCBLDABS_1 := $(subst $(TO_ROOT),,$(EPOCBLD))
+ EPOCBLDABS_2 := $(subst $(DRIVELETTER_2),,$(EPOCBLDABS_1))
+
+ EPOCBLDABS := $(call epocbldabs,$(DRIVELETTER_2),$(EPOCBLDABS_2))/$(NAME)
+endif
+
+EPOCINC := $(INC_PATH)
+EPOCKERNINC := $(EPOCINC)/kernel
+EPOCCPUINC := $(EPOCKERNINC)/$(CPU)
+EPOCMMINC := $(INC_PATH)/memmodel/epoc/$(MEMMODEL)/$(CPU)
+EPOCTRG := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TRG := $(EPOCTRG)/$(NAME).bin
+TEMPTRG := $(EPOCBLDABS)/$(NAME).bin
+
+ifdef EXTRA_INC_PATH
+ASMINCPATH := $(EXTRA_INC_PATH)
+endif
+
+ifeq "$(CPU)" "arm"
+ASMINCPATH := . $(EPOCBLDABS) $(ASMINCPATH) $(EXTENSION_ROOT) $(EPOCCPUINC)
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+ARMASM_OUT_6 := $(word 6,$(ARMASM_OUT))
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+ TOOLVER := RVCT
+ OP := --
+endif
+ifeq "$(ARMASM_OUT_6)" "2.37"
+ TOOLVER := 211
+endif
+endif
+
+ifeq "$(MEMMODEL)" "direct"
+CFG_MM := CFG_MMDirect
+endif
+ifeq "$(MEMMODEL)" "moving"
+CFG_MM := CFG_MMMoving
+endif
+ifeq "$(MEMMODEL)" "multiple"
+CFG_MM := CFG_MMMultiple
+endif
+ifeq "$(MEMMODEL)" "flexible"
+CFG_MM := CFG_MMFlexible
+endif
+ifndef CFG_MM
+$(error Memory model unknown)
+endif
+
+ASM_MACROS += $(CFG_MM)
+ifdef SMP
+ ASM_MACROS += SMP
+endif
+
+ifeq "$(CPU)" "x86"
+ ifndef BASEINCLUDES
+ BASEINCLUDES := bootcpu.inc bootmacr.inc
+ endif
+ ifndef BASESOURCES
+ BASESOURCES := bootmain.asm bootcpu.asm bootutil.asm
+ endif
+ GENINCLUDES := $(GENINCLUDES) x86boot.h
+ ASMINCPATH := .
+ ASM := tasm
+ LINK := tlink
+ EXE2BIN := exe2bin
+ SRCEXT := asm
+ INCEXT := inc
+ OBJEXT := obj
+ EXEEXT := exe
+
+ ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join /i,$(call slash2generic,$(dir))))
+ ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),/d$(macro)=1)
+ AFLAGS := /l /m3 /ML /W-PDC $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
+ LFLAGS := /m /s /n /3 /c
+ ASMTYP := TASM
+ LINKFILE :=
+ define do_asm
+ cd $(EPOCBLDABS) && $(CP) $(call slash2generic,$<) .
+ cd $(EPOCBLDABS) && $(ASM) $(AFLAGS) $(notdir $<)
+ endef
+ define do_link
+ cd $(EPOCBLDABS) && $(LINK) $(LFLAGS) $(filter %.$(OBJEXT),$(foreach obj,$^,$(notdir $(obj)))), temp.exe
+ cd $(EPOCBLDABS) && $(COPY) temp.exe $@
+ cd $(EPOCBLDABS) && $(ERASE) temp.exe
+ endef
+ define do_strip
+ cd $(EPOCBLDABS) && $(COPY) $< temp.exe
+ cd $(EPOCBLDABS) && $(EXE2BIN) temp.exe temp.bin
+ cd $(EPOCBLDABS) && $(COPY) temp.bin $@
+ cd $(EPOCBLDABS) && $(ERASE) temp.exe temp.bin
+ endef
+endif
+ifeq "$(CPU)" "arm"
+ ifeq "$(TOOLVER)" "211"
+ ASM := armasm
+ LINK := armlink
+ SRCEXT := s
+ INCEXT := inc
+ OBJEXT := o
+ EXEEXT := in
+ ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
+ ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),-predefine "$(macro) SETL {TRUE}")
+ AFLAGS := $(ASM_ARM211_VARIANTFLAGS) -apcs 3/32bit/nosw -Length 0 -Width 200 $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
+ LFLAGS := -Base $(LINKBASE) -Data 0xf0000000 -Entry $(LINKBASE) -Bin -map
+ SYMOPT := -symbols
+ ASMTYP := ARMASM
+ LINKFILE :=
+ define do_asm
+ $(ASM) $(AFLAGS) -o $@ -LIST $(join $(basename $@),.lst) $<
+ endef
+ define do_link
+ $(LINK) $(LFLAGS) $(SYMOPT) $(join $(basename $@),.sym) -o $@ $(filter %.$(OBJEXT),$^)
+ endef
+ define do_strip
+ @if exist $@ $(ERASE) $(call slash2generic,$@)
+ $(COPY) $< $@
+ endef
+ endif
+ ifeq "$(TOOLVER)" "RVCT"
+ ASM_MACROS += USE_CXSF
+ ASM := armasm
+ LINK := armlink
+ FROMELF := fromelf
+ SRCEXT := s
+ INCEXT := inc
+ OBJEXT := o
+ EXEEXT := in
+ ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
+ ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ AFLAGS := -g $(OP)keep $(ASM_MACRO_CMD) $(ASMINCPATHCMD) $(ASM_RVCT_VARIANTFLAGS)
+ LFLAGS := $(OP)ro-base $(LINKBASE) $(OP)entry $(LINKBASE) $(OP)map
+ SYMOPT := $(OP)symdefs
+ ASMTYP := ARMASM
+ LINKFILE :=
+ define do_asm
+ $(ASM) $(AFLAGS) -o $@ $(OP)LIST $(join $(basename $@),.lst) $<
+ endef
+ define do_link
+ $(LINK) $(LFLAGS) $(SYMOPT) $(join $(basename $@),.sym) -o $@ $(filter %.$(OBJEXT),$^)
+ $(COPY) $@ $(join $(basename $(TRG)),.sym)
+ endef
+ define do_strip
+ $(FROMELF) $(OP)bin $(OP)output $@ $<
+ endef
+ endif
+ ifeq "$(TOOLVER)" "GCC"
+ ASM_MACROS += USE_CXSF GNU_ASM
+ ASM := as
+ LINK := ld
+ STRIP := strip
+ SRCEXT := s
+ INCEXT := ginc
+ OBJEXT := o
+ EXEEXT := in
+ ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
+ ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),--defsym $(macro)=1 )
+ AFLAGS := -mapcs-32 -R -n $(ASM_MACRO_CMD) -I- $(ASMINCPATHCMD)
+ LFLAGS := -n -x --section-alignment 4 --file-alignment 2 -no-whole-archive
+ SYMOPT := -symdefs
+ ASMTYP := AS
+ PROCESS_INCLUDES := 1
+ ifndef LINKFILE
+ LINKFILE := bootstrap.lnk
+ endif
+ define do_asm
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.ss)
+ $(ASM) $(AFLAGS) -acdhlms=$(join $(basename $@),.lst) -o $@ $(join $(basename $@),.ss)
+ endef
+ define do_link
+ if exist $(join $(basename $@),.lnk) $(ERASE) $(call slash2generic,$(join $(basename $@),.lnk))
+ $(COPY) $(subst /,\,$(filter %.lnk,$^)) $(join $(basename $@),.lnk)
+ $(LINK) -M -o $@ $(filter %.$(OBJEXT),$^) $(LFLAGS) --script=$(join $(basename $@),.lnk) >$(join $(basename $@),.map)
+ endef
+ define do_strip
+ $(STRIP) -O binary -o $(TEMPTRG) $<
+ $(COPY) $(TEMPTRG) $@
+ $(ERASE) $(call slash2generic,$(TEMPTRG))
+ endef
+ endif
+endif
+
+
+
+# Generic source files
+ifndef BASESOURCES
+BASESOURCES := bootmain.s bootcpu.s bootutils.s
+endif
+
+# Path for generic source files
+ifndef BASESRCPATH
+BASESRCPATH := $(E32PATH)/eka/kernel/$(CPU)
+endif
+
+
+# Generated include files
+GENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+GENINCLUDES := $(GENINCLUDES) e32rom.$(INCEXT) kernboot.$(INCEXT)
+GENINCLUDES := $(GENINCLUDES) bootdefs.$(INCEXT)
+ifneq "$(MEMMODEL)" "direct"
+GENINCLUDES := $(GENINCLUDES) mmboot.$(INCEXT)
+endif
+
+# Headers from which GENINCLUDES are generated
+GENHEADERS = $(foreach inc,$(GENINCLUDES),$(basename $(inc)).h)
+
+# Non-generated generic include files
+ifndef BASEINCLUDES
+BASEINCLUDES := bootcpu.inc bootmacro.inc
+endif
+BASEINCLUDES := $(foreach f,$(BASEINCLUDES),$(basename $(f)).$(INCEXT))
+INCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+
+# Generic object files
+BASEOBJECTS = $(foreach src, $(BASESOURCES), $(basename $(src)).$(OBJEXT))
+
+# Platform specific object files
+OBJECTS = $(foreach src, $(SOURCES), $(basename $(src)).$(OBJEXT))
+
+# Object files with paths
+FULLBASEOBJECTS = $(addprefix $(EPOCBLDABS)/,$(BASEOBJECTS))
+FULLOBJECTS = $(addprefix $(EPOCBLDABS)/,$(OBJECTS))
+LINKOBJECTS = $(FULLBASEOBJECTS) $(FULLOBJECTS)
+
+# Generated include files with paths
+FULLGENINCLUDES = $(addprefix $(EPOCBLDABS)/,$(GENINCLUDES))
+
+# Tell make where to look for things
+vpath %.h . $(EXTRA_INC_PATH) $(EPOCINC) $(EPOCKERNINC) $(EPOCCPUINC) $(EPOCMMINC)
+vpath %.inc . $(EXTRA_INC_PATH) $(EXTENSION_ROOT) $(EPOCINC) $(EPOCKERNINC) $(EPOCCPUINC) $(EPOCMMINC) $(EPOCBLDABS)
+vpath %.ginc $(EPOCBLDABS)
+vpath %.$(SRCEXT) . $(EXTRA_SRC_PATH) $(EXTENSION_ROOT) $(BASESRCPATH)
+vpath %.$(OBJEXT) $(EPOCBLDABS)
+vpath %.lnk . $(EXTENSION_ROOT) $(EPOCCPUINC)
+
+# How to link the object files
+$(EPOCBLDABS)/$(NAME).$(EXEEXT): $(LINKOBJECTS) $(LINKFILE) $(call pipe,$(EPOCBLDABS))
+ $(do_link)
+
+# How to strip linked object to binary
+$(TRG): $(EPOCBLDABS)/$(NAME).$(EXEEXT)
+ $(do_strip)
+
+# How to assemble the source files
+ifdef PROCESS_INCLUDES
+FULLBASEINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BASEINCLUDES))
+FULLINCLUDES := $(addprefix $(EPOCBLDABS)/,$(INCLUDES))
+
+$(FULLBASEINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.inc $(call pipe,$(EPOCBLDABS))
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+
+$(FULLINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.inc $(call pipe,$(EPOCBLDABS))
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+
+$(FULLBASEOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLINCLUDES) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(call pipe,$(EPOCBLDABS))
+ $(do_asm)
+
+$(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLINCLUDES) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(call pipe,$(EPOCBLDABS))
+ $(do_asm)
+
+else
+
+ifeq "$(CPU)" "x86"
+FULLBASEINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BASEINCLUDES))
+FULLINCLUDES := $(addprefix $(EPOCBLDABS)/,$(INCLUDES))
+
+$(FULLBASEINCLUDES) $(FULLINCLUDES) : $(EPOCBLDABS)/%.inc : %.inc
+ $(CP) $(call slash2generic,$<) $(call slash2generic,$@)
+
+$(FULLBASEOBJECTS) $(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(FULLINCLUDES)
+ $(do_asm)
+
+else
+$(FULLBASEOBJECTS) $(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(BASEINCLUDES) $(FULLGENINCLUDES) $(INCLUDES) $(call pipe,$(EPOCBLDABS))
+ $(do_asm)
+
+endif
+endif
+
+# How to translate the .h files to .inc
+$(FULLGENINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.h $(call pipe,$(EPOCBLDABS))
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ $(ASMTYP)
+
+
+# How to make the working directories
+$(EPOCBLDABS) $(EPOCTRG) :
+ $(call ifnotexistd,$(call slash2generic,$@))
+
+# Makmake targets
+.PHONY : MAKMAKE FREEZE LIB CLEANLIB RESOURCE FINAL BLD SAVESPACE RELEASABLES CLEAN
+.PHONY : build skip
+
+MAKMAKE :
+ echo Nothing to do
+ echo $(BASESRCPATH)
+
+FREEZE :
+ echo Nothing to do
+ echo $(BASESRCPATH)
+
+LIB :
+ echo Nothing to do
+ echo $(BASESRCPATH)
+
+CLEANLIB :
+ echo Nothing to do
+ echo $(BASESRCPATH)
+
+RESOURCE :
+ echo Nothing to do
+ echo $(BASESRCPATH)
+
+FINAL :
+ echo Nothing to do
+
+BLD SAVESPACE : $(PROCEED)
+
+RELEASABLES :
+ @echo $(TRG)
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(TRG))
+ -$(ERASE) $(call slash2generic,$(EPOCBLDABS)/*.*)
+
+build: $(EPOCTRG) $(EPOCBLDABS) $(TRG)
+ echo Bootstrap built for $(PLATFORM) $(CFG)
+
+skip:
+ echo Bootstrap build skipped for $(PLATFORM) $(CFG)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/bootstrap.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build build/2_0.xsd">
+
+<!-- Extension interfaces : replacements for Template Extension Makefiles
+-->
+
+<interface name="base.bootstrap" extends="Symbian.KernelFLM" flm="bootstrap.flm">
+ <param name="E32PATH" />
+ <param name="NAME" />
+ <param name="MEMMODEL" />
+ <param name="EXTRA_INC_PATH" default=''/>
+ <param name="EXTRA_EPOC32_INC_PATH" default=''/>
+ <param name="SOURCES" />
+ <param name="INCLUDES" />
+ <param name="ASM_MACROS" default='' />
+ <param name="GENINCLUDES_HEADERS" default=''/>
+ <param name="CPU" default='arm'/>
+ <param name="SMP" default=''/>
+ <param name="LINKBASE" default='0x00000000'/>
+ <param name="BASESOURCES_NAMES" default="bootmain.s bootcpu.s bootutils.s"/>
+ <param name="INC_PATH" default=''/>
+ </interface>
+</build>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/config.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2005-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:
+# Meta information for the config extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/config.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,65 @@
+# Copyright (c) 2006-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:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+ifndef HALPATH
+HALPATH := ..
+endif
+
+ifndef SOURCE
+SOURCE := hal
+endif
+
+#MDIR := $(call generated,generatedcpp/hal) # abld
+#MDIR := $(call generated,base/lubbock) # raptor
+MDIR := $(call generatedcpp)
+
+MAKMAKE : $(MDIR)/$(PREFIX)values.cpp $(MDIR)/$(PREFIX)config.cpp
+
+FREEZE :
+
+LIB :
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : $(MDIR)/$(PREFIX)values.cpp $(MDIR)/$(PREFIX)config.cpp
+
+RELEASABLES :
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(MDIR)/$(PREFIX)values.cpp)
+ -$(ERASE) $(call slash2generic,$(MDIR)/$(PREFIX)config.cpp)
+# -$(ERASE) $(MDIR)/$(PREFIX)values.cpp
+# -$(ERASE) $(MDIR)/$(PREFIX)config.cpp
+
+$(MDIR)/$(PREFIX)values.cpp : $(SOURCE)/values.hda $(EPOCROOT)epoc32/include/platform/hal_data.h
+ -$(call createdir,"$(MDIR)")
+ perl $(HALPATH)/hal/halcfg.pl $(EPOCROOT)epoc32/include/platform/hal_data.h $(SOURCE)/values.hda $(MDIR)/$(PREFIX)values.cpp
+
+$(MDIR)/$(PREFIX)config.cpp : $(SOURCE)/config.hcf $(EPOCROOT)epoc32/include/platform/hal_data.h
+ -$(call createdir,"$(MDIR)")
+ perl $(HALPATH)/hal/halcfg.pl -x $(EPOCROOT)epoc32/include/platform/hal_data.h $(SOURCE)/config.hcf $(MDIR)/$(PREFIX)config.cpp
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/copy_default.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2006-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:
+# Meta information for the copy_default extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/copy_default.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,48 @@
+# 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:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+SOURCE_COPY=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/$(SOURCES)
+TARGET_COPY=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/$(TARGET)
+
+$(TARGET_COPY) : $(SOURCE_COPY)
+ $(call cpfeature,"$(SOURCE_COPY)","$(TARGET_COPY)")
+# perl $(EPOCROOT)epoc32/tools/copyfeaturevariants.pl "$(SOURCE_COPY)" "$(TARGET_COPY)"
+# $(CP) "$?" "$@"
+
+#
+# The targets invoked by abld...
+#
+
+MAKMAKE BLD SAVESPACE FREEZE LIB CLEANLIB RESOURCE :
+ @echo Nothing to do for "$@"
+
+CLEAN :
+ -$(ERASE) $(TARGET_COPY)
+
+RELEASABLES :
+ @echo $(TARGET_COPY)
+
+# we have to wait until the SOURCE_COPY is built before we can copy it...
+#
+FINAL : $(TARGET_COPY)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/genexec.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2005-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:
+# Meta information for the genexec extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/genexec.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,71 @@
+# Copyright (c) 2006-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:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+XINCDIR := $(INC_PATH)
+XINCKDIR := $(INC_PATH)/kernel
+
+PROCEED:=all
+ifneq "$(PBUILDPID)" ""
+ ifneq "$(PLATFORM)" "$(__firstplat)"
+ PROCEED:=skip
+ endif
+endif
+
+.PHONY : MAKMAKE FREEZE LIB CLEANLIB RESOURCE FINAL BLD SAVESPACE RELEASABLES CLEAN
+.PHONY : all skip
+
+MAKMAKE : $(PROCEED)
+
+FREEZE :
+
+LIB : $(PROCEED)
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : $(PROCEED)
+
+RELEASABLES :
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(XINCDIR)/exec_enum.h)
+ -$(ERASE) $(call slash2generic,$(XINCDIR)/exec_user.h)
+ -$(ERASE) $(call slash2generic,$(XINCKDIR)/exec_kernel.h)
+
+all: $(XINCDIR)/exec_enum.h $(XINCDIR)/exec_user.h $(XINCKDIR)/exec_kernel.h
+
+$(XINCDIR)/exec_enum.h : $(EXTRA_SRC_PATH)/execs.txt $(EXTRA_SRC_PATH)/genexec.pl
+ perl $(EXTRA_SRC_PATH)/genexec.pl -i $(EXTRA_SRC_PATH)/execs.txt -e $(XINCDIR)/exec_enum.h -u $(XINCDIR)/exec_user.h -k $(XINCKDIR)/exec_kernel.h
+
+$(XINCDIR)/exec_user.h : $(EXTRA_SRC_PATH)/execs.txt $(EXTRA_SRC_PATH)/genexec.pl
+ perl $(EXTRA_SRC_PATH)/genexec.pl -i $(EXTRA_SRC_PATH)/execs.txt -e $(XINCDIR)/exec_enum.h -u $(XINCDIR)/exec_user.h -k $(XINCKDIR)/exec_kernel.h
+
+$(XINCKDIR)/exec_kernel.h : $(EXTRA_SRC_PATH)/execs.txt $(EXTRA_SRC_PATH)/genexec.pl
+ perl $(EXTRA_SRC_PATH)/genexec.pl -i $(EXTRA_SRC_PATH)/execs.txt -e $(XINCDIR)/exec_enum.h -u $(XINCDIR)/exec_user.h -k $(XINCKDIR)/exec_kernel.h
+
+
+skip:
+ echo GENEXEC skipped for $(PLATFORM) $(CFG)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h2_genbootinc.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2005-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:
+# Meta information for the h2_genbootinc extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h2_genbootinc.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,64 @@
+# Copyright (c) 2006-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:
+# Generate assembler inc files from header files
+#
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+XINCDIR := $(INC_PATH)/h2
+XINCDIR2 := $(INC_PATH)/assp/omap1610
+
+MAKMAKE : all
+
+FREEZE :
+
+LIB : all
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : all
+
+RELEASABLES :
+ @echo $(XINCDIR)/h2const.inc
+ @echo $(XINCDIR)/nand_fbr_offset.inc
+ @echo $(XINCDIR2)/omapconst.inc
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(XINCDIR)/h2const.inc)
+ -$(ERASE) $(call slash2generic,$(XINCDIR)/nand_fbr_offset.inc)
+# -$(ERASE) $(XINCDIR)/h2const.inc
+# -$(ERASE) $(XINCDIR)/nand_fbr_offset.inc
+ @echo $(XINCDIR2)/omapconst.inc
+
+all: $(XINCDIR)/h2const.inc $(XINCDIR)/nand_fbr_offset.inc $(XINCDIR2)/omapconst.inc
+
+$(XINCDIR)/h2const.inc : $(XINCDIR)/h2const.h
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/h2const.h $(XINCDIR)/h2const.inc ARMASM
+
+$(XINCDIR)/nand_fbr_offset.inc : $(XINCDIR)/nand_fbr_offset.h
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/nand_fbr_offset.h $(XINCDIR)/nand_fbr_offset.inc ARMASM
+
+$(XINCDIR2)/omapconst.inc : $(XINCDIR2)/omapconst.h
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR2)/omapconst.h $(XINCDIR2)/omapconst.inc ARMASM
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h2_restricted_coreldr.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2005-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:
+# Meta information for the h2_restricted_coreldr extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h2_restricted_coreldr.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,389 @@
+# Copyright (c) 2006-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:
+# Code execute address set in the linker file
+#
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+#DUMP_PAGE_TABLES := TRUE
+
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ USE_MMU := TRUE
+else
+ DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+ USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+ WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+XSRSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr/unistore2
+SPECSRCDIR := $(EXTENSION_ROOT)/../omaph2bsp/h2/nandboot/coreldr
+PLATSRCDIR := $(EXTENSION_ROOT)/../omaph2bsp/shared/bootstrap
+
+VARIANTINC := $(EXTENSION_ROOT)/../omaph2bsp/h2/inc
+ARMDIR := $(INC_PATH)/kernel/arm
+
+GENINC1 := $(INC_PATH) /epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2
+H2BLDDIR := $(EXTENSION_ROOT)/../omaph2bsp/h2
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR) $(VARIANTINC) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(H2BLDDIR) $(PLATSRCDIR)
+
+# Set the source/include/target directories
+GSRCDIR = ../../../unref/orphan/cedgen/shared/nandboot
+VINCDIR = ../../../unref/orphan/cedgen/h2/inc
+GINCDIR = ../../../unref/orphan/cedgen/shared/inc
+
+# Build directory (EPOCBLD too long)
+#BUILDLOC = $(EPOCROOT)epoc32/build/omap/h2/specific/unistore2/nandboot/coreldr/$(PLATFORM_PATH)/$(CFG_PATH)
+BUILDLOC = $(EPOCBLD)/$(PLATFORM_PATH)/$(CFG_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)/h2_un2_coreldr.bin
+TMPTARGET = $(BUILDLOC)/coreldr.tmp
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR) $(GENSRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(VARIANTINC) $(EPOCINCDIR) $(BLDDIR) $(ARMDIR) $(PLATSRCDIR) $(GENSRCDIR) $(H2BLDDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES := nand_macro.inc
+
+VHEADERS := nanddevice.h
+BUILTINCLUDES := nanddevice.inc
+BUILTINCLUDES2 := nand_plat.inc
+BLDINCLUDES := config.inc
+PLATINCLUDES := 16xx_common.inc general.inc
+GENINCLUDES := armcpudefs.inc
+
+ASMSOURCE := coreldrasm.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp
+XSRCPPSOURCE := coreldrxsr.cpp
+ifeq "$(USE_MMU)" "TRUE"
+ GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+## Address at which binary is loaded and started from
+LINKBASE = 0x20000C00
+
+
+
+#ARMASM_OUT := $(shell armasm 2>&1)
+#ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+ARMASM_OUT := $(wordlist 2, 4, $(shell armasm --vsn 2>&1))
+
+# Select the toolchain: ARM RVCT, then GCC
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+#RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+RVCTSTR := $(strip $(findstring RVCT,$(ARMASM_OUT)))
+ifeq "$(RVCTSTR)" "RVCT"
+ TOOLVER := RVCT
+ OP := --
+ OB := o
+endif
+TOOLVER := RVCT
+OP := --
+OB := o
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+ ASM_TRUE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+ ASM_TRUE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+ ASM_FALSE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+ ASM_FALSE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+ ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+ ASM_TRUE_MACROS += USE_CXSF
+ ASM := armasm
+ LINK := armlink
+ FROMELF := fromelf
+ CPP := armcc
+
+ OBJEXT := o
+ INCEXT := inc
+
+ ARMCCFLAGS := --arm -c -Otime --cpp
+ ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ ARMCCFLAGS := $(ARMCCFLAGS) -DSYMBIAN_SUPPORT_UNISTORE2
+
+
+ ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+ ifeq "$(CFG)" "UDEB"
+ ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+ endif
+
+ ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+ ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+ AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map
+ SYMOPT := $(OP)symdefs
+ ASMTYP := ARMASM
+ LINKFILE :=
+
+ define do_compile
+ $(CPP) $(ARMCCFLAGS) $< -o $@
+ endef
+ define do_h2inc
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+ endef
+ define do_asm
+ $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+ endef
+ define do_link
+ $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+ endef
+ define do_strip
+ $(FROMELF) $(OP)bin $(OP)output $@ $<
+ endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+ ASM := as
+ AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+ ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--defsym $(macro)=1)
+ ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--defsym $(macro)=0)
+ ASM_LINKBASE_MACRO := --defsym _LINKBASE_=$(LINKBASE)
+
+ LINKFLAGS = -n --section-alignment 4 --file-alignment 2 -no-whole-archive
+ GCCFLAGS=-march=armv4 -nostdinc -pipe -c -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas
+ GCCFLAGS := $(GCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ GCCDEFS = -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__MARM__ -D__MARM_ARM4__ -DEKA2 -DSYMBIAN_SUPPORT_UNISTORE2
+ ifeq "$(CFG)" "UDEB"
+ GCC = gcc -x c++ -g -O2 $(GCCFLAGS) -D_DEBUG -D_UNICODE $(GCCDEFS)
+ else
+ GCC = gcc -x c++ -s -fomit-frame-pointer -O2 $(GCCFLAGS) -DNDEBUG -D_UNICODE $(GCCDEFS)
+ endif
+
+ LINKFILE = $(SPECSRCDIR)/coreldr.lnk
+ OBJEXT := o
+ INCEXT := ginc
+
+ PROCESS_INCLUDES := 1
+ define do_compile
+ $(GCC) -o $@ $<
+ endef
+ define do_h2inc
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ AS
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $@ $(join $(basename $@),.ginc)
+ endef
+ define do_includes
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+ endef
+ define do_asm
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s)
+ $(AS) $(AFLAGS) $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -o $@ $(join $(basename $@),.s)
+ endef
+ define do_strip
+ strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+
+ $(ERASE) $(call slash2generic,"$(TMPTARGET)")
+ # $(ERASE) "$(TMPTARGET)"
+ echo Built $(TARGET)
+ endef
+ define do_link
+ ld -o "$(TMPTARGET)" --start $(FULLOBJECTS) --script=$(LINKFILE)
+ endef
+endif
+
+
+#CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+ $(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2)
+ $(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+XSRCPPOBJECTS := $(foreach f,$(XSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLXSRCPPOBJECTS)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+ $(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+ $(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+ $(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+ $(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+ echo Nothing to do
+
+FREEZE :
+ echo Nothing to do
+
+LIB :
+ echo Nothing to do
+
+CLEANLIB :
+ echo Nothing to do
+
+RESOURCE :
+ echo Nothing to do
+
+FINAL :
+ echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+ @echo "$(TARGET)"
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,"$(TARGET)")
+ -$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+# -$(ERASE) "$(TARGET)"
+# -$(ERASE) "$(BUILDLOC)/*.*"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h4_genbootinc.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,22 @@
+# Copyright (c) 2005-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:
+# Meta information for the h4_genbootinc extension template
+#
+
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h4_genbootinc.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,58 @@
+# Copyright (c) 2006-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:
+# Generate assembler inc files from header files
+#
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+XINCDIR := $(INC_PATH)/omap_hrp/h4
+XINCDIR2 := $(INC_PATH)/omap_hrp/assp/omap24xx
+
+MAKMAKE : all
+
+FREEZE :
+
+LIB : all
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : all
+
+RELEASABLES :
+ @echo $(XINCDIR)/nand_fbr_offset.inc
+ @echo $(XINCDIR2)/omap24xxconst.inc
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(XINCDIR)/nand_fbr_offset.inc)
+# -$(ERASE) $(XINCDIR)/nand_fbr_offset.inc
+ @echo $(XINCDIR2)/omap24xxconst.inc
+
+all: $(XINCDIR2)/omap24xxconst.inc $(XINCDIR)/nand_fbr_offset.inc
+
+$(XINCDIR)/nand_fbr_offset.inc : $(XINCDIR)/nand_fbr_offset.h
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/nand_fbr_offset.h $(XINCDIR)/nand_fbr_offset.inc ARMASM
+
+$(XINCDIR2)/omap24xxconst.inc : $(XINCDIR2)/omap24xxconst.h
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR2)/omap24xxconst.h $(XINCDIR2)/omap24xxconst.inc ARMASM
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h4_restricted_coreldr.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2005-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:
+# Meta information for the h4_restricted_coreldr extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h4_restricted_coreldr.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,388 @@
+# Copyright (c) 2006-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:
+# # NB! LINKBASE : Code execute address also set coreldr.lnk file
+# # MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+#
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+#DUMP_PAGE_TABLES := TRUE
+
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ USE_MMU := TRUE
+else
+ DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+ USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+ WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+XSRSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr/unistore2
+SPECSRCDIR := $(EXTENSION_ROOT)/../omaph4bsp/h4/nandboot/coreldr_smallblk
+
+VARIANTINC := $(INC_PATH)/omap_hrp/h4
+VARIANTINC2 := $(EXTENSION_ROOT)/../omaph4bsp/shared/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../omaph4bsp/h4/nand
+
+GENINC1 := $(INC_PATH)
+GENINC3 := $(EPOCROOT)epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(GENINC3)
+
+# Set the source/include/target directories
+GSRCDIR = ../../../unref/orphan/cedgen/shared/nandboot
+VINCDIR = ../../../unref/orphan/cedgen/h4/inc
+GINCDIR = ../../../unref/orphan/cedgen/shared/inc
+EPOCINCDIR = $(INC_PATH)/omap_hrp/h4
+
+# Build directory (EPOCBLD too long)
+#BUILDLOC = $(EPOCROOT)epoc32/build/omap_hrp/h4_restricted/unistore2/nandboot/coreldr/$(PLATFORM_PATH)
+#BUILDLOC = $(EPOCBLD)/$(PLATFORM_PATH)/$(CFG_PATH) # Error as $(EPOCBLD) include platform
+BUILDLOC = $(EPOCBLD)/$(CFG_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)/h4hrp_un2_sb_coreldr.bin
+TMPTARGET = $(BUILDLOC)/h4hrp_un2_sb_coreldr.elf
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES :=
+
+VHEADERS := nanddevice.h
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+ASMSOURCE := coreldrasm_smallblk.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp
+XSRCPPSOURCE := coreldrxsr.cpp
+
+ifeq "$(USE_MMU)" "TRUE"
+ GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On H4 this number is base of ram + 48MB (permitting 48MB core images)
+# this number is pretty arbitrary and may be raised higher into ram
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE = 0x83000000
+
+
+
+#ARMASM_OUT := $(shell armasm 2>&1)
+#ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+ARMASM_OUT := $(wordlist 2, 4, $(shell armasm --vsn 2>&1))
+
+# Select the toolchain: ARM RVCT, then GCC
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+#RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+RVCTSTR := $(strip $(findstring RVCT,$(ARMASM_OUT)))
+ifeq "$(RVCTSTR)" "RVCT"
+ TOOLVER := RVCT
+ OP := --
+ OB := o
+endif
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+ ASM_TRUE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+ ASM_TRUE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+ ASM_FALSE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+ ASM_FALSE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+ ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+ ASM_TRUE_MACROS += USE_CXSF
+ ASM := armasm
+ LINK := armlink
+ FROMELF := fromelf
+ CPP := armcc
+
+ OBJEXT := o
+ INCEXT := inc
+
+ ARMCCFLAGS := --arm -c -Otime --cpp
+ ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ ARMCCFLAGS := $(ARMCCFLAGS) -DSYMBIAN_SUPPORT_UNISTORE2
+
+ ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+ ifeq "$(CFG)" "UDEB"
+ ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+ endif
+
+ ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+ ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+ AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map
+ SYMOPT := $(OP)symdefs
+ ASMTYP := ARMASM
+ LINKFILE :=
+
+ define do_compile
+ $(CPP) $(ARMCCFLAGS) $< -o $@
+ endef
+ define do_h2inc
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+ endef
+ define do_asm
+ $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+ endef
+ define do_link
+ $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+ endef
+ define do_strip
+ $(FROMELF) $(OP)bin $(OP)output $@ $<
+ endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+ ASM := as
+ AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+ ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--defsym $(macro)=1)
+ ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--defsym $(macro)=0)
+ ASM_LINKBASE_MACRO := --defsym _LINKBASE_=$(LINKBASE)
+
+ LINKFLAGS = -n --section-alignment 4 --file-alignment 2 -no-whole-archive
+ GCCFLAGS=-march=armv4 -nostdinc -pipe -c -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas
+ GCCFLAGS := $(GCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ GCCDEFS = -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__MARM__ -D__MARM_ARM4__ -DEKA2 -DSYMBIAN_SUPPORT_UNISTORE2
+ ifeq "$(CFG)" "UDEB"
+ GCC = gcc -x c++ -g -O2 $(GCCFLAGS) -D_DEBUG -D_UNICODE $(GCCDEFS)
+ else
+ GCC = gcc -x c++ -s -fomit-frame-pointer -O2 $(GCCFLAGS) -DNDEBUG -D_UNICODE $(GCCDEFS)
+ endif
+
+ LINKFILE = $(SPECSRCDIR)/coreldr.lnk
+ OBJEXT := o
+ INCEXT := ginc
+
+ PROCESS_INCLUDES := 1
+ define do_compile
+ $(GCC) -o $@ $<
+ endef
+ define do_h2inc
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ AS
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $@ $(join $(basename $@),.ginc)
+ endef
+ define do_includes
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+ endef
+ define do_asm
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s)
+ $(AS) $(AFLAGS) $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -o $@ $(join $(basename $@),.s)
+ endef
+ define do_strip
+ strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+ echo Built $(TARGET)
+ endef
+ define do_link
+ ld -o "$(TMPTARGET)" --start $(FULLOBJECTS) --script=$(LINKFILE)
+ endef
+endif
+
+
+#CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+ $(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2)
+ $(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+XSRCPPOBJECTS := $(foreach f,$(XSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLXSRCPPOBJECTS)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+ $(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+ $(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+ $(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+ $(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+ echo Nothing to do
+
+FREEZE :
+ echo Nothing to do
+
+LIB :
+ echo Nothing to do
+
+CLEANLIB :
+ echo Nothing to do
+
+RESOURCE :
+ echo Nothing to do
+
+FINAL :
+ echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+ @echo "$(TARGET)"
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,"$(TARGET)")
+ -$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+# -$(ERASE) "$(TARGET)"
+# -$(ERASE) "$(BUILDLOC)/*.*"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h4_restricted_on_coreldr.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2005-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:
+# Meta information for the h4_restricted_coreldr extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h4_restricted_on_coreldr.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,375 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# # NB! LINKBASE : Code execute address also set coreldr.lnk file
+# # MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+#
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+
+# This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+#DUMP_PAGE_TABLES := TRUE
+
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ USE_MMU := TRUE
+else
+ DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+ USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+ WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+BLSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/util/ONBL2
+XSRSRCDIR1 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/OAM/OSLess
+XSRSRCDIR2 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/LLD/DNandO
+SPECSRCDIR := $(EXTENSION_ROOT)/../omaph4bsp/h4/nandboot/coreldr_onenand
+SPECXSRSRCDIR := $(EXTENSION_ROOT)/drivers/h4ons
+
+VARIANTINC := $(INC_PATH)/omap_hrp/h4
+VARIANTINC2 := $(EXTENSION_ROOT)/../omaph4bsp/shared/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../omaph4bsp/h4/nand $(EXTENSION_ROOT)/../omaph4bsp/assp/shared/assp $(EXTENSION_ROOT)/../omaph4bsp/assp/omap24xx/inc $(EXTENSION_ROOT)/../omaph4bsp/assp/omap24xx/assp $(EXTENSION_ROOT)/../omaph4bsp/assp/shared/interrupt $(EXTENSION_ROOT)/../omaph4bsp/assp/omap24xx/interrupt $(EXTENSION_ROOT)/../omaph4bsp/shared/gpio $(EXTENSION_ROOT)/../omaph4bsp/shared/mcspi $(EXTENSION_ROOT)/../omaph4bsp/assp/omap24xx/gpio $(EXTENSION_ROOT)/../omaph4bsp/assp/shared $(EXTENSION_ROOT)/../omaph4bsp/shared/cirq $(EXTENSION_ROOT)/../omaph4bsp/shared/dma $(EXTENSION_ROOT)/../omaph4bsp/assp/shared/dma
+
+GENINC1 := $(INC_PATH)
+GENINC3 := $(EPOCROOT)epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2 $(INC_PATH)/memmodel/epoc $(INC_PATH)/kernel $(INC_PATH)/kernel/arm $(INC_PATH)/nkern $(INC_PATH)/nkern/arm
+GENXSRINC := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/inc
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR1) $(XSRSRCDIR2) $(SPECXSRSRCDIR) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(GENINC3) $(GENINC4) $(GENXSRINC) $(GENINC3)
+
+# Set the source/include/target directories
+GSRCDIR = ../../../unref/orphan/cedgen/shared/nandboot
+VINCDIR = ../../../unref/orphan/cedgen/h4/inc
+GINCDIR = ../../../unref/orphan/cedgen/shared/inc
+EPOCINCDIR = $(INC_PATH)/omap_hrp/h4
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/omap_hrp/h4_restricted/unistore2/nandboot/coreldr/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)$/h4hrp_un2_on_coreldr.bin
+TMPTARGET = $(BUILDLOC)$/h4hrp_un2_on_coreldr.elf
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+VHEADERS := nanddevice.h
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+ASMSOURCE := coreldrasm_onenand.s
+GENCPPSOURCE := inflate.cpp
+BLCPPSOURCE := ONBL2.CPP
+XSRCPPSOURCE1 := OSLessOAM.cpp
+XSRCPPSOURCE2 := ONLD.cpp
+SPECXSRCPPSOURCE := pam.cpp
+
+XSRLIB := $(EPOCROOT)epoc32/release/armv5/$(CFG)/nbl2.lib
+
+ifeq "$(USE_MMU)" "TRUE"
+ GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+# HEADERS := inflate.h coreldr.h
+HEADERS :=
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On H4 this number is base of ram + 48MB (permitting 48MB core images)
+# this number is pretty arbitrary and may be raised higher into ram
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE = 0x83000000
+
+
+
+#ARMASM_OUT := $(shell armasm 2>&1)
+#ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+ARMASM_OUT := $(wordlist 2, 4, $(shell armasm --vsn 2>&1))
+
+# Select the toolchain: ARM RVCT, then GCC
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+#RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+RVCTSTR := $(strip $(findstring RVCT2.2,$(ARMASM_OUT)))
+RVCTSTR_4 := $(strip $(findstring RVCT4.0,$(ARMASM_OUT)))
+
+ifeq "$(RVCTSTR)" "RVCT2.2"
+
+ TOOLVER := RVCT2.2
+ OP := --
+ OB := o
+ endif
+
+ ifeq "$(RVCTSTR_4)" "RVCT4.0"
+ TOOLVER := RVCT4.0
+ OP := --
+ OB := o
+endif
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+ ASM_TRUE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+ ASM_TRUE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+ ASM_FALSE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+ ASM_FALSE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+ ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif
+
+#Arm RVCT tools
+#echo hello2 "$(strip $(findstring RVCT, $(TOOLVER)))"
+TOOLVER1 := $(strip $(findstring RVCT, $(TOOLVER)))
+ifeq "$(TOOLVER1)" "RVCT"
+#echo hello2
+ASM_TRUE_MACROS += USE_CXSF
+ASM := armasm
+LINK := armlink
+FROMELF := fromelf
+CPP := armcc
+
+OBJEXT := o
+INCEXT := inc
+
+ARMCCFLAGS := --arm -c -Otime --cpp
+ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ARMCCFLAGS := $(ARMCCFLAGS) -DXSR_NBL2 -DREAL_TARGET -DSYMBIAN_SUPPORT_UNISTORE2
+
+ ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+ ifeq "$(CFG)" "UDEB"
+ ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+ endif
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ifeq "$(TOOLVER)" "RVCT4.0"
+LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map $(OP)no_strict_wchar_size $(OP)no_strict_enum_size
+endif
+ifeq "$(TOOLVER)" "RVCT2.2"
+LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map
+endif
+
+SYMOPT := $(OP)symdefs
+ASMTYP := ARMASM
+LINKFILE :=
+
+define do_compile
+$(CPP) $(ARMCCFLAGS) $< -o $@
+endef
+define do_h2inc
+perl -S $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+endef
+define do_asm
+$(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+define do_link
+$(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+endef
+define do_strip
+$(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+endif
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+ $(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2)
+ $(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+BLCPPOBJECTS := $(foreach f,$(BLCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLBLCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(BLCPPOBJECTS))
+
+XSRCPPOBJECTS1 := $(foreach f,$(XSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS1))
+
+XSRCPPOBJECTS2 := $(foreach f,$(XSRCPPSOURCE2),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS2 := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS2))
+
+SPECXSRCPPOBJECTS := $(foreach f,$(SPECXSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLBLCPPOBJECTS) $(FULLXSRCPPOBJECTS1) $(FULLXSRCPPOBJECTS2) $(FULLSPECXSRCPPOBJECTS) $(XSRLIB)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+ $(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+ $(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLBLCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(BLSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLXSRCPPOBJECTS1) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLXSRCPPOBJECTS2) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR2)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLSPECXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECXSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+ $(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+ $(call ifnotexistd,"$(BUILDLOC)")
+
+
+MAKMAKE :
+ echo Nothing to do
+
+FREEZE :
+ echo Nothing to do
+
+LIB :
+ echo Nothing to do
+
+CLEANLIB :
+ echo Nothing to do
+
+RESOURCE :
+ echo Nothing to do
+
+FINAL :
+ echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+ @echo BLD
+
+RELEASABLES :
+ @echo "$(TARGET)"
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,"$(TARGET)")
+ -$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h4_restricted_on_miniboot.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2005-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:
+# Meta information for the h4_restricted_coreldr extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/h4_restricted_on_miniboot.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,149 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+# WRITE_TIMINGS := TRUE
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+ WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/util/ONBL1
+SPECSRCDIR := $(EXTENSION_ROOT)/nandboot/miniboot_onenand
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/omap_hrp/h4_restricted/unistore2/nandboot/miniboot/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)$/h4hrp_un2_on_miniboot.bin
+TMPTARGET = $(BUILDLOC)$/h4hrp_un2_on_miniboot.elf
+
+#Rules
+vpath %.s . $(GENSRCDIR) $(SPECSRCDIR)
+
+GENASMSOURCE := onbl1.s
+ASMSOURCE := miniboot_onenand.s
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC
+#TOOLVER := RVCT
+OP := --
+OB := o
+
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+ ASM_TRUE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+ ASM_FALSE_MACROS += WRITE_TIMINGS
+endif
+
+#Arm RVCT tools
+ASM_TRUE_MACROS += USE_CXSF
+ASM := armasm
+LINK := armlink
+FROMELF := fromelf
+
+OBJEXT := o
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+
+AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) -I$(BUILDLOC)
+LFLAGS := $(OP)entry BootEntry $(OP)FIRST BootEntry $(OP)map
+SYMOPT := $(OP)symdefs
+ASMTYP := ARMASM
+
+define do_asm
+ $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+
+define do_link
+ $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+endef
+
+define do_strip
+ $(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS)
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+ $(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+ $(do_strip)
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+ $(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+ $(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+ echo Nothing to do
+
+FREEZE :
+ echo Nothing to do
+
+LIB :
+ echo Nothing to do
+
+CLEANLIB :
+ echo Nothing to do
+
+RESOURCE :
+ echo Nothing to do
+
+FINAL :
+ echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+ @echo "$(TARGET)"
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,"$(TARGET)")
+ -$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/lab_restricted_miniboot.flm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,84 @@
+# lab_restricted_miniboot.flm
+#
+# 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:
+#
+
+ifeq ($(lab_restricted_miniboot_flm),)
+lab_restricted_miniboot_flm := 1
+
+# Set the directories
+SRCDIR := $(EXTENSION_ROOT)/../../lab_restricted/unistore2/nandboot/miniboot_largeblk
+
+# Build directory
+BUILDLOC := $(EPOCBLD)/lab_restricted_miniboot_flm/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)/epoc32/release/$(PLATFORM_PATH)
+BINTARGET := $(TARGETDIR)/lab_miniboot.bin
+TMPTARGET := $(BUILDLOC)/lab_miniboot.elf
+TMPTARGET2 := $(BUILDLOC)/lab_miniboot.bin
+
+# Set the Load Address for the miniboot
+# This is currently set to the beginning of SRAM
+LINKBASE := 0x40200000
+
+# Rules
+vpath %.s . $(SRCDIR)
+
+ASMSOURCE := miniboot_largeblk.s
+
+
+# Arm RVCT tools
+ASM_TRUE_MACROS := USE_CXSF
+
+OBJEXT := o
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--predefine "$(macro) SETL {FALSE}")
+
+AFLAGS := -g --keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) -I$(BUILDLOC)
+LFLAGS := --ro-base $(LINKBASE) --entry BootEntry --FIRST BootEntry --map
+SYMOPT := --symdefs
+ASMTYP := ARMASM
+
+# Include base commonly used functions
+include $(EPOCROOT)/epoc32/tools/makefile_templates/base/base_rvct_common.mk
+
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS)
+
+# Link
+$(eval $(call base__link,$(TMPTARGET),$(FULLOBJECTS)))
+# Strip
+$(eval $(call base__strip,$(TMPTARGET2),$(TMPTARGET)))
+# Omapsig
+$(eval $(call base__omapsig,$(BINTARGET),$(TMPTARGET2)))
+
+# Asm objects
+$(eval $(call base__asm,$(FULLASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(SRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+#
+TARGET :: $(BINTARGET) $(TARGETDIR) $(BUILDLOC)
+
+# --what to show releasables
+$(eval $(call whatmacro,$(BINTARGET),USERFLM))
+# Create directory
+CREATABLEPATHS := $(TARGETDIR) $(BUILDLOC)
+$(call makepath,$(CREATABLEPATHS))
+# Clean up
+$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(BUILDLOC)))
+
+endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/lab_restricted_miniboot.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,22 @@
+# Copyright (c) 2005-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:
+#
+# Meta information for the lab_restricted_miniboot extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/lab_restricted_miniboot.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,141 @@
+# lab_restricted_miniboot.mk
+#
+# 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:
+#
+#
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+#Set the directories
+SRCDIR := $(EXTENSION_ROOT)/../../lab_restricted/unistore2/nandboot/miniboot_largeblk
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/lab_restricted/unistore2/nandboot/miniboot/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)$/lab_miniboot.bin
+TMPTARGET = $(BUILDLOC)$/lab_miniboot.elf
+TMPTARGET2 = $(BUILDLOC)$/lab_miniboot.bin
+
+# Set the Load Address for the miniboot
+# This is currently set to the beginning of SRAM
+LINKBASE=0x40200000
+
+#Rules
+vpath %.s . $(SRCDIR)
+
+ASMSOURCE := miniboot_largeblk.s
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC
+#TOOLVER := RVCT
+OP := --
+OB := o
+
+#Arm RVCT tools
+ASM_TRUE_MACROS += USE_CXSF
+ASM := armasm
+LINK := armlink
+FROMELF := fromelf
+
+OBJEXT := o
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+
+AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) -I$(BUILDLOC)
+LFLAGS := $(OP)ro-base $(LINKBASE) $(OP)entry BootEntry $(OP)FIRST BootEntry $(OP)map
+SYMOPT := $(OP)symdefs
+ASMTYP := ARMASM
+
+define do_asm
+ $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+
+define do_link
+ $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+endef
+
+define do_strip
+ $(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+
+define do_omapsig
+ perl -S $(EPOCROOT)epoc32/tools/omapsig.pl $(LINKBASE) $< $@
+endef
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS)
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+ $(do_link)
+
+#strip
+$(TMPTARGET2) : $(TMPTARGET)
+ $(do_strip)
+
+#omapsig
+$(TARGET) : $(TMPTARGET2)
+ $(do_omapsig)
+
+#Asm objects
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+ $(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+ $(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+ echo Nothing to do
+
+FREEZE :
+ echo Nothing to do
+
+LIB :
+ echo Nothing to do
+
+CLEANLIB :
+ echo Nothing to do
+
+RESOURCE :
+ echo Nothing to do
+
+FINAL :
+ echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+ @echo "$(TARGET)"
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,"$(TARGET)")
+ -$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/lab_restricted_miniboot.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build build/2_0.xsd">
+
+<!-- Extension interfaces : replacements for Template Extension Makefiles -->
+
+ <interface name="base.lab_restricted_miniboot" extends="Symbian.KernelFLM" flm="lab_restricted_miniboot.flm">
+ </interface>
+
+</build>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/nand_fbr_offset.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2005-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:
+# Meta information for the nand_fbr_offset extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/nand_fbr_offset.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,85 @@
+# Copyright (c) 2006-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:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EXTENSION_ROOT)/drivers
+
+## Set the target name
+SRC := $(SRCDIR)/nand_fbr_offset.h
+TARGET = $(TARGETDIR)/nand_fbr_offset.inc
+
+
+
+#Include processing
+FULLINCLUDES := $(addprefix $(SRCDIR)/,$(INCLUDES))
+#Object processing
+FULLSRC := $(addprefix $(SRCDIR)/,$(SRC))
+
+ifdef PROCESS_INCLUDES
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+FULLINCLUDES := $(foreach f,$(FULLINCLUDES),$(basename $(f)).$(INCEXT))
+#Creation of headers
+$(FULLINCLUDES) : $(SRCDIR)/%.$(INCEXT) : %.inc
+ $(do_headers)
+else
+#Armasm sytax specifc asm rule goes here
+endif
+
+
+#Rules
+#vpath %.inc . $(SRCDIR)
+
+
+MAKMAKE :
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $(SRC) $(TARGET) ARMASM
+# echo Nothing to do
+
+FREEZE :
+ echo Nothing to do
+
+LIB :
+ echo Nothing to do
+
+CLEANLIB :
+ echo Nothing to do
+
+RESOURCE :
+ echo Nothing to do
+
+FINAL :
+ echo Nothing to do
+
+
+
+BLD SAVESPACE :
+ echo Nothing to do
+
+RELEASABLES :
+ @echo "$(TARGET)"
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,"$(TARGET)")
+ -$(ERASE) $(call slash2generic,"$(BUILDLOC)/$(TARGET)")
+# -$(ERASE) "$(TARGET)")
+# -$(ERASE) "$(BUILDLOC)/$(TARGET)")
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/ne1_tb_genbootinc.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,22 @@
+# Copyright (c) 2005-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:
+# Meta information for the h4_genbootinc extension template
+#
+
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/ne1_tb_genbootinc.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,54 @@
+# Copyright (c) 2006-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:
+# h4_genbootinc.mk
+# Generate assembler inc files from header files
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+XINCDIR := $(INC_PATH)/assp/naviengine
+XGENDIR := $(INC_PATH)/assp/naviengine/$(MEMMODEL)
+
+MAKMAKE : all
+
+FREEZE :
+
+LIB : all
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : all
+
+RELEASABLES :
+ @echo $(XGENDIR)/naviengine.inc
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(XGENDIR)/naviengine.inc)
+ @echo $(XGENDIR)/naviengine.inc
+
+all: $(XGENDIR)/naviengine.inc
+
+$(XGENDIR)/naviengine.inc : $(XINCDIR)/naviengine.h
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/naviengine.h $(XGENDIR)/naviengine.inc ARMASM
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/ne1_tb_restricted_coreldr.flm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,281 @@
+# 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:
+# ne1_tb_restricted_coreldr.flm
+# # NB! LINKBASE : Code execute address also set coreldr.lnk file
+# # MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+#
+#
+
+ifeq ($($(NAME)_ne1_tb_resricted_coreldr_flm),)
+$(NAME)_ne1_tb_resricted_coreldr_flm := 1
+
+## THESE MACROS NEED TO BE SET EXPLICITLY TO TRUE OR BLANK
+
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+
+# This macro enables benchmarking code. Comment out or set FALSE if not required
+WRITE_TIMINGS :=
+# Timer is not implemented for Naviengine. Do not enable!
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+DUMP_PAGE_TABLES :=
+# Page tables cannot be dumped on Naviengine due to the NANDController used. Do not enable!
+
+# This macro enables the MMU enabled version of the coreldr to call RestartAuxiliaryCores
+# before it runs the core image. This function should be defined in the variant, to
+# restart the auxiliary cores, which it should have paused on startup.
+RUNS_WITH_SMP := TRUE
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ USE_MMU := TRUE
+else
+ DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+ USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+ WRITE_TIMINGS := FALSE
+endif
+
+# Set the directories; based on calling bld.inf
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+# Generic drivers
+BLSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/util/ONBL2
+XSRSRCDIR1 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/OAM/OSLess
+XSRSRCDIR2 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/LLD/DNandO
+# Coreloader ASM...
+SPECSRCDIR := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/nandboot
+# PAM - Platform specific Version
+SPECXSRSRCDIR := $(EXTENSION_ROOT)/pam
+SPECXSRSRCDIR1 := $(EXTENSION_ROOT)/lld
+
+# Platform Variant includes
+VARIANTINC := $(INC_PATH)/ne1_tb
+VARIANTINC2 := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/nand $(EXTENSION_ROOT)/../navienginebsp/naviengine_assp $(INC_PATH)/assp/naviengine/$(MEMMODEL)
+
+# Generic driver file includes
+GENINC1 := $(INC_PATH) $(EPOCROOT)/epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2 $(INC_PATH)/memmodel/epoc $(INC_PATH)/kernel $(INC_PATH)/kernel/arm $(INC_PATH)/nkern $(INC_PATH)/nkern/arm
+GENXSRINC := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/inc
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR1) $(XSRSRCDIR2) $(SPECXSRSRCDIR) $(SPECXSRSRCDIR1) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(GENINC3) $(GENINC4) $(GENXSRINC)
+
+
+# Set the source/include/target directories
+
+# epoc32 folder for exported header files
+EPOCINCDIR := $(INC_PATH)/ne1_tb
+
+# Build directory
+BUILDLOC := $(EPOCBLD)/ne1_tb_restricted_coreldr_flm/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)/epoc32/release/$(PLATFORM_PATH)
+BINTARGET := $(TARGETDIR)/$(NAME).bin
+TMPTARGET := $(BUILDLOC)/$(NAME).elf
+
+# Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+
+# from base/e32/include/drivers/...
+VHEADERS := nanddevice.h
+# the following .inc files get built as part of the process
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+#
+ASMSOURCE := coreldrasm.s
+GENCPPSOURCE := inflate.cpp
+BLCPPSOURCE := ONBL2.CPP
+XSRCPPSOURCE1 := OSLessOAM.cpp
+SPECXSRCPPSOURCE := pam.cpp
+SPECXSRCPPSOURCE1 := pnl.cpp
+
+XSRLIB := $(EPOCROOT)/epoc32/release/armv5/$(CFG)/nbl2.lib
+
+# Only link in the MMU stuff if required
+GENASMSOURCE :=
+ifeq "$(USE_MMU)" "TRUE"
+ GENASMSOURCE := coreldrmmu.s
+endif
+
+HEADERS :=
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On NaviEngine this number is base of ram + 208MB (permitting 208MB core images)
+# this number is pretty arbitrary
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE := 0x8D000000
+
+# Build up logical TRUE defines
+ASM_TRUE_MACROS :=
+
+ifeq "$(USE_MMU)" "TRUE"
+ ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+ ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) DUMP_PAGE_TABLES
+endif
+
+ifeq "$(RUNS_WITH_SMP)" "TRUE"
+ ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) RUNS_WITH_SMP
+endif
+
+# Build up logical FALSE defines
+ASM_FALSE_MACROS :=
+
+ifeq "$(USE_MMU)" "FALSE"
+ ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+ ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+ ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) DUMP_PAGE_TABLES
+endif
+
+
+# Arm RVCT tools
+ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) USE_CXSF
+
+OBJEXT := o
+INCEXT := inc
+
+ARMCCFLAGS := --arm -c -Otime --cpp --enum_is_int
+ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ARMCCFLAGS := $(ARMCCFLAGS) -DXSR_NBL2 -DREAL_TARGET -DDEFERED_CHK -DSYMBIAN_SUPPORT_UNISTORE2
+
+ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)/epoc32/include/rvct/rvct.h
+
+ifeq "$(CFG)" "UDEB"
+ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+endif
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--predefine "$(macro) SETL {FALSE}")
+ASM_LINKBASE_MACRO := --predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+AFLAGS := -g --keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+LFLAGS := --entry BootEntry --ro-base $(LINKBASE) --FIRST BootEntry --map
+SYMOPT := --symdefs
+ASMTYP := ARMASM
+LINKFILE :=
+
+# include base commonly used functions
+include $(EPOCROOT)/epoc32/tools/makefile_templates/base/base_rvct_common.mk
+
+
+# Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+# do h2inc
+$(eval $(call base__h2inc,$(FULLBUILTINCLUDES),$(FULLVHEADERS)))
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+# do h2inc
+$(eval $(call base__h2inc,$(FULLBUILTINCLUDES2),$(FULLVHEADERS2)))
+
+# object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+BLCPPOBJECTS := $(foreach f,$(BLCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLBLCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(BLCPPOBJECTS))
+
+XSRCPPOBJECTS1 := $(foreach f,$(XSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS1))
+
+SPECXSRCPPOBJECTS := $(foreach f,$(SPECXSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS))
+
+SPECXSRCPPOBJECTS1 := $(foreach f,$(SPECXSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS1))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLBLCPPOBJECTS) $(FULLXSRCPPOBJECTS1) $(FULLSPECXSRCPPOBJECTS) $(FULLSPECXSRCPPOBJECTS1) $(XSRLIB)
+
+
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+
+# Link
+$(eval $(call base__link,$(TMPTARGET),$(FULLOBJECTS)))
+
+# Strip
+$(eval $(call base__strip,$(BINTARGET),$(TMPTARGET)))
+
+# CPP objects
+$(eval $(call base__compile,$(FULLGENCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLBLCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(BLSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLXSRCPPOBJECTS1),$(BUILDLOC)/%.$(OBJEXT),$(XSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLSPECXSRCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(SPECXSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLSPECXSRCPPOBJECTS1),$(BUILDLOC)/%.$(OBJEXT),$(SPECXSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+# Asm objects
+$(eval $(call base__asm,$(FULLGENASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+$(eval $(call base__asm,$(FULLASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+#
+TARGET :: $(TARGETDIR) $(BUILDLOC) $(BINTARGET)
+
+# --what to show releasables
+$(eval $(call whatmacro,$(BINTARGET),USERFLM))
+# Create directory
+CREATABLEPATHS := $(TARGETDIR) $(BUILDLOC)
+$(call makepath,$(CREATABLEPATHS))
+# Clean up
+$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(BUILDLOC)))
+
+endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/ne1_tb_restricted_coreldr.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2008-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:
+# Meta information for the Navi_restricted_coreldr extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/ne1_tb_restricted_coreldr.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,398 @@
+# Copyright (c) 2008-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:
+# ne1_tb_restricted_coreldr.mk
+# # NB! LINKBASE : Code execute address also set coreldr.lnk file
+# # MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+#
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+
+# This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+# Timer is not implemented for Naviengine. Do not enable!
+
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+# DUMP_PAGE_TABLES := TRUE
+# Page tables cannot be dumped on Naviengine due to the NANDController used. Do not enable!
+
+# This macro enables the MMU enabled version of the coreldr to call RestartAuxiliaryCores
+# before it runs the core image. This function should be defined in the variant, to
+# restart the auxiliary cores, which it should have paused on startup.
+RUNS_WITH_SMP := TRUE
+
+# Macro used to enable support for Shadowed Memory Regions feature in loader
+# See also varaint\config.inc to enable in bootstrap
+SUPPORTS_SMR := TRUE
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ USE_MMU := TRUE
+else
+ DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+ USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+ WRITE_TIMINGS := FALSE
+endif
+
+ifneq "$(SUPPORTS_SMR)" "TRUE"
+ SUPPORTS_SMR := FALSE
+endif
+
+#Set the directories; based on calling bld.inf
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+#Generic drivers
+BLSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/util/ONBL2
+XSRSRCDIR1 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/OAM/OSLess
+XSRSRCDIR2 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/LLD/DNandO
+#Coreloader ASM...
+SPECSRCDIR := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/nandboot
+#PAM - Platform specific Version
+SPECXSRSRCDIR := $(EXTENSION_ROOT)/pam
+SPECXSRSRCDIR1 := $(EXTENSION_ROOT)/lld
+
+#Platform Variant includes
+VARIANTINC := $(INC_PATH)/ne1_tb
+VARIANTINC2 := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/nand $(EXTENSION_ROOT)/../navienginebsp/naviengine_assp $(INC_PATH)/assp/naviengine/$(MEMMODEL)
+
+#Generic driver file includes
+GENINC1 := $(INC_PATH) $(EPOCROOT)epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2 $(INC_PATH)/memmodel/epoc $(INC_PATH)/kernel $(INC_PATH)/kernel/arm $(INC_PATH)/nkern $(INC_PATH)/nkern/arm
+GENXSRINC := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/inc
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR1) $(XSRSRCDIR2) $(SPECXSRSRCDIR) $(SPECXSRSRCDIR1) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(GENINC3) $(GENINC4) $(GENXSRINC)
+
+
+# Set the source/include/target directories
+
+#epoc32 folder for exported header files
+EPOCINCDIR = $(INC_PATH)/ne1_tb
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/bsp/hwip_nec_naviengine/ne1_tb_restricted/unistore2/nandboot/coreldr/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)$/$(NAME).bin
+TMPTARGET = $(BUILDLOC)$/$(NAME).elf
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+
+# from base/e32/include/drivers/...
+VHEADERS := nanddevice.h
+# the following .inc files get built as part of the process
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+
+
+ASMSOURCE := coreldrasm.s
+GENCPPSOURCE := inflate.cpp
+BLCPPSOURCE := ONBL2.CPP
+XSRCPPSOURCE1 := OSLessOAM.cpp
+SPECXSRCPPSOURCE := pam.cpp
+SPECXSRCPPSOURCE1 := pnl.cpp
+
+XSRLIB := $(EPOCROOT)epoc32/release/armv5/$(CFG)/nbl2.lib
+
+ifeq "$(USE_MMU)" "TRUE"
+ #generic version found in base/e32utils/nandboot/coreldr/...
+ GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+HEADERS :=
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On NaviEngine this number is base of ram + 208MB (permitting 208MB core images)
+# this number is pretty arbitrary
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE = 0x8D000000
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+ TOOLVER := RVCT
+ OP := --
+ OB := o
+endif
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+ ASM_TRUE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+ ASM_TRUE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(SUPPORTS_SMR)" "TRUE"
+ ASM_TRUE_MACROS += SUPPORTS_SMR
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif
+
+ifeq "$(RUNS_WITH_SMP)" "TRUE"
+ ASM_TRUE_MACROS += RUNS_WITH_SMP
+endif
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+ ASM_FALSE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+ ASM_FALSE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(SUPPORTS_SMR)" "FALSE"
+ ASM_FALSE_MACROS += SUPPORTS_SMR
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+ ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+ASM_TRUE_MACROS += USE_CXSF
+ASM := armasm
+LINK := armlink
+FROMELF := fromelf
+CPP := armcc
+
+OBJEXT := o
+INCEXT := inc
+
+ARMCCFLAGS := --arm -c -Otime --cpp
+ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ARMCCFLAGS := $(ARMCCFLAGS) -DXSR_NBL2 -DREAL_TARGET -DDEFERED_CHK -DSYMBIAN_SUPPORT_UNISTORE2
+
+
+ifeq "$(SUPPORTS_SMR)" "TRUE"
+ ARMCCFLAGS := $(ARMCCFLAGS) -DSUPPORTS_SMR
+endif
+
+
+
+ ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+ ifeq "$(CFG)" "UDEB"
+ ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+ endif
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map
+SYMOPT := $(OP)symdefs
+ASMTYP := ARMASM
+LINKFILE :=
+
+define do_compile
+$(CPP) $(ARMCCFLAGS) $< -o $@
+endef
+define do_h2inc
+perl -S $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+endef
+define do_asm
+$(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+define do_link
+$(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+endef
+define do_strip
+$(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+endif
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+ $(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2)
+ $(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+BLCPPOBJECTS := $(foreach f,$(BLCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLBLCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(BLCPPOBJECTS))
+
+XSRCPPOBJECTS1 := $(foreach f,$(XSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS1))
+
+SPECXSRCPPOBJECTS := $(foreach f,$(SPECXSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS))
+
+SPECXSRCPPOBJECTS1 := $(foreach f,$(SPECXSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS1))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLBLCPPOBJECTS) $(FULLXSRCPPOBJECTS1) $(FULLSPECXSRCPPOBJECTS) $(FULLSPECXSRCPPOBJECTS1) $(XSRLIB)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+ $(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+ $(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLBLCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(BLSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLXSRCPPOBJECTS1) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLSPECXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECXSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLSPECXSRCPPOBJECTS1) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECXSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+ $(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+ $(call ifnotexistd,"$(BUILDLOC)")
+
+
+MAKMAKE :
+ echo Nothing to do
+
+FREEZE :
+ echo Nothing to do
+
+LIB :
+ echo Nothing to do
+
+CLEANLIB :
+ echo Nothing to do
+
+RESOURCE :
+ echo Nothing to do
+
+FINAL :
+ echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+ @echo BLD
+
+RELEASABLES :
+ @echo "$(TARGET)"
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,"$(TARGET)")
+ -$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/ne1_tb_restricted_coreldr.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build build/2_0.xsd">
+
+<!-- Extension interfaces : replacements for Template Extension Makefiles -->
+
+ <interface name="base.ne1_tb_restricted_coreldr" extends="Symbian.KernelFLM" flm="ne1_tb_restricted_coreldr.flm">
+ <param name="NAME" />
+ <param name="MEMMODEL" />
+ <param name="INCLUDES" default='' />
+ <param name="INC_PATH" />
+ </interface>
+
+</build>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/omap3_genbootinc.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,22 @@
+# Copyright (c) 2008-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:
+# Meta information for the omap3_genbootinc extension template
+#
+
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/omap3_genbootinc.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,59 @@
+# Copyright (c) 2006-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:
+# Generate assembler inc files from header files
+#
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+# This will need to change when the directory gets renamed
+XINCDIR := $(INC_PATH)/tiomap3/variant/common
+XINCDIR2 := $(INC_PATH)/tiomap3/assp/common
+
+
+MAKMAKE : all
+
+FREEZE :
+
+LIB : all
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : all
+
+RELEASABLES :
+ @echo $(XINCDIR)/nand_fbr_offset.inc
+ @echo $(XINCDIR2)/customrestartreasons.inc
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(XINCDIR)/nand_fbr_offset.inc)
+# -$(ERASE) $(XINCDIR)/nand_fbr_offset.inc
+ @echo $(XINCDIR2)/customrestartreasons.inc
+
+all: $(XINCDIR2)/customrestartreasons.inc $(XINCDIR)/nand_fbr_offset.inc
+
+$(XINCDIR)/nand_fbr_offset.inc : $(XINCDIR)/nand_fbr_offset.h
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/nand_fbr_offset.h $(XINCDIR)/nand_fbr_offset.inc ARMASM
+
+$(XINCDIR2)/customrestartreasons.inc : $(XINCDIR2)/customrestartreasons.h
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR2)/customrestartreasons.h $(XINCDIR2)/customrestartreasons.inc ARMASM
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/omap3_restricted_coreldr.flm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,244 @@
+# 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:
+# # NB! LINKBASE : Code execute address also set coreldr.lnk file
+# # MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+#
+
+ifeq ($($(NAME)_omap3_resricted_coreldr_flm),)
+$(NAME)_omap3_resricted_coreldr_flm := 1
+
+## THESE MACROS NEED TO BE SET EXPLICITLY TO TRUE OR BLANK
+
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU :=
+
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+WRITE_TIMINGS :=
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+DUMP_PAGE_TABLES :=
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ USE_MMU := TRUE
+else
+ DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+ USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+ WRITE_TIMINGS := FALSE
+endif
+
+# Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+XSRSRCDIR := $(EXTENSION_ROOT)/../../../../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr/unistore2
+SPECSRCDIR := $(EXTENSION_ROOT)/../../../assp/common/nandboot/coreldr_largeblk
+
+VARIANTINC := $(INC_PATH)/tiomap3/variant/$(VARIANT_PATH)
+VARIANTINC2 := $(EXTENSION_ROOT)/../../../assp/common/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../../34xx_sdp/nand
+VARIANTINC4 := $(INC_PATH)/tiomap3/variant/common
+
+GENINC1 := $(INC_PATH) $(EPOCROOT)/epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2
+GENINCPATH := $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(VARIANTINC4) $(GENINC1) $(GENDRIVERINC) $(GENINC2)
+
+# Set the source/include/target directories
+GSRCDIR := ../../../assp/common/nandboot
+VINCDIR := ../../../h4/inc
+GINCDIR := ../../../shared/inc
+EPOCINCDIR := $(INC_PATH)/tiomap3/variant/34xx_sdp
+
+# Build directory
+BUILDLOC := $(EPOCBLD)/omap3_restricted_coreldr_flm/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)/epoc32/release/$(PLATFORM_PATH)
+BINTARGET := $(TARGETDIR)/$(NAME).bin
+TMPTARGET := $(BUILDLOC)/$(NAME).elf
+
+# Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES :=
+
+VHEADERS := nanddevice.h
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+ASMSOURCE := coreldrasm_largeblk.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp
+XSRCPPSOURCE := coreldrxsr.cpp
+
+# Only link in the MMU stuff if required
+GENASMSOURCE :=
+ifeq "$(USE_MMU)" "TRUE"
+ GENASMSOURCE := coreldrmmu.s
+endif
+
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On H4 this number is base of ram + 48MB (permitting 48MB core images)
+# this number is pretty arbitrary and may be raised higher into ram
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE := 0x83000000
+
+# Build up logical TRUE defines
+ASM_TRUE_MACROS :=
+
+ifeq "$(USE_MMU)" "TRUE"
+ ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+ ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) DUMP_PAGE_TABLES
+endif
+
+# Build up logical FALSE defines
+ASM_FALSE_MACROS :=
+
+ifeq "$(USE_MMU)" "FALSE"
+ ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+ ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+ ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) DUMP_PAGE_TABLES
+endif
+
+
+# Arm RVCT tools
+ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) USE_CXSF
+
+OBJEXT := o
+INCEXT := inc
+
+ARMCCFLAGS := --arm -c -Otime --cpp --enum_is_int
+ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ARMCCFLAGS := $(ARMCCFLAGS) -DSYMBIAN_SUPPORT_UNISTORE2
+
+ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)/epoc32/include/rvct/rvct.h
+
+ifdef MACRO
+ARMCCFLAGS := $(ARMCCFLAGS) -D$(MACRO)
+endif
+
+ifeq "$(CFG)" "UDEB"
+ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+endif
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--predefine "$(macro) SETL {FALSE}")
+ASM_LINKBASE_MACRO := --predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+AFLAGS := -g --keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+LFLAGS := --entry BootEntry --ro-base $(LINKBASE) --FIRST BootEntry --map
+SYMOPT := --symdefs
+ASMTYP := ARMASM
+LINKFILE :=
+
+# Include base commonly used functions with RVCT toolchain
+include $(EPOCROOT)/epoc32/tools/makefile_templates/base/base_rvct_common.mk
+
+
+# CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+# Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+
+$(eval $(call base__h2inc,$(FULLBUILTINCLUDES),$(FULLVHEADERS)))
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+
+$(eval $(call base__h2inc,$(FULLBUILTINCLUDES2),$(FULLVHEADERS2)))
+
+# Object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+XSRCPPOBJECTS := $(foreach f,$(XSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLXSRCPPOBJECTS)
+
+
+FULLINCLUDES := $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES := $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES := $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES := $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+
+# Link
+$(eval $(call base__link,$(TMPTARGET),$(FULLOBJECTS)))
+
+# Strip
+$(eval $(call base__strip,$(BINTARGET),$(TMPTARGET)))
+
+# CPP objects
+$(eval $(call base__compile,$(FULLGENCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLXSRCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(XSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+# Asm objects
+$(eval $(call base__asm,$(FULLGENASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+$(eval $(call base__asm,$(FULLASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+#
+TARGET :: $(TARGETDIR) $(BUILDLOC) $(BINTARGET)
+
+# --what to show releasables
+$(eval $(call whatmacro,$(BINTARGET),USERFLM))
+# Create directory
+CREATABLEPATHS := $(TARGETDIR) $(BUILDLOC)
+$(call makepath,$(CREATABLEPATHS))
+# Clean up
+$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(BUILDLOC)))
+
+endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/omap3_restricted_coreldr.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+# Copyright (c) 2008-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:
+# Meta information for the omap3_restricted_coreldr extension template
+#
+
+platform win32
+makefile gnumake
+techstream base
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/omap3_restricted_coreldr.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,391 @@
+# Copyright (c) 2008-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:
+# # NB! LINKBASE : Code execute address also set coreldr.lnk file
+# # MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+#
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+## USE_MMU := TRUE
+
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+#DUMP_PAGE_TABLES := TRUE
+
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ USE_MMU := TRUE
+else
+ DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+ USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+ WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+XSRSRCDIR := $(EXTENSION_ROOT)/../../../../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr/unistore2
+SPECSRCDIR := $(EXTENSION_ROOT)/../../../assp/common/nandboot/coreldr_largeblk
+
+VARIANTINC := $(INC_PATH)/tiomap3/variant/$(VARIANT_PATH)
+VARIANTINC2 := $(EXTENSION_ROOT)/../../../assp/common/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../../34xx_sdp/nand
+VARIANTINC4 := $(INC_PATH)/tiomap3/variant/common
+
+GENINC1 := $(INC_PATH) $(EPOCROOT)epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(VARIANTINC4) $(GENINC1) $(GENDRIVERINC) $(GENINC2)
+
+# Set the source/include/target directories
+GSRCDIR = ../../../assp/common/nandboot
+VINCDIR = ../../../h4/inc
+GINCDIR = ../../../shared/inc
+EPOCINCDIR = $(INC_PATH)/tiomap3/variant/34xx_sdp
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/tiomap3/$(VARIANT_PATH)_restricted/unistore2/nandboot/coreldr/$(PLATFORM)
+#BUILDLOC = $(EPOCROOT)epoc32/build/tiomap3/34xx_sdp_restricted/unistore2/nandboot/coreldr/$(PLATFORM)
+#BUILDLOC = $(EPOCBLD)/$(PLATFORM_PATH)/$(CFG) # Error as $(EPOCBLD) include platform
+#BUILDLOC = $(EPOCBLD)/$(CFG_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)/$(NAME).bin
+TMPTARGET = $(BUILDLOC)/$(NAME).elf
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES :=
+
+VHEADERS := nanddevice.h
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+ASMSOURCE := coreldrasm_largeblk.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp
+XSRCPPSOURCE := coreldrxsr.cpp
+
+ifeq "$(USE_MMU)" "TRUE"
+ GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On H4 this number is base of ram + 48MB (permitting 48MB core images)
+# this number is pretty arbitrary and may be raised higher into ram
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE = 0x83000000
+
+
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+ TOOLVER := RVCT
+ OP := --
+ OB := o
+endif
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+ ASM_TRUE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+ ASM_TRUE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+ ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+ ASM_FALSE_MACROS += USE_MMU
+endif
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+ ASM_FALSE_MACROS += WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+ ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+ ASM_TRUE_MACROS += USE_CXSF
+ ASM := armasm
+ LINK := armlink
+ FROMELF := fromelf
+ CPP := armcc
+
+ OBJEXT := o
+ INCEXT := inc
+
+ ARMCCFLAGS := --arm -c -Otime --cpp
+ ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ ARMCCFLAGS := $(ARMCCFLAGS) -DSYMBIAN_SUPPORT_UNISTORE2
+
+ ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+ ifdef MACRO
+ ARMCCFLAGS := $(ARMCCFLAGS) -D$(MACRO)
+ endif
+
+ ifeq "$(CFG)" "UDEB"
+ ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+ endif
+
+ ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+ ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+ AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map
+ SYMOPT := $(OP)symdefs
+ ASMTYP := ARMASM
+ LINKFILE :=
+
+ define do_compile
+ $(CPP) $(ARMCCFLAGS) $< -o $@
+ endef
+ define do_h2inc
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+ endef
+ define do_asm
+ $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+ endef
+ define do_link
+ $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+ endef
+ define do_strip
+ $(FROMELF) $(OP)bin $(OP)output $@ $<
+ endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+ ASM := as
+ AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+ ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--defsym $(macro)=1)
+ ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--defsym $(macro)=0)
+ ASM_LINKBASE_MACRO := --defsym _LINKBASE_=$(LINKBASE)
+
+ LINKFLAGS = -n --section-alignment 4 --file-alignment 2 -no-whole-archive
+ GCCFLAGS=-march=armv4 -nostdinc -pipe -c -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas
+ GCCFLAGS := $(GCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ GCCDEFS = -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__MARM__ -D__MARM_ARM4__ -DEKA2 -DSYMBIAN_SUPPORT_UNISTORE2
+ ifeq "$(CFG)" "UDEB"
+ GCC = gcc -x c++ -g -O2 $(GCCFLAGS) -D_DEBUG -D_UNICODE $(GCCDEFS)
+ else
+ GCC = gcc -x c++ -s -fomit-frame-pointer -O2 $(GCCFLAGS) -DNDEBUG -D_UNICODE $(GCCDEFS)
+ endif
+
+ LINKFILE = $(SPECSRCDIR)/coreldr.lnk
+ OBJEXT := o
+ INCEXT := ginc
+
+ PROCESS_INCLUDES := 1
+ define do_compile
+ $(GCC) -o $@ $<
+ endef
+ define do_h2inc
+ perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ AS
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $@ $(join $(basename $@),.ginc)
+ endef
+ define do_includes
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+ endef
+ define do_asm
+ perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s)
+ $(AS) $(AFLAGS) $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -o $@ $(join $(basename $@),.s)
+ endef
+ define do_strip
+ strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+ echo Built $(TARGET)
+ endef
+ define do_link
+ ld -o "$(TMPTARGET)" --start $(FULLOBJECTS) --script=$(LINKFILE)
+ endef
+endif
+
+
+#CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+ $(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2)
+ $(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+XSRCPPOBJECTS := $(foreach f,$(XSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLXSRCPPOBJECTS)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+ $(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+ $(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+ $(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+$(FULLXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+ $(do_compile)
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+ $(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+ $(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+ $(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+ echo Nothing to do
+
+FREEZE :
+ echo Nothing to do
+
+LIB :
+ echo Nothing to do
+
+CLEANLIB :
+ echo Nothing to do
+
+RESOURCE :
+ echo Nothing to do
+
+FINAL :
+ echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+ @echo "$(TARGET)"
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,"$(TARGET)")
+ -$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+# -$(ERASE) "$(TARGET)"
+# -$(ERASE) "$(BUILDLOC)/*.*"
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/base/omap3_restricted_coreldr.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<build xmlns="http://symbian.com/xml/build" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symbian.com/xml/build build/2_0.xsd">
+
+<!-- Extension interfaces : replacements for Template Extension Makefiles
+ -->
+
+ <interface name="base.omap3_restricted_coreldr" extends="Symbian.KernelFLM" flm="omap3_restricted_coreldr.flm">
+ <param name="VARIANT_PATH" />
+ <param name="NAME" />
+ <param name="INC_PATH" />
+ <param name="MACRO" default=''/>
+ <param name="INCLUDES" default='' />
+ </interface>
+
+</build>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/converged-comms/createcommdbs.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2006-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:
+# Meta information for PDR generation
+#
+
+platform win32
+makefile gnumake
+techstream converged-comms
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/converged-comms/createcommdbs.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,50 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Envoke CED to create correct CommDB
+#
+#
+
+do_nothing :
+
+
+#
+# The targets invoked by abld
+#
+
+MAKMAKE : do_nothing
+
+RESOURCE : do_nothing
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL :
+ perl $(EXTENSION_ROOT)/createcommdbs.pl --command=build --platform=$(PLATFORM) --variant=$(CFG) --sourceDir=$(EXTENSION_ROOT)/$(SRCDIR) --platsec
+
+CLEAN :
+ perl $(EXTENSION_ROOT)/createcommdbs.pl --command=clean --platform=$(PLATFORM) --variant=$(CFG) --sourceDir=$(EXTENSION_ROOT)/$(SRCDIR) --platsec
+
+RELEASABLES :
+ @perl $(EXTENSION_ROOT)/createcommdbs.pl --command=releasables --platform=$(PLATFORM) --variant=$(CFG) --sourceDir=$(EXTENSION_ROOT)/$(SRCDIR) --platsec
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/converged-comms/installdefaultcommdb.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2006-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:
+# Meta information for PDR generation
+#
+
+platform win32
+makefile gnumake
+techstream converged-comms
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/converged-comms/installdefaultcommdb.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,48 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Envoke CED to install correct CommDB
+#
+
+do_nothing :
+ rem do_nothing
+
+#
+# The targets invoked by abld
+#
+
+MAKMAKE : do_nothing
+
+RESOURCE : do_nothing
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL :
+ perl $(EXTENSION_ROOT)/installdefaultcommdb.pl --command=build --platform=$(PLATFORM) --variant=$(CFG) --platsec
+
+CLEAN :
+ perl $(EXTENSION_ROOT)/installdefaultcommdb.pl --command=clean --platform=$(PLATFORM) --variant=$(CFG) --platsec
+
+RELEASABLES :
+ @perl $(EXTENSION_ROOT)/installdefaultcommdb.pl --command=releasables --platform=$(PLATFORM) --variant=$(CFG) --platsec
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/security/upsserver.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2008-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:
+# Meta information for the GNU ups server extension template
+#
+
+platform win32
+makefile gnumake
+techstream security
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/security/upsserver.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,74 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ZDIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z
+
+ifeq "$(PLATFORM)" "WINSCW"
+COPIED_EXE=$(ZDIR)/sys/bin/upsserver.exe
+endif
+
+
+do_nothing:
+
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+ifdef COPIED_EXE
+#
+# Rules to create and package winscw Z drive upsserver.exe copy
+#
+.PHONY: FINAL
+FINAL : $(COPIED_EXE)
+
+$(COPIED_EXE) : $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/upsserver.exe
+ echo Copying upsserver.exe to emulator Z drive so the UPS romstub works.
+ $(CP) $(call slash2generic,$<) $(call slash2generic,$@)
+
+CLEAN :
+ -$(ERASE) $(COPIED_EXE)
+
+RELEASABLES :
+ echo $(COPIED_EXE)
+
+else
+
+FINAL : do_nothing
+CLEAN : do_nothing
+RELEASABLES : do_nothing
+
+endif
+
+SAVESPACE : BLD
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+RESOURCE : do_nothing
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/conversiontable.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2006-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:
+# Meta information for conversiontable use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/conversiontable.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,75 @@
+# Copyright (c) 2004-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:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+BUILD_DIR = $(call generated,generated/fatcharsetconv)
+
+
+SOURCE_DIR = $(EXTENSION_ROOT)/../unicodeTables
+
+TARGET= $(BUILD_DIR)/cp950.cpp \
+ $(BUILD_DIR)/cp949.cpp \
+ $(BUILD_DIR)/cp936.cpp \
+ $(BUILD_DIR)/cp932.cpp \
+ $(BUILD_DIR)/cp874.cpp \
+ $(BUILD_DIR)/cp1258.cpp \
+ $(BUILD_DIR)/cp1257.cpp \
+ $(BUILD_DIR)/cp1256.cpp \
+ $(BUILD_DIR)/cp1255.cpp \
+ $(BUILD_DIR)/cp1254.cpp \
+ $(BUILD_DIR)/cp1253.cpp \
+ $(BUILD_DIR)/cp1252.cpp \
+ $(BUILD_DIR)/cp1251.cpp \
+ $(BUILD_DIR)/cp1250.cpp
+
+$(BUILD_DIR):
+ $(call createdir,$(BUILD_DIR))
+
+$(TARGET):$(BUILD_DIR)/cp%.cpp : $(SOURCE_DIR)/CP%.txt $(BUILD_DIR)
+ perl $(EXTENSION_ROOT)/FatConversionTable.pl $< $@
+
+
+do_nothing:
+ @echo do nothing
+
+
+MAKMAKE : $(TARGET)
+
+BLD : do_nothing
+
+SAVESPACE : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB: do_nothing
+
+RESOURCE : do_nothing
+
+FINAL : do_nothing
+
+# Do not echo 'do nothing'.
+# Do not specify any 'epoc32/build' files, unless they are built into the CBR.
+RELEASABLES :
+
+CLEAN :
+ -$(ERASE) $(TARGET)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/fm_copyfile_to_winscw_zdrive.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# fm_copyfiles_to_winscw_zdrive.meta
+#
+
+platform winscw
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/fm_copyfile_to_winscw_zdrive.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,71 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# fm_copyfiles_to_winscw_zdrive.mk
+# Arguments to makefile are:
+# option FILE_TO_COPY <src/dest_filename_without_any_path>
+# option SRC_PATH <epocroot_starting_path>
+# option DEST_PATH <emulator_zdrive_path_starting_with_a_z>
+# Job of the this makefile is to copy the specified file to
+# the epoc32/release/winscw/CFG/z/... folder for the current config e.g. UREL or
+# UDEB.
+#
+#
+
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+SOURCE_FILE=$(SRC_PATH)/$(FILE_TO_COPY)
+TARGET_DIR=$(EPOCROOT)epoc32/release/winscw/$(CFG_PATH)/$(DEST_PATH)
+TARGET_FILE=$(TARGET_DIR)/$(FILE_TO_COPY)
+
+DO_NOTHING :
+ @echo do nothing
+
+$(TARGET_DIR) :
+ $(MKDIR) $(call slash2generic,$(TARGET_DIR))
+
+#
+# The targets invoked by abld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN :
+ @echo Erasing $(call slash2generic,$(TARGET_FILE))
+ -$(ERASE) $(call slash2generic,$(TARGET_FILE))
+
+RELEASABLES :
+ @echo $(TARGET_FILE)
+
+FINAL : $(TARGET_DIR)
+ @echo Copying $(call slash2generic,$(SOURCE_FILE)) to $(call slash2generic,$(TARGET_FILE))
+ $(CP) $(call slash2generic,$(SOURCE_FILE)) $(call slash2generic,$(TARGET_FILE))
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/generate_cpp.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2006-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:
+# Meta information for cnvtool invocation
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/generate_cpp.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,112 @@
+# Copyright (c) 2000-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:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+ifneq ($(FIRST_PASS),completed)
+
+FIRST_PASS=completed
+
+SOURCE_DIRECTORY=$(EXTENSION_ROOT)/../data
+
+TOOLS=\
+$(EPOCROOT)epoc32/tools/PARSER.pm \
+$(EPOCROOT)epoc32/tools/WRITER.pm \
+$(EPOCROOT)epoc32/tools/cnvtool.pl
+
+TARGET_DIRECTORY:=$(call generated,generatedcpp/charconv)
+TARGET_DIRECTORY2:=$(EPOCROOT)epoc32/tools/charconv
+
+endif
+
+
+ifeq ($(TYPE),dat)
+
+TARGET_FILES2=$(patsubst %,$(TARGET_DIRECTORY2)/%.dat,$(STEMS))
+
+$(TARGET_FILES2) : $(TARGET_DIRECTORY2)/%.dat: $(SOURCE_DIRECTORY)/%.txt $(SOURCE_DIRECTORY)/%$(CTL_EXT).ctl $(EXTRA_DEP) $(TOOLS)
+ @$(call createdir,"$(TARGET_DIRECTORY2)")
+ perl $(EPOCROOT)epoc32/tools/cnvtool.pl $(subst .txt,$(CTL_EXT).ctl,$<) $< $@ -flattenHashAndSave $(foreach PARAM,$(EXTRA_PARAMS),"$(PARAM)" )
+
+else
+
+# This is required by parellel build
+
+TARGET_FILES=$(patsubst %,$(TARGET_DIRECTORY)/g_%.cpp,$(STEMS))
+
+$(TARGET_FILES) : $(TARGET_DIRECTORY)/g_%.cpp: $(SOURCE_DIRECTORY)/%.txt $(SOURCE_DIRECTORY)/%$(CTL_EXT).ctl $(EXTRA_DEP) $(TOOLS)
+ @$(call createdir,"$(TARGET_DIRECTORY)")
+ @$(call createdir,"$(TARGET_DIRECTORY2)")
+ perl $(EPOCROOT)epoc32/tools/cnvtool.pl $(subst .txt,$(CTL_EXT).ctl,$<) $< $@ -generateSourceCode $(foreach PARAM,$(EXTRA_PARAMS),"$(PARAM)" )
+
+endif
+
+
+
+ifneq ($(TYPE),all)
+
+DO_NOTHING :
+# do nothing
+
+ # the targets below are the public ones
+
+MAKMAKE : $(TARGET_FILES2) $(TARGET_FILES)
+
+BLD : $(TARGET_FILES2) $(TARGET_FILES)
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN :
+ -$(ERASE) $(TARGET_FILES2) $(TARGET_FILES)
+
+RELEASABLES : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+endif
+
+
+
+ifeq ($(TYPE),dat)
+
+RELEASABLES :
+ $(call formatreleasables,$(TARGET_FILES2))
+
+endif
+
+
+
+ifeq ($(TYPE),all)
+
+TYPE=dat
+TARGET_FILES2=$(TARGET_FILES)
+
+include $(call include)
+
+endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/generate_snm.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2006-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:
+# Meta information for snmtool use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/generate_snm.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,77 @@
+# Copyright (c) 2000-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:
+# basic_snm.mk
+#
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+ifeq ($(PLATFORM),WINS)
+ TARGET_DIRECTORY := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/charconv
+else
+ifeq ($(PLATFORM),WINSCW)
+ TARGET_DIRECTORY := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/charconv
+else
+ TARGET_DIRECTORY := $(EPOCROOT)epoc32/data/z/resource/charconv
+endif
+endif
+
+SOURCE_DIRECTORY=$(EXTENSION_ROOT)
+
+TARGET_FILE=\
+ $(TARGET_DIRECTORY)/$(TARGET)
+
+TOOLS=\
+ $(EPOCROOT)epoc32/tools/PARSER.pm \
+ $(EPOCROOT)epoc32/tools/WRITER.pm \
+ $(EPOCROOT)epoc32/tools/snmtool.pl
+
+$(TARGET_DIRECTORY) :
+ @$(call createdir,"$@")
+
+$(TARGET_DIRECTORY)/basic.snm : $(SOURCE_DIRECTORY)/$(SOURCES) $(TOOLS)
+ perl $(EPOCROOT)epoc32/tools/snmtool.pl $(SOURCE_DIRECTORY)/$(SOURCES) $@
+
+DO_NOTHING :
+ @echo do nothing
+
+# the targets below are the public ones
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGET_DIRECTORY) $(TARGET_FILE)
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN :
+ -$(ERASE) $(TARGET_FILE)
+
+RELEASABLES :
+ @echo $(TARGET_FILE)
+
+FINAL : DO_NOTHING
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/bafl_copytestfiles.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for bafl_copytestfiles use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/bafl_copytestfiles.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,74 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Copy test files to test sortbytable functionality.
+#
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+EPOCDATADIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+EPOCDATADIR=$(EPOCROOT)epoc32/data
+endif
+
+TARGETDIR=$(EPOCDATADIR)/z/system/documents/baflsortbytabletest
+SOURCEDIR=$(EXTENSION_ROOT)/../tsrc
+
+COPYFILES :
+ $(CP) $(call slash2generic,$(SOURCEDIR)/ADDCERT.RSC $(TARGETDIR)/addcert.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/HELP.RSC $(TARGETDIR)/help.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/MSGEDITOR.RSC $(TARGETDIR)/msgeditor.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/SMLPROGRESS.RSC $(TARGETDIR)/smlprogress.rsc)
+
+$(TARGETDIR) :
+ $(call createdir,"$@")
+
+DO_NOTHING :
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+BLD : $(TARGETDIR) COPYFILES
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(TARGETDIR)/addcert.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGETDIR)/help.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGETDIR)/msgeditor.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGETDIR)/smlprogress.rsc)
+
+RELEASABLES :
+ @echo $(TARGETDIR)/addcert.rsc
+ @echo $(TARGETDIR)/help.rsc
+ @echo $(TARGETDIR)/msgeditor.rsc
+ @echo $(TARGETDIR)/smlprogress.rsc
+
+MAKMAKE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/bafl_resource_files.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for t_copytestfiles use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/bafl_resource_files.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,205 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Copy test files to test sortbytable functionality.
+#
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+TARGET_DIRECTORY=$(EPOCROOT)epoc32/release/$(PLATFORM)/$(CFG)/z/system/data
+else
+TARGET_DIRECTORY=$(EPOCROOT)epoc32/data/z/system/data
+endif
+
+SOURCEDIR=$(EXTENSION_ROOT)/../tsrc
+
+$(TARGET_DIRECTORY) :
+ $(call createdir,"$@")
+
+TARGET_FILES=\
+ $(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc $(EPOCROOT)epoc32\include\T_COMPRESSED_UNICODE_1.RSG \
+ $(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc $(EPOCROOT)epoc32\include\T_COMPRESSED_UNICODE_2.RSG \
+ $(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc \
+ $(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc \
+ $(TARGET_DIRECTORY)/t_notrscfile.rsc \
+ $(TARGET_DIRECTORY)/rscheader.bin \
+ $(TARGET_DIRECTORY)/newrscformat.rsc \
+
+$(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc : $(SOURCEDIR)/T_COMPRESSED_UNICODE_1.RPP
+ @RCOMP.EXE -s$? -o$@ -h$(EPOCROOT)epoc32/include/T_COMPRESSED_UNICODE_1.RSG -u -{0x000eb205,*}
+$(EPOCROOT)epoc32/include/T_COMPRESSED_UNICODE_1.RSG : $(SOURCEDIR)/T_COMPRESSED_UNICODE_1.RPP
+ @RCOMP.EXE -s$? -o$(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc -h$@ -u -{0x000eb205,*}
+
+$(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc : $(SOURCEDIR)/T_COMPRESSED_UNICODE_2.RPP
+ @RCOMP.EXE -s$? -o$@ -h$(EPOCROOT)epoc32/include/T_COMPRESSED_UNICODE_2.RSG -u
+$(EPOCROOT)epoc32/include/T_COMPRESSED_UNICODE_2.RSG : $(SOURCEDIR)/T_COMPRESSED_UNICODE_2.RPP
+ @RCOMP.EXE -s$? -o$(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc -h$@ -u
+
+$(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc : $(SOURCEDIR)/T_GENERATE_DICTIONARY_COMPRESSED_VERSION_OF_2.PL
+ @perl -w $(SOURCEDIR)/T_GENERATE_DICTIONARY_COMPRESSED_VERSION_OF_2.PL $(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc
+
+$(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc : $(SOURCEDIR)/T_CALYPSO_COMPILED_RESOURCE_FILE_1.RSC
+ $(CP) $(call slash2generic,$(SOURCEDIR)/T_CALYPSO_COMPILED_RESOURCE_FILE_1.RSC $(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc)
+
+$(TARGET_DIRECTORY)/t_notrscfile.rsc : $(SOURCEDIR)/T_NotRscFile.RSC
+ $(CP) $(call slash2generic,$(SOURCEDIR)/T_NotRscFile.RSC $(TARGET_DIRECTORY)/t_notrscfile.rsc)
+
+$(TARGET_DIRECTORY)/rscheader.bin :
+ $(CP) $(call slash2generic,$(SOURCEDIR)/RscHeader.Bin $(TARGET_DIRECTORY)/rscheader.bin)
+
+$(TARGET_DIRECTORY)/newrscformat.rsc : $(SOURCEDIR)/RscHeader.Bin $(SOURCEDIR)/RLETest.BMP $(TARGET_DIRECTORY)/TRSC.rsc
+ @BMCONV.EXE $(SOURCEDIR)/16RAMC.MBM /c16$(SOURCEDIR)/RLETest.BMP
+ $(CP) $(call slash2generic,$(SOURCEDIR)/RscHeader.Bin)/b + $(call slash2generic,$(TARGET_DIRECTORY)/TRSC.rsc)/b + $(call slash2generic,$(SOURCEDIR)/16RAMC.MBM) /b $(call slash2generic,$(TARGET_DIRECTORY)/newrscformat.rsc)
+
+COPYFILES :
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv1.RSC $(TARGET_DIRECTORY)/trsc_inv1.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv2.RSC $(TARGET_DIRECTORY)/trsc_inv2.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv3.RSC $(TARGET_DIRECTORY)/trsc_inv3.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv4.RSC $(TARGET_DIRECTORY)/trsc_inv4.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv5.RSC $(TARGET_DIRECTORY)/trsc_inv5.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv6.RSC $(TARGET_DIRECTORY)/trsc_inv6.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv7.RSC $(TARGET_DIRECTORY)/trsc_inv7.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv8.RSC $(TARGET_DIRECTORY)/trsc_inv8.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv9.RSC $(TARGET_DIRECTORY)/trsc_inv9.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv10.RSC $(TARGET_DIRECTORY)/trsccalypso_inv10.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv11.RSC $(TARGET_DIRECTORY)/trsccalypso_inv11.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv12.RSC $(TARGET_DIRECTORY)/trsccalypso_inv12.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRscComprU_Inv13.RSC $(TARGET_DIRECTORY)/trsccompru_inv13.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRscComprU_Inv14.RSC $(TARGET_DIRECTORY)/trsccompru_inv14.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRscComprU_Inv15.RSC $(TARGET_DIRECTORY)/trsccompru_inv15.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv16.RSC $(TARGET_DIRECTORY)/trsccalypso_inv16.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv17.RSC $(TARGET_DIRECTORY)/trsccalypso_inv17.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/RscHeader.Bin)/b + $(call slash2generic,$(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc)/b $(call slash2generic,$(TARGET_DIRECTORY)/trscromcalypsocomprnewfmt.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom.spi $(TARGET_DIRECTORY)/spi_ecom.spi)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/Spi_EComRsc1.RSC $(TARGET_DIRECTORY)/spi_ecomrsc1.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/Spi_EComRsc2.RSC $(TARGET_DIRECTORY)/spi_ecomrsc2.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/Spi_EComRsc3.RSC $(TARGET_DIRECTORY)/spi_ecomrsc3.rsc)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/ECom-1-0.spi $(TARGET_DIRECTORY)/ecom-1-0.spi)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/ECom-1-0.s02 $(TARGET_DIRECTORY)/ecom-1-0.s02)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/ECom-2-0.spi $(TARGET_DIRECTORY)/ecom-2-0.spi)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/ECom-2-0.s02 $(TARGET_DIRECTORY)/ecom-2-0.s02)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom-0-0.spi $(TARGET_DIRECTORY)/spi_ecom-0-0.spi)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom-1-0.spi $(TARGET_DIRECTORY)/spi_ecom-1-0.spi)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/CECom-0-0.spi $(TARGET_DIRECTORY)/cecom-0-0.spi)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/CECom-1-0.spi $(TARGET_DIRECTORY)/cecom-1-0.spi)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom_Case-0-0.spi $(TARGET_DIRECTORY)/spi_ecom_case-0-0.spi)
+ $(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom_Case-1-0.spi $(TARGET_DIRECTORY)/spi_ecom_case-1-0.spi)
+
+
+DO_NOTHING :
+ @echo do nothing
+
+# the targets below are the public ones
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGET_DIRECTORY) $(TARGET_FILES) COPYFILES
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc $(EPOCROOT)epoc32/include/t_compressed_unicode_1.rsg)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc $(EPOCROOT)epoc32/include/t_compressed_unicode_2.rsg)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_notrscfile.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/rscheader.bin)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/newrscformat.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv1.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv2.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv3.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv4.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv5.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv6.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv7.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv8.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv9.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv10.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv11.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv12.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccompru_inv13.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccompru_inv14.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccompru_inv15.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv16.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv17.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trscromcalypsocomprnewfmt.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom.spi)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecomrsc1.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecomrsc2.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecomrsc3.rsc)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/ecom-1-0.spi)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/ecom-1-0.s02)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/ecom-2-0.spi)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/ecom-2-0.s02)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom-0-0.spi)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom-1-0.spi)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/cecom-0-0.spi)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/cecom-1-0.spi)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom_case-0-0.spi)
+ -$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom_case-1-0.spi)
+
+RELEASABLES :
+ @echo $(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc $(EPOCROOT)epoc32/include/t_compressed_unicode_1.rsg
+ @echo $(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc $(EPOCROOT)epoc32/include/t_compressed_unicode_2.rsg
+ @echo $(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc
+ @echo $(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc
+ @echo $(TARGET_DIRECTORY)/t_notrscfile.rsc
+ @echo $(TARGET_DIRECTORY)/rscheader.bin
+ @echo $(TARGET_DIRECTORY)/newrscformat.rsc
+ @echo $(TARGET_DIRECTORY)/trsc_inv1.rsc
+ @echo $(TARGET_DIRECTORY)/trsc_inv2.rsc
+ @echo $(TARGET_DIRECTORY)/trsc_inv3.rsc
+ @echo $(TARGET_DIRECTORY)/trsc_inv4.rsc
+ @echo $(TARGET_DIRECTORY)/trsc_inv5.rsc
+ @echo $(TARGET_DIRECTORY)/trsc_inv6.rsc
+ @echo $(TARGET_DIRECTORY)/trsc_inv7.rsc
+ @echo $(TARGET_DIRECTORY)/trsc_inv8.rsc
+ @echo $(TARGET_DIRECTORY)/trsc_inv9.rsc
+ @echo $(TARGET_DIRECTORY)/trsccalypso_inv10.rsc
+ @echo $(TARGET_DIRECTORY)/trsccalypso_inv11.rsc
+ @echo $(TARGET_DIRECTORY)/trsccalypso_inv12.rsc
+ @echo $(TARGET_DIRECTORY)/trsccompru_inv13.rsc
+ @echo $(TARGET_DIRECTORY)/trsccompru_inv14.rsc
+ @echo $(TARGET_DIRECTORY)/trsccompru_inv15.rsc
+ @echo $(TARGET_DIRECTORY)/trsccalypso_inv16.rsc
+ @echo $(TARGET_DIRECTORY)/trsccalypso_inv17.rsc
+ @echo $(TARGET_DIRECTORY)/trscromcalypsocomprnewfmt.rsc
+ @echo $(TARGET_DIRECTORY)/spi_ecom.spi
+ @echo $(TARGET_DIRECTORY)/spi_ecomrsc1.rsc
+ @echo $(TARGET_DIRECTORY)/spi_ecomrsc2.rsc
+ @echo $(TARGET_DIRECTORY)/spi_ecomrsc3.rsc
+ @echo $(TARGET_DIRECTORY)/ecom-1-0.spi
+ @echo $(TARGET_DIRECTORY)/ecom-1-0.s02
+ @echo $(TARGET_DIRECTORY)/ecom-2-0.spi
+ @echo $(TARGET_DIRECTORY)/ecom-2-0.s02
+ @echo $(TARGET_DIRECTORY)/spi_ecom-0-0.spi
+ @echo $(TARGET_DIRECTORY)/spi_ecom-1-0.spi
+ @echo $(TARGET_DIRECTORY)/cecom-0-0.spi
+ @echo $(TARGET_DIRECTORY)/cecom-1-0.spi
+ @echo $(TARGET_DIRECTORY)/spi_ecom_case-0-0.spi
+ @echo $(TARGET_DIRECTORY)/spi_ecom_case-1-0.spi
+
+FINAL : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/centrep_copydatfile.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for centrep_copydatfile use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/centrep_copydatfile.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,70 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ EPOCDATADIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+ EPOCDATADIR=$(EPOCROOT)epoc32/data
+endif
+
+TARGETDIR = $(EPOCDATADIR)/z/resource
+SOURCEDIR = $(EXTENSION_ROOT)/../data/certstore
+
+FILE = swicertstore.dat
+
+$(TARGETDIR) :
+ $(call createdir, "$@")
+
+COPYFILES : $(FILE)
+
+ $(call forcecopy,$(SOURCEDIR)/$^,$(TARGETDIR)/$^)
+
+$(FILE) :
+
+DO_NOTHING:
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+BLD : $(TARGETDIR) COPYFILES
+
+CLEAN :
+ $(call forceremove,$(TARGETDIR)/swicertstore.dat)
+
+RELEASABLES :
+ @echo $(TARGETDIR)/swicertstore.dat
+
+MAKMAKE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+ROMFILE : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/centrep_copyincentrepsrv.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for centrep_copyincentrepsrv use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/centrep_copyincentrepsrv.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,74 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+CENTREPSRVSRCDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+CENTREPSRVTGTDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/sys/bin
+
+FILE = centralrepositorysrv.exe
+
+$(CENTREPSRVTGTDIR) :
+ $(call createdir, "$(CENTREPSRVTGTDIR)")
+
+COPYFILE : $(FILE)
+ $(call forcecopy,$(CENTREPSRVSRCDIR)/$^,$(CENTREPSRVTGTDIR))
+
+$(FILE):
+endif
+
+DO_NOTHING :
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+BLD : $(CENTREPSRVTGTDIR) $(CENTREPSRVSRCDIR) COPYFILE
+
+CLEAN : $(FILE)
+ $(call forceremove,$(CENTREPSRVTGTDIR)/$^)
+
+RELEASABLES : $(FILE)
+ @echo $(CENTREPSRVTGTDIR)/$^
+
+else
+BLD : DO_NOTHING
+
+CLEAN : DO_NOTHING
+
+RELEASABLES : DO_NOTHING
+endif
+
+MAKMAKE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+ROMFILE : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/centrep_copypctestfile.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2008-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:
+# Meta information for centrep_copypctestfile use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/centrep_copypctestfile.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,203 @@
+# Copyright (c) 2008-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:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ EPOCDATADIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+ EPOCDATADIR = $(EPOCROOT)epoc32/data
+endif
+
+SECURETARGETDIR = $(EPOCDATADIR)/z/private/10202BE9
+
+PCCENREPSOURCE = $(EXTENSION_ROOT)/../test
+PCCENREPDATADIR = $(EPOCROOT)epoc32/winscw/c/private/00000000
+PCCENREPTESTDIR = $(EPOCROOT)epoc32/winscw/c
+PCCENREPPCTESTDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+
+$(SECURETARGETDIR) :
+ $(call createdir, "$@")
+
+$(PCCENREPDATADIR) :
+ $(call createdir, "$@")
+
+COPYFILES :
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(SECURETARGETDIR)/000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(SECURETARGETDIR)/00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(SECURETARGETDIR)/000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(SECURETARGETDIR)/88888880.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(SECURETARGETDIR)/88888881.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(SECURETARGETDIR)/00022222.txt)
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPDATADIR)/000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPDATADIR)/00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(PCCENREPDATADIR)/000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(PCCENREPDATADIR)/88888880.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(PCCENREPDATADIR)/88888881.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/winscwcre.cre,$(PCCENREPDATADIR)/ref_winscwcre.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/winscwtxt.cre,$(PCCENREPDATADIR)/ref_winscwtxt.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPDATADIR)/copy000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPDATADIR)/copy00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(PCCENREPDATADIR)/copy000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPDATADIR)/00022222.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.cre,$(PCCENREPDATADIR)/copy00022222.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPTESTDIR)/000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPTESTDIR)/00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPTESTDIR)/copy00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPTESTDIR)/00022222.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.cre,$(PCCENREPTESTDIR)/copy00022222.cre)
+endif
+
+else
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPPCTESTDIR)/000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPPCTESTDIR)/00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPPCTESTDIR)/copy000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPPCTESTDIR)/copy00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(PCCENREPPCTESTDIR)/000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(PCCENREPPCTESTDIR)/copy000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/winscwcre.cre,$(PCCENREPPCTESTDIR)/ref_winscwcre.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/winscwtxt.cre,$(PCCENREPPCTESTDIR)/ref_winscwtxt.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(PCCENREPPCTESTDIR)/88888880.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(PCCENREPPCTESTDIR)/88888881.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPPCTESTDIR)/00022222.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.cre,$(PCCENREPPCTESTDIR)/copy00022222.cre)
+
+endif
+
+DO_NOTHING:
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+BLD : $(SECURETARGETDIR) $(PCCENREPDATADIR) $(PCCENREPTESTDIR) $(PCCENREPSOURCE) $(PCCENREPPCTESTDIR) COPYFILES
+
+CLEAN :
+
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+
+ $(call forceremove,$(SECURETARGETDIR)/000001ff.txt)
+ $(call forceremove,$(SECURETARGETDIR)/00001fff.cre)
+ $(call forceremove,$(SECURETARGETDIR)/000002ff.cre)
+ $(call forceremove,$(SECURETARGETDIR)/88888880.txt)
+ $(call forceremove,$(SECURETARGETDIR)/88888881.cre)
+ $(call forceremove,$(SECURETARGETDIR)/00022222.txt)
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ $(call forceremove,$(PCCENREPDATADIR)/000001ff.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/00001fff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/000002ff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/88888880.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/88888881.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/ref_winscwcre.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/ref_winscwtxt.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/copy000001ff.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/copy00001fff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/copy000002ff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/00022222.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/copy00022222.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/000001ff.txt)
+ $(call forceremove,$(PCCENREPTESTDIR)/00001fff.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/copy00001fff.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/00022222.txt)
+ $(call forceremove,$(PCCENREPTESTDIR)/copy00022222.cre)
+
+endif
+
+else
+ $(call forceremove,$(PCCENREPPCTESTDIR)/000001ff.txt)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/00001fff.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/copy000001ff.txt)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/copy00001fff.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/000002ff.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/copy000002ff.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/ref_winscwcre.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/ref_winscwtxt.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/88888880.txt)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/88888881.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/00022222.txt)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/copy00022222.cre)
+
+endif
+
+RELEASABLES :
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+
+ @echo $(SECURETARGETDIR)/000001ff.txt
+ @echo $(SECURETARGETDIR)/00001fff.cre
+ @echo $(SECURETARGETDIR)/000002ff.cre
+ @echo $(SECURETARGETDIR)/88888880.txt
+ @echo $(SECURETARGETDIR)/88888881.cre
+ @echo $(SECURETARGETDIR)/00022222.txt
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ @echo $(PCCENREPDATADIR)/000001ff.txt
+ @echo $(PCCENREPDATADIR)/00001fff.cre
+ @echo $(PCCENREPDATADIR)/000002ff.cre
+ @echo $(PCCENREPDATADIR)/88888880.txt
+ @echo $(PCCENREPDATADIR)/88888881.cre
+ @echo $(PCCENREPDATADIR)/ref_winscwcre.cre
+ @echo $(PCCENREPDATADIR)/ref_winscwtxt.cre
+ @echo $(PCCENREPDATADIR)/copy000001ff.txt
+ @echo $(PCCENREPDATADIR)/copy00001fff.cre
+ @echo $(PCCENREPDATADIR)/copy000002ff.cre
+ @echo $(PCCENREPDATADIR)/00022222.txt
+ @echo $(PCCENREPDATADIR)/copy00022222.cre
+ @echo $(PCCENREPTESTDIR)/000001ff.txt
+ @echo $(PCCENREPTESTDIR)/00001fff.cre
+ @echo $(PCCENREPTESTDIR)/copy00001fff.cre
+ @echo $(PCCENREPTESTDIR)/00022222.txt
+ @echo $(PCCENREPTESTDIR)/copy00022222.cre
+
+endif
+
+else
+ @echo $(PCCENREPPCTESTDIR)/000001ff.txt
+ @echo $(PCCENREPPCTESTDIR)/00001fff.cre
+ @echo $(PCCENREPPCTESTDIR)/copy000001ff.txt
+ @echo $(PCCENREPPCTESTDIR)/copy00001fff.cre
+ @echo $(PCCENREPPCTESTDIR)/000002ff.cre
+ @echo $(PCCENREPPCTESTDIR)/copy000002ff.cre
+ @echo $(PCCENREPPCTESTDIR)/ref_winscwcre.cre
+ @echo $(PCCENREPPCTESTDIR)/ref_winscwtxt.cre
+ @echo $(PCCENREPPCTESTDIR)/88888880.txt
+ @echo $(PCCENREPPCTESTDIR)/88888881.cre
+ @echo $(PCCENREPPCTESTDIR)/00022222.txt
+ @echo $(PCCENREPPCTESTDIR)/copy00022222.cre
+endif
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+ROMFILE : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/centrep_copypctestfilev2.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2008-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:
+# centrep_copypctestfile.meta
+# Meta information for centrep_copypctestfile use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/centrep_copypctestfilev2.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,238 @@
+# Copyright (c) 2008-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:
+# centrep_copypctestfile.mk
+#
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ EPOCDATADIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+ EPOCDATADIR = $(EPOCROOT)epoc32/data
+endif
+
+SECURETARGETDIR = $(EPOCDATADIR)/z/private/10202BE9
+
+PCCENREPSOURCE = $(EXTENSION_ROOT)/../test
+PCCENREPDATADIR = $(EPOCROOT)epoc32/winscw/c/private/00000000
+PCCENREPTESTDIR = $(EPOCROOT)epoc32/winscw/c
+PCCENREPPCTESTDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+
+$(SECURETARGETDIR) :
+ $(call createdir, "$@")
+
+$(PCCENREPDATADIR) :
+ $(call createdir, "$@")
+
+COPYFILES :
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(SECURETARGETDIR)/000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(SECURETARGETDIR)/00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(SECURETARGETDIR)/000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(SECURETARGETDIR)/88888880.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(SECURETARGETDIR)/88888881.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(SECURETARGETDIR)/00004fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(SECURETARGETDIR)/00022222.txt)
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPDATADIR)/000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPDATADIR)/00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(PCCENREPDATADIR)/000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(PCCENREPDATADIR)/88888880.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(PCCENREPDATADIR)/88888881.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/winscwcre.crev2,$(PCCENREPDATADIR)/ref_winscwcre.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/winscwtxt.crev2,$(PCCENREPDATADIR)/ref_winscwtxt.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPDATADIR)/copy000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPDATADIR)/copy00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(PCCENREPDATADIR)/copy000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPDATADIR)/00004fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPDATADIR)/copy00004fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPDATADIR)/00022222.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.crev2,$(PCCENREPDATADIR)/copy00022222.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPTESTDIR)/000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPTESTDIR)/00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPTESTDIR)/copy00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPTESTDIR)/00004fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPTESTDIR)/copy00004fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPTESTDIR)/00022222.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.crev2,$(PCCENREPTESTDIR)/copy00022222.cre)
+# Shared files between the t_cenreppc (WINSCW) and testsymcenrep (TOOLS2) tests.
+ $(call forcecopy,$(PCCENREPSOURCE)/common_crc.txt,$(PCCENREPTESTDIR)/common_crc.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/common_ref_00022222.cre,$(PCCENREPDATADIR)/common_ref_00022222.cre)
+endif
+
+# TOOLS2
+else
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPPCTESTDIR)/000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPPCTESTDIR)/00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPPCTESTDIR)/00004fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPPCTESTDIR)/copy000001ff.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPPCTESTDIR)/copy00001fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPPCTESTDIR)/copy00004fff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(PCCENREPPCTESTDIR)/000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(PCCENREPPCTESTDIR)/copy000002ff.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/winscwcre.crev2,$(PCCENREPPCTESTDIR)/ref_winscwcre.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/winscwtxt.crev2,$(PCCENREPPCTESTDIR)/ref_winscwtxt.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(PCCENREPPCTESTDIR)/88888880.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(PCCENREPPCTESTDIR)/88888881.cre)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPPCTESTDIR)/00022222.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/00022222.crev2,$(PCCENREPPCTESTDIR)/copy00022222.cre)
+# Shared files between the t_cenreppc (WINSCW) and testsymcenrep (TOOLS2) tests.
+ $(call forcecopy,$(PCCENREPSOURCE)/common_crc.txt,$(PCCENREPTESTDIR)/common_crc.txt)
+ $(call forcecopy,$(PCCENREPSOURCE)/common_ref_00022222.cre,$(PCCENREPDATADIR)/common_ref_00022222.cre)
+endif
+
+DO_NOTHING:
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+BLD : $(SECURETARGETDIR) $(PCCENREPDATADIR) $(PCCENREPTESTDIR) $(PCCENREPSOURCE) $(PCCENREPPCTESTDIR) COPYFILES
+
+CLEAN :
+
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+ $(call forceremove,$(SECURETARGETDIR)/000001ff.txt)
+ $(call forceremove,$(SECURETARGETDIR)/00001fff.cre)
+ $(call forceremove,$(SECURETARGETDIR)/000002ff.cre)
+ $(call forceremove,$(SECURETARGETDIR)/88888880.txt)
+ $(call forceremove,$(SECURETARGETDIR)/88888881.cre)
+ $(call forceremove,$(SECURETARGETDIR)/00004fff.cre)
+ $(call forceremove,$(SECURETARGETDIR)/00022222.txt)
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ $(call forceremove,$(PCCENREPDATADIR)/000001ff.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/00001fff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/000002ff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/88888880.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/88888881.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/ref_winscwcre.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/ref_winscwtxt.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/copy000001ff.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/copy00001fff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/copy000002ff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/00004fff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/copy00004fff.cre)
+ $(call forceremove,$(PCCENREPDATADIR)/00022222.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/copy00022222.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/000001ff.txt)
+ $(call forceremove,$(PCCENREPTESTDIR)/00001fff.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/copy00001fff.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/00004fff.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/copy00004fff.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/00022222.txt)
+ $(call forceremove,$(PCCENREPTESTDIR)/copy00022222.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/common_crc.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/common_ref_00022222.cre)
+endif
+
+
+# TOOLS2
+else
+ $(call forceremove,$(PCCENREPPCTESTDIR)/000001ff.txt)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/00001fff.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/00004fff.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/copy000001ff.txt)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/copy00001fff.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/000002ff.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/copy000002ff.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/ref_winscwcre.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/ref_winscwtxt.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/88888880.txt)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/88888881.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/00022222.txt)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/copy00022222.cre)
+ $(call forceremove,$(PCCENREPPCTESTDIR)/copy00004fff.cre)
+ $(call forceremove,$(PCCENREPTESTDIR)/common_crc.txt)
+ $(call forceremove,$(PCCENREPDATADIR)/common_ref_00022222.cre)
+
+endif
+
+RELEASABLES :
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+ @echo $(SECURETARGETDIR)/000001ff.txt
+ @echo $(SECURETARGETDIR)/00001fff.cre
+ @echo $(SECURETARGETDIR)/000002ff.cre
+ @echo $(SECURETARGETDIR)/88888880.txt
+ @echo $(SECURETARGETDIR)/88888881.cre
+ @echo $(SECURETARGETDIR)/00004fff.cre
+ @echo $(SECURETARGETDIR)/00022222.txt
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ @echo $(PCCENREPDATADIR)/000001ff.txt
+ @echo $(PCCENREPDATADIR)/00001fff.cre
+ @echo $(PCCENREPDATADIR)/000002ff.cre
+ @echo $(PCCENREPDATADIR)/88888880.txt
+ @echo $(PCCENREPDATADIR)/88888881.cre
+ @echo $(PCCENREPDATADIR)/ref_winscwcre.cre
+ @echo $(PCCENREPDATADIR)/ref_winscwtxt.cre
+ @echo $(PCCENREPDATADIR)/copy000001ff.txt
+ @echo $(PCCENREPDATADIR)/copy00001fff.cre
+ @echo $(PCCENREPDATADIR)/copy000002ff.cre
+ @echo $(PCCENREPDATADIR)/00004fff.cre
+ @echo $(PCCENREPDATADIR)/copy00004fff.cre
+ @echo $(PCCENREPDATADIR)/00022222.txt
+ @echo $(PCCENREPDATADIR)/copy00022222.cre
+ @echo $(PCCENREPTESTDIR)/000001ff.txt
+ @echo $(PCCENREPTESTDIR)/00001fff.cre
+ @echo $(PCCENREPTESTDIR)/copy00001fff.cre
+ @echo $(PCCENREPTESTDIR)/00004fff.cre
+ @echo $(PCCENREPTESTDIR)/copy00004fff.cre
+ @echo $(PCCENREPTESTDIR)/00022222.txt
+ @echo $(PCCENREPTESTDIR)/copy00022222.cre
+ @echo $(PCCENREPTESTDIR)/common_crc.txt
+ @echo $(PCCENREPDATADIR)/common_ref_00022222.cre
+endif
+
+# TOOLS2
+else
+ @echo $(PCCENREPPCTESTDIR)/000001ff.txt
+ @echo $(PCCENREPPCTESTDIR)/00001fff.cre
+ @echo $(PCCENREPPCTESTDIR)/copy000001ff.txt
+ @echo $(PCCENREPPCTESTDIR)/copy00001fff.cre
+ @echo $(PCCENREPPCTESTDIR)/000002ff.cre
+ @echo $(PCCENREPPCTESTDIR)/copy000002ff.cre
+ @echo $(PCCENREPPCTESTDIR)/ref_winscwcre.cre
+ @echo $(PCCENREPPCTESTDIR)/ref_winscwtxt.cre
+ @echo $(PCCENREPPCTESTDIR)/88888880.txt
+ @echo $(PCCENREPPCTESTDIR)/88888881.cre
+ @echo $(PCCENREPPCTESTDIR)/00022222.txt
+ @echo $(PCCENREPPCTESTDIR)/copy00022222.cre
+ @echo $(PCCENREPPCTESTDIR)/copy00004fff.cre
+ @echo $(PCCENREPTESTDIR)/common_crc.txt
+ @echo $(PCCENREPDATADIR)/common_ref_00022222.cre
+
+endif
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+ROMFILE : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/charconv_testpostbuild.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# charconv_tiso8859x_generate_cpp.meta
+# Meta information for charconv_tiso8859x_generate_cpp use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/charconv_testpostbuild.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,74 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This postbuild script is only called when a Test Build is done. It deletes the KDDI/AU versions of the shiftjis and j5 plugin RSC file, so
+# that only the Docomo versions remain. This removed ambiguity over which one will load during tests - a seperate version of the KDDI/AU
+# plugins is created for test build, with a unique UID number so they may coexist for test purposes.
+#
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+# Only remove files on emulator build - for hardware, iby file selects correct plugin.
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ TARGETDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/plugins
+
+ TARGET_FILES = \
+ $(TARGETDIR)/shiftjis_kddiau.rsc \
+ $(TARGETDIR)/j5_kddiau.rsc \
+ $(TARGETDIR)/eucjp_packed_2.rsc \
+ $(TARGETDIR)/iso2022jp_2.rsc \
+ $(TARGETDIR)/iso2022jp1_2.rsc \
+ $(TARGETDIR)/j5_kddiau_2.rsc \
+ $(TARGETDIR)/jis_2.rsc\
+ $(TARGETDIR)/shiftjis_kddiau_2.rsc
+
+ TARGET_FILES:=$(subst /,\,$(TARGET_FILES))
+endif
+
+DO_NOTHING :
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+BLD :
+ @echo Below rsc files will be deleted to remove ambiguity in testing:
+ @echo $(TARGET_FILES)
+ -$(ERASE) $(TARGET_FILES)
+else
+BLD : DO_NOTHING
+endif
+
+RELEASABLES : DO_NOTHING
+
+MAKMAKE : DO_NOTHING
+
+CLEAN : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/charconv_tiso8859x_generate_cpp.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for charconv_tiso8859x_generate_cpp use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/charconv_tiso8859x_generate_cpp.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,73 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+TARGET_DIRECTORY = $(EXTENSION_ROOT)/../test/rtest/tsrc/main
+
+TEXT_FILE_DIRECTORY = $(EXTENSION_ROOT)/../data
+
+TARGET_CPP_FILES = $(TARGET_DIRECTORY)/g_tiso8859x.cpp
+
+TOOLS = $(EXTENSION_ROOT)/../test/rtest/tsrc/main/tiso8859x_generate_cpp.pl
+
+$(TARGET_DIRECTORY) :
+
+$(TARGET_DIRECTORY)/g_tiso8859x.cpp : $(TOOLS) \
+ $(TEXT_FILE_DIRECTORY)/iso88592.txt \
+ $(TEXT_FILE_DIRECTORY)/iso88593.txt \
+ $(TEXT_FILE_DIRECTORY)/iso88594.txt \
+ $(TEXT_FILE_DIRECTORY)/iso88595.txt \
+ $(TEXT_FILE_DIRECTORY)/iso88596.txt \
+ $(TEXT_FILE_DIRECTORY)/iso88597.txt \
+ $(TEXT_FILE_DIRECTORY)/iso88598.txt \
+ $(TEXT_FILE_DIRECTORY)/iso88599.txt \
+ $(TEXT_FILE_DIRECTORY)/iso885910.txt \
+ $(TEXT_FILE_DIRECTORY)/iso885913.txt \
+ $(TEXT_FILE_DIRECTORY)/iso885914.txt \
+ $(TEXT_FILE_DIRECTORY)/iso885915.txt
+ @perl -w $(call slash2generic, $(EXTENSION_ROOT)/../test/rtest/tsrc/main/tiso8859x_generate_cpp.pl '$(EXTENSION_ROOT)')
+
+DO_NOTHING :
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : $(TARGET_DIRECTORY) $(TARGET_CPP_FILES)
+
+BLD : $(TARGET_DIRECTORY) $(TARGET_CPP_FILES)
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN :
+ -$(ERASE) $(TARGET_CPP_FILES)
+
+RELEASABLES :
+ @echo $(TARGET_CPP_FILES)
+
+FINAL : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/charconv_tsnmdata.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for charconv_tsnmdata use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/charconv_tsnmdata.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,68 @@
+# Copyright (c) 1997-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:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ TARGET_DIRECTORY = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/charconv
+else
+ TARGET_DIRECTORY = $(EPOCROOT)epoc32/data/z/resource/charconv
+endif
+
+TARGET_FILES = $(TARGET_DIRECTORY)/tsnm.snm
+
+SOURCE_DIRECTORY = $(EXTENSION_ROOT)/../test/data/main
+
+TOOLS = \
+ $(EPOCROOT)epoc32/tools/PARSER.PM \
+ $(EPOCROOT)epoc32/tools/WRITER.PM \
+ $(EPOCROOT)epoc32/tools/snmtool.pl
+
+$(TARGET_DIRECTORY) :
+ $(call createdir,"$@")
+
+$(TARGET_FILES) : $(SOURCE_DIRECTORY)/tsnm.txt $(TOOLS)
+ perl $(EPOCROOT)epoc32/tools/snmtool.pl $(SOURCE_DIRECTORY)/tsnm.txt $@
+DO_NOTHING :
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGET_DIRECTORY) $(TARGET_FILES)
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN :
+ -$(ERASE) $(TARGET_FILES)
+
+RELEASABLES :
+ @echo $(TARGET_FILES)
+
+FINAL : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/ecom3_buildsis.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2008-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:
+# Meta information for the ecom3_buildsis extension template
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/ecom3_buildsis.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,60 @@
+# Copyright (c) 2008-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:
+# Params:
+# SOURCES - list of .pkg files
+# TARGET - not used
+# OPTION OUTDIR - mandatory, it is tef_ecomswi
+# OPTION INDIR - mandatory, path relative to bld.inf containing the
+# .pkg files.
+# OPTION CERTPEM - mandatory
+# OPTION CERTKEY - mandatory
+# OPTION STUBLIST - mandatory, identify stubs in $(SOURCES)
+# OPTION SCRIPTNAME - mandatory, perl script to build SIS. Must be in
+# same dir as .pkg files.
+#
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+CERTPEM := $(subst /,$(/),$(CERTPEM))
+CERTKEY := $(subst /,$(/),$(CERTKEY))
+OUTDIR := $(subst /,$(/),$(OUTDIR))
+INDIR := $(subst /,$(/),$(INDIR))
+BASEDIR := $(EXTENSION_ROOT)/$(INDIR)
+
+TARGETS := $(shell perl $(BASEDIR)/$(SCRIPTNAME) -platform $(PLATFORM_PATH) -cfg $(CFG_PATH) -outdir $(OUTDIR) -maketrgt RELEASABLES -sources "$(SOURCES)" -stublist "$(STUBLIST)")
+EXTRA := $(shell perl $(BASEDIR)/$(SCRIPTNAME) -platform $(PLATFORM_PATH) -cfg $(CFG_PATH) -outdir $(OUTDIR) -maketrgt EXTRATARGET -sources "$(SOURCES)" -stublist "$(STUBLIST)")
+
+
+$(TARGETS) :
+ @perl $(call slash2generic, $(BASEDIR)/$(SCRIPTNAME)) -basedir $(BASEDIR) -platform $(PLATFORM_PATH) -cfg $(CFG_PATH) -certpem $(CERTPEM) -certkey $(CERTKEY) -maketrgt FINAL $@
+
+#
+# The targets invoked by abld...
+#
+FINAL : $(TARGETS)
+
+BLD MAKMAKE SAVESPACE FREEZE LIB CLEANLIB RESOURCE :
+ @echo do nothing
+
+CLEAN :
+ -$(ERASE) $(TARGETS) $(EXTRA)
+
+RELEASABLES :
+ @echo $(TARGETS) $(EXTRA)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/ecom3_postbuild.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for ecom3_postbuild use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/ecom3_postbuild.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,353 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z
+RAMONLYTARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/ramonly
+SOURCEDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+SOURCEDIR2=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/plugins
+else
+TARGETDIR=$(EPOCROOT)epoc32/data/z
+RAMONLYTARGETDIR=$(EPOCROOT)epoc32/data/z/ramonly
+SOURCEDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+SOURCEDIR2=$(EPOCROOT)epoc32/data/z/resource/plugins
+endif
+
+DO_NOTHING:
+ @echo do_nothing
+
+$(RAMONLYTARGETDIR) :
+ $(call createdir,"$@")
+
+COPYFILES :
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/HeapTestImpl.dll $(TARGETDIR)/heaptestimpl.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/HeapTestImpl.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample5.dll $(RAMONLYTARGETDIR)/ecomexample5.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample5.dll $(RAMONLYTARGETDIR)/invalidsidplugin.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample5.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample12.dll $(RAMONLYTARGETDIR)/ecomexample12.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample12.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample12Upgraded.dll $(RAMONLYTARGETDIR)/ecomexample12Upgraded.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample12Upgraded.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample12Downgraded.dll $(RAMONLYTARGETDIR)/ecomexample12Downgraded.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample12Downgraded.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample14.dll $(RAMONLYTARGETDIR)/ecomexample14.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample14.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample14Upgraded.dll $(RAMONLYTARGETDIR)/ecomexample14Upgraded.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample14Upgraded.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample15.dll $(RAMONLYTARGETDIR)/ecomexample15.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample15.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExampleBadData.dll $(RAMONLYTARGETDIR)/ecomexamplebaddata.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExampleBadData.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExampleBadData1.dll $(RAMONLYTARGETDIR)/ecomexamplebaddata1.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExampleBadData1.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExampleBadData2.dll $(RAMONLYTARGETDIR)/ecomexamplebaddata2.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExampleBadData2.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample3.dll $(RAMONLYTARGETDIR)/ecomexample3.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample2.dll $(RAMONLYTARGETDIR)/ecomexample2.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample.dll $(RAMONLYTARGETDIR)/ecomexample.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComNullExample.dll $(RAMONLYTARGETDIR)/ecomnullexample.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComRomOnlyExampleOnC.dll $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComRomOnlyExampleOnC.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComRomRslvrExampleOnC.dll $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComRomRslvrExampleOnC.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComRomRslvrExampleOnZ.dll $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/T_PlatSecResolverC.dll $(RAMONLYTARGETDIR)/t_platsecresolverc.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/T_PlatSecResolverC.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/T_PlatSecEcom4.dll $(RAMONLYTARGETDIR)/t_platsececom4.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/T_PlatSecEcom4.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample1.dll $(RAMONLYTARGETDIR)/ecomupgradeexample1.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample1.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample2.dll $(RAMONLYTARGETDIR)/ecomupgradeexample2.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample3.dll $(RAMONLYTARGETDIR)/ecomupgradeexample3.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample3.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample1.dll $(RAMONLYTARGETDIR)/ecomupgraderoexample1.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample1.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample2.dll $(RAMONLYTARGETDIR)/ecomupgraderoexample2.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample3.dll $(RAMONLYTARGETDIR)/ecomupgraderoexample3.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample3.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/DefectPlugin.dll $(RAMONLYTARGETDIR)/defectplugin.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/DefectPlugin.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample7.dll $(RAMONLYTARGETDIR)/ecomexample7.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample7.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample8.dll $(RAMONLYTARGETDIR)/ecomexample8.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample8.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComCR629Example1.dll $(RAMONLYTARGETDIR)/ecomcr629example1.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComCR629Example1.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComCR629Example2.dll $(RAMONLYTARGETDIR)/ecomcr629example2.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComCR629Example2.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/LanguagePlugin.dll $(RAMONLYTARGETDIR)/languageplugin.dll)
+ -$(ERASE) $(call slash2generic $(SOURCEDIR)/LanguagePlugin.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComHashExample.dll $(RAMONLYTARGETDIR)/ecomhashexample.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComHashExample.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/EComSwiExample.dll $(RAMONLYTARGETDIR)/ecomswiexample.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComSwiExample.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/exampleNine.dll $(RAMONLYTARGETDIR)/examplenine.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/exampleNine.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR)/dummycustomresolver1.dll $(RAMONLYTARGETDIR)/dummycustomresolver1.dll)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/dummycustomresolver1.dll)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/HeapTestImpl.rsc $(TARGETDIR)/heaptestimpl.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/HeapTestImpl.rsc $(RAMONLYTARGETDIR)/invalidsidplugin.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/HeapTestImpl.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample5.RSC $(RAMONLYTARGETDIR)/ecomexample5.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample5.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample12.RSC $(RAMONLYTARGETDIR)/ecomexample12.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample12.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample12Upgraded.RSC $(RAMONLYTARGETDIR)/ecomexample12Upgraded.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample12Upgraded.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample12Downgraded.RSC $(RAMONLYTARGETDIR)/ecomexample12Downgraded.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample12Downgraded.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample14.RSC $(RAMONLYTARGETDIR)/ecomexample14.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample14.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample14Upgraded.RSC $(RAMONLYTARGETDIR)/ecomexample14Upgraded.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample14Upgraded.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample15.RSC $(RAMONLYTARGETDIR)/ecomexample15.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample15.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData.RSC $(RAMONLYTARGETDIR)/ecomexamplebaddata.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData1.RSC $(RAMONLYTARGETDIR)/ecomexamplebaddata1.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData1.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData2.RSC $(RAMONLYTARGETDIR)/ecomexamplebaddata2.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData2.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample3.RSC $(RAMONLYTARGETDIR)/ecomexample3.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample2.RSC $(RAMONLYTARGETDIR)/ecomexample2.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample.RSC $(RAMONLYTARGETDIR)/ecomexample.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComRomOnlyExampleOnC.RSC $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComRomOnlyExampleOnC.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComRomRslvrExampleOnC.RSC $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComRomRslvrExampleOnC.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComRomRslvrExampleOnZ.RSC $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/T_PlatSecResolverC.RSC $(RAMONLYTARGETDIR)/t_platsecresolverc.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/T_PlatSecResolverC.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/T_PlatSecEcom4.RSC $(RAMONLYTARGETDIR)/t_platsececom4.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/T_PlatSecEcom4.RSC)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomNullExample.RSC $(RAMONLYTARGETDIR)/ecomnullexample.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample1.rsc $(RAMONLYTARGETDIR)/ecomupgradeexample1.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample1.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample2.rsc $(RAMONLYTARGETDIR)/ecomupgradeexample2.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample3.rsc $(RAMONLYTARGETDIR)/ecomupgradeexample3.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample3.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample1.rsc $(RAMONLYTARGETDIR)/ecomupgraderoexample1.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample1.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample2.rsc $(RAMONLYTARGETDIR)/ecomupgraderoexample2.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample3.rsc $(RAMONLYTARGETDIR)/ecomupgraderoexample3.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample3.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/DefectPlugin.rsc $(RAMONLYTARGETDIR)/defectplugin.rsc)
+ -$(ERASE) $(SOURCEDIR2)/DefectPlugin.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample7.rsc $(RAMONLYTARGETDIR)/ecomexample7.rsc)
+ -$(ERASE) $(SOURCEDIR2)/EComExample7.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample8.rsc $(RAMONLYTARGETDIR)/ecomexample8.rsc)
+ -$(ERASE) $(SOURCEDIR2)/EComExample8.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComCR629Example1.rsc $(RAMONLYTARGETDIR)/ecomcr629example1.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComCR629Example1.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComCR629Example2.rsc $(RAMONLYTARGETDIR)/ecomcr629example2.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComCR629Example2.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.rsc $(RAMONLYTARGETDIR)/languageplugin.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r01 $(RAMONLYTARGETDIR)/languageplugin.r01)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r01)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r02 $(RAMONLYTARGETDIR)/languageplugin.r02)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r02)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r03 $(RAMONLYTARGETDIR)/languageplugin.r03)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r03)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComHashExample.rsc $(RAMONLYTARGETDIR)/ecomhashexample.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComHashExample.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComSwiExample.rsc $(RAMONLYTARGETDIR)/ecomswiexample.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComSwiExample.rsc)
+ $(CP) /B $(call slash2generic, $(SOURCEDIR2)/dummycustomresolver1.rsc $(RAMONLYTARGETDIR)/dummycustomresolver1.rsc)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR2)/dummycustomresolver1.rsc)
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(RAMONLYTARGETDIR) COPYFILES
+
+CLEAN :
+ -$(ERASE) $(call slash2generic, $(TARGETDIR)/heaptestimpl.dll)
+ -$(ERASE) $(call slash2generic, $(TARGETDIR)/heaptestimpl.rsc )
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample5.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12Upgraded.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12Downgraded.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample14.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample14Upgraded.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample15.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata1.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata2.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample3.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample2.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample.rsc )
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample5.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12Upgraded.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12Downgraded.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample14.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample14Upgraded.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample15.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata1.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata2.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample3.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample2.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/invalidsidplugin.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/invalidsidplugin.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/t_platsecresolverc.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/t_platsecresolverc.rsc )
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/t_platsececom4.dll )
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/t_platsececom4.rsc)
+
+
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomnullexample.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomnullexample.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample1.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample1.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample2.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample2.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample3.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample3.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample1.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample1.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample2.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample2.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample3.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample3.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/defectplugin.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/defectplugin.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample7.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample7.rsc )
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample8.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample8.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomcr629example1.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomcr629example1.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomcr629example2.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomcr629example2.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.r01)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.r02)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.r03)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomhashexample.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomhashexample.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomswiexample.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomswiexample.rsc)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/examplenine.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/dummycustomresolver1.dll)
+ -$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/dummycustomresolver1.rsc)
+
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES :
+ @echo $(TARGETDIR)/heaptestimpl.dll
+ @echo $(TARGETDIR)/heaptestimpl.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample5.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample12.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample12Upgraded.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample12Downgraded.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample14.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample14Upgraded.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample15.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexamplebaddata.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexamplebaddata1.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexamplebaddata2.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample3.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample2.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample5.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample12.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample12Upgraded.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample12Downgraded.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample14.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample14Upgraded.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample15.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexamplebaddata.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexamplebaddata1.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexamplebaddata2.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample3.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample2.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample.dll
+ @echo $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.dll
+ @echo $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.dll
+ @echo $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.dll
+ @echo $(RAMONLYTARGETDIR)/invalidsidplugin.rsc
+ @echo $(RAMONLYTARGETDIR)/invalidsidplugin.dll
+ @echo $(RAMONLYTARGETDIR)/t_platsecresolverc.dll
+ @echo $(RAMONLYTARGETDIR)/t_platsecresolverc.rsc
+ @echo $(RAMONLYTARGETDIR)/t_platsececom4.dll
+ @echo $(RAMONLYTARGETDIR)/t_platsececom4.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomnullexample.dll
+ @echo $(RAMONLYTARGETDIR)/ecomnullexample.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomupgradeexample1.dll
+ @echo $(RAMONLYTARGETDIR)/ecomupgradeexample1.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomupgradeexample2.dll
+ @echo $(RAMONLYTARGETDIR)/ecomupgradeexample2.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomupgradeexample3.dll
+ @echo $(RAMONLYTARGETDIR)/ecomupgradeexample3.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomupgraderoexample1.dll
+ @echo $(RAMONLYTARGETDIR)/ecomupgraderoexample1.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomupgraderoexample2.dll
+ @echo $(RAMONLYTARGETDIR)/ecomupgraderoexample2.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomupgraderoexample3.dll
+ @echo $(RAMONLYTARGETDIR)/ecomupgraderoexample3.rsc
+ @echo $(RAMONLYTARGETDIR)/defectplugin.dll
+ @echo $(RAMONLYTARGETDIR)/defectplugin.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample7.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample7.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomexample8.dll
+ @echo $(RAMONLYTARGETDIR)/ecomexample8.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomcr629example1.dll
+ @echo $(RAMONLYTARGETDIR)/ecomcr629example1.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomcr629example2.dll
+ @echo $(RAMONLYTARGETDIR)/ecomcr629example2.rsc
+ @echo $(RAMONLYTARGETDIR)/languageplugin.dll
+ @echo $(RAMONLYTARGETDIR)/languageplugin.rsc
+ @echo $(RAMONLYTARGETDIR)/languageplugin.r01
+ @echo $(RAMONLYTARGETDIR)/languageplugin.r02
+ @echo $(RAMONLYTARGETDIR)/languageplugin.r03
+ @echo $(RAMONLYTARGETDIR)/ecomhashexample.dll
+ @echo $(RAMONLYTARGETDIR)/ecomhashexample.rsc
+ @echo $(RAMONLYTARGETDIR)/ecomswiexample.dll
+ @echo $(RAMONLYTARGETDIR)/ecomswiexample.rsc
+ @echo $(RAMONLYTARGETDIR)/examplenine.dll
+ @echo $(RAMONLYTARGETDIR)/dummycustomresolver1.dll
+ @echo $(RAMONLYTARGETDIR)/dummycustomresolver1.rsc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/ecom3_relocatetarget.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2008-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:
+# Meta information for the ecom3_relocatetarget extension template
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/ecom3_relocatetarget.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,74 @@
+# Copyright (c) 2008-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:
+# Different from ecom3_postbuild.mk in that on armv5 the RAMONLYTARGETDIR
+# is not \epoc32\data\z\ramonly. It is \epoc32\release\armv5\<CFG>\z\ramonly.
+# This template has to preserve the udeb/urel targets.
+# Params:
+# SOURCES - list of .exe and .dll files to relocate
+# TARGET - not used
+# OPTION TARGETDIR - mandatory, it is "ramonly" for ecom testing.
+# OPTION TARGETBASE - optional, overrides \epoc32\release\<platform>\<cfg>\z
+# OPTION SOURCEDIR - optional, overrides \epoc32\release\<platform>\<cfg>
+#
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+# $(/) is actually back slash in Windows environment. Since bld.inf are written
+# with forward slashes and $(CP) is "copy", this substitution is important.
+TARGETDIR := $(subst /,$(/),$(TARGETDIR))
+
+ifdef TARGETBASE
+TARGETBASE := $(subst PLATFORM,$(PLATFORM_PATH),$(TARGETBASE))
+TARGETBASE := $(subst CFG,$(CFG_PATH),$(TARGETBASE))
+TARGETBASE := $(subst /,$(/),$(TARGETBASE))
+DESTDIR:=$(TARGETBASE)/$(TARGETDIR)
+else
+DESTDIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/$(TARGETDIR)
+endif
+
+ifdef SOURCEDIR
+SOURCEDIR := $(subst PLATFORM,$(PLATFORM_PATH),$(SOURCEDIR))
+SOURCEDIR := $(subst CFG,$(CFG_PATH),$(SOURCEDIR))
+SOURCEDIR := $(subst /,$(/),$(SOURCEDIR))
+else
+SOURCEDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+endif
+
+TARGET_COPY := $(foreach f,$(SOURCES),$(DESTDIR)/$(f) )
+
+$(DESTDIR) :
+ $(call createdir,"$@")
+
+$(TARGET_COPY) :
+ $(CP) $(call slash2generic, $(SOURCEDIR)/$(notdir $@) $@)
+ -$(ERASE) $(call slash2generic, $(SOURCEDIR)/$(notdir $@))
+
+#
+# The targets invoked by abld...
+#
+BLD : $(DESTDIR) $(TARGET_COPY)
+
+MAKMAKE SAVESPACE FREEZE LIB CLEANLIB RESOURCE FINAL :
+ @echo do nothing
+
+CLEAN :
+ -$(ERASE) $(TARGET_COPY)
+
+RELEASABLES :
+ @echo $(TARGET_COPY)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/featmgr_moveplugin.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# template.meta
+# Meta information for template use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/featmgr_moveplugin.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,162 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ EPOCDATADIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+ EPOCDATADIR:=$(EPOCROOT)epoc32/data
+endif
+
+BINSOURCEDIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+RESOURCESOURCEDIR:=$(EPOCDATADIR)/z/resource/plugins
+
+FILE1:=normal_plugin.dll
+FILE2:=hanging_plugin.dll
+FILE3:=corrupt_plugin.dll
+FILE4:=reconciliation_plugin.dll
+FILE5:=ab_normal_plugin.dll
+FILE6:=bc_enhanced_plugin.dll
+FILE7:=slowstart_plugin.dll
+FILE8:=invalid_plugin.dll
+FILE9:=normal_plugin.rsc
+FILE10:=hanging_plugin.rsc
+FILE11:=corrupt_plugin.rsc
+FILE12:=reconciliation_plugin.rsc
+FILE13:=ab_normal_plugin.rsc
+FILE14:=bc_enhanced_plugin.rsc
+FILE15:=slowstart_plugin.rsc
+FILE16:=invalid_plugin.rsc
+
+TARGETDIR:=$(EPOCDATADIR)/z/test/efm/plugins
+# we copy the normal plugin files to the resource folder on C: drive for the plugin ignoring test
+PLUGINTARGETDIR:=$(EPOCROOT)epoc32/winscw/c/sys/bin
+RESOURCETARGETDIR:=$(EPOCROOT)epoc32/winscw/c/resource/plugins
+
+$(TARGETDIR) :
+ $(call createdir,"$@")
+
+$(PLUGINTARGETDIR) :
+ $(call createdir,"$@")
+
+$(RESOURCETARGETDIR) :
+ $(call createdir,"$@")
+
+COPYFILES : $(TARGETDIR) $(PLUGINTARGETDIR) $(RESOURCETARGETDIR)
+ $(call forcecopy,$(BINSOURCEDIR)/$(FILE1),$(TARGETDIR)/$(FILE1))
+ $(call forcecopy,$(BINSOURCEDIR)/$(FILE1),$(PLUGINTARGETDIR)/$(FILE1))
+ $(call forcecopy,$(BINSOURCEDIR)/$(FILE2),$(TARGETDIR)/$(FILE2))
+ $(call forcecopy,$(BINSOURCEDIR)/$(FILE3),$(TARGETDIR)/$(FILE3))
+ $(call forcecopy,$(BINSOURCEDIR)/$(FILE4),$(TARGETDIR)/$(FILE4))
+ $(call forcecopy,$(BINSOURCEDIR)/$(FILE5),$(TARGETDIR)/$(FILE5))
+ $(call forcecopy,$(BINSOURCEDIR)/$(FILE6),$(TARGETDIR)/$(FILE6))
+ $(call forcecopy,$(BINSOURCEDIR)/$(FILE7),$(TARGETDIR)/$(FILE7))
+ $(call forcecopy,$(BINSOURCEDIR)/$(FILE8),$(TARGETDIR)/$(FILE8))
+ $(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE9),$(TARGETDIR)/$(FILE9))
+ $(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE9),$(RESOURCETARGETDIR)/$(FILE9))
+ $(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE10),$(TARGETDIR)/$(FILE10))
+ $(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE11),$(TARGETDIR)/$(FILE11))
+ $(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE12),$(TARGETDIR)/$(FILE12))
+ $(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE13),$(TARGETDIR)/$(FILE13))
+ $(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE14),$(TARGETDIR)/$(FILE14))
+ $(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE15),$(TARGETDIR)/$(FILE15))
+ $(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE16),$(TARGETDIR)/$(FILE16))
+
+ERASEFILES : $(call slash2generic,$(foreach FILE, $(FILE1) $(FILE2) $(FILE3) $(FILE4) $(FILE5) $(FILE6) $(FILE7) $(FILE8), $(TARGETDIR)/$(FILE)) $(PLUGINTARGETDIR)/$(FILE1))
+ $(call forceremove,$(BINSOURCEDIR)/$(FILE1))
+ $(call forceremove,$(BINSOURCEDIR)/$(FILE2))
+ $(call forceremove,$(BINSOURCEDIR)/$(FILE3))
+ $(call forceremove,$(BINSOURCEDIR)/$(FILE4))
+ $(call forceremove,$(BINSOURCEDIR)/$(FILE5))
+ $(call forceremove,$(BINSOURCEDIR)/$(FILE6))
+ $(call forceremove,$(BINSOURCEDIR)/$(FILE7))
+ $(call forceremove,$(BINSOURCEDIR)/$(FILE8))
+
+DO_NOTHING:
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+BLD : DO_NOTHING
+
+CLEAN :
+ $(call forceremove,$(TARGETDIR)/$(FILE1))
+ $(call forceremove,$(PLUGINTARGETDIR)/$(FILE1))
+ $(call forceremove,$(TARGETDIR)/$(FILE2))
+ $(call forceremove,$(TARGETDIR)/$(FILE3))
+ $(call forceremove,$(TARGETDIR)/$(FILE4))
+ $(call forceremove,$(TARGETDIR)/$(FILE5))
+ $(call forceremove,$(TARGETDIR)/$(FILE6))
+ $(call forceremove,$(TARGETDIR)/$(FILE7))
+ $(call forceremove,$(TARGETDIR)/$(FILE8))
+ $(call forceremove,$(TARGETDIR)/$(FILE9))
+ $(call forceremove,$(RESOURCETARGETDIR)/$(FILE9))
+ $(call forceremove,$(TARGETDIR)/$(FILE10))
+ $(call forceremove,$(TARGETDIR)/$(FILE11))
+ $(call forceremove,$(TARGETDIR)/$(FILE12))
+ $(call forceremove,$(TARGETDIR)/$(FILE13))
+ $(call forceremove,$(TARGETDIR)/$(FILE14))
+ $(call forceremove,$(TARGETDIR)/$(FILE15))
+ $(call forceremove,$(TARGETDIR)/$(FILE16))
+ $(call forceremove,$(RESOURCESOURCEDIR)/$(FILE9))
+ $(call forceremove,$(RESOURCESOURCEDIR)/$(FILE10))
+ $(call forceremove,$(RESOURCESOURCEDIR)/$(FILE11))
+ $(call forceremove,$(RESOURCESOURCEDIR)/$(FILE12))
+ $(call forceremove,$(RESOURCESOURCEDIR)/$(FILE13))
+ $(call forceremove,$(RESOURCESOURCEDIR)/$(FILE14))
+ $(call forceremove,$(RESOURCESOURCEDIR)/$(FILE15))
+ $(call forceremove,$(RESOURCESOURCEDIR)/$(FILE16))
+
+RELEASABLES :
+ @echo $(TARGETDIR)/$(FILE1)
+ @echo $(PLUGINTARGETDIR)/$(FILE1)
+ @echo $(TARGETDIR)/$(FILE2)
+ @echo $(TARGETDIR)/$(FILE3)
+ @echo $(TARGETDIR)/$(FILE4)
+ @echo $(TARGETDIR)/$(FILE5)
+ @echo $(TARGETDIR)/$(FILE6)
+ @echo $(TARGETDIR)/$(FILE7)
+ @echo $(TARGETDIR)/$(FILE8)
+ @echo $(TARGETDIR)/$(FILE9)
+ @echo $(RESOURCETARGETDIR)/$(FILE9)
+ @echo $(TARGETDIR)/$(FILE10)
+ @echo $(TARGETDIR)/$(FILE11)
+ @echo $(TARGETDIR)/$(FILE12)
+ @echo $(TARGETDIR)/$(FILE13)
+ @echo $(TARGETDIR)/$(FILE14)
+ @echo $(TARGETDIR)/$(FILE15)
+ @echo $(TARGETDIR)/$(FILE16)
+
+MAKMAKE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : COPYFILES ERASEFILES
+
+ROMFILE : DO_NOTHING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/sqlite3_securecopytestfiles.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for sqlite3_securecopytestfiles
+#
+
+platform win32
+makefile gnumake
+techstream pds
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/test/sqlite3_securecopytestfiles.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,69 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Copy SQLITE3_SECURE test files
+#
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/10286A82
+else
+ TARGETDIR=$(EPOCROOT)epoc32/data/z/private/10286A82
+
+endif
+
+SOURCEDIR = $(EXTENSION_ROOT)/../TEST/TCLSCRIPT
+
+$(TARGETDIR):
+ $(call createdir, "$@")
+
+COPYFILES :
+ $(call forcecopy,$(SOURCEDIR)/*.test,$(TARGETDIR)/)
+ $(call forcecopy,$(SOURCEDIR)/tester.tcl,$(TARGETDIR)/)
+
+
+DO_NOTHING :
+ @echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGETDIR) $(SOURCEDIR) COPYFILES
+
+CLEAN :
+ $(call forceremove,$(TARGETDIR)/*.test)
+ $(call forceremove,$(TARGETDIR)/tester.tcl)
+
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES :
+ @echo $(TARGETDIR)/*.test
+ @echo $(TARGETDIR)/tester.tcl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/word_template.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# template.meta
+# Meta information for template use
+#
+
+platform win32
+makefile gnumake
+techstream syslibs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/syslibs/word_template.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,68 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# template.mk
+# Build Word template files
+#
+#
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+ TARGETDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/10003a64
+else
+ # The IBY file uses the template file stored here when building ROMs
+ TARGETDIR = $(EPOCROOT)epoc32/data/z/private/10003a64
+endif
+
+TEMPLATES = $(TARGETDIR)/blank
+
+$(TARGETDIR) :
+ $(call createdir, "$@")
+
+# Well, actually just copy the prebuilt ones for now...
+# - deleting existing file first (in case it's read-only)
+
+TEMPLATESRCDIR = $(EXTENSION_ROOT)/../utemplat
+
+$(TEMPLATES) : $(TEMPLATESRCDIR)$/BLANK.UK $(TARGETDIR)
+ $(call forceremove,$@)
+ $(call forcecopy,$(TEMPLATESRCDIR)/BLANK.UK,"$@")
+DO_NOTHING :
+ @echo do nothing
+
+# The targets invoked by bld...
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+SAVESPACE : BLD
+
+BLD : $(TARGETDIR) $(TEMPLATES)
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+CLEAN :
+ -$(ERASE) $(TEMPLATES)
+
+RELEASABLES :
+ @echo $(TEMPLATES)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/tools/compsupp.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+# Copyright (c) 2008-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:
+# Meta information for the config extension template
+#
+
+platform win32
+makefile gnumake
+techstream Tools
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/tools/compsupp.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,43 @@
+# Copyright (c) 2008-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:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+do_nothing:
+
+MAKMAKE : do_nothing
+
+FREEZE : do_nothing
+
+LIB :
+ unzip -o $(FILE) -d $(TODIR)
+
+CLEANLIB : do_nothing
+
+RESOURCE : do_nothing
+
+FINAL : do_nothing
+
+BLD : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+ @perl -S $(EPOCROOT)epoc32/tools/listzip.pl $(EPOCROOT)epoc32/release $(FILE)
+
+CLEAN : do_nothing
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/tools/features.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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:
+# Meta information for features file generation
+#
+
+platform win32
+makefile gnumake
+techstream tools
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/tools/features.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,78 @@
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This makefile template is used to generate header/iby/features.dat file
+#
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+ifeq "$(CFG_PATH)" "rel"
+
+FEAT_TOOL := perl -S $(call slash2generic,features.pl)
+
+ifndef FEAT_DATABASE
+FEAT_DATABASE := $(EPOCROOT)epoc32/rom/include/featuredatabase.xml
+endif
+
+ifndef FEAT_HEADER_PATH
+FEAT_HEADER_PATH := $(EPOCROOT)epoc32/include
+endif
+
+ifndef FEAT_IBY_PATH
+FEAT_IBY_PATH := $(EPOCROOT)epoc32/rom/include
+endif
+
+ifndef FEAT_DAT_PATH
+FEAT_DAT_PATH := $(EPOCROOT)epoc32/data/config
+endif
+
+# Features tool will be invoked here
+ALL:
+ $(FEAT_TOOL) --datfile=$(FEAT_DAT_PATH) --hdrfile=$(FEAT_HEADER_PATH) --ibyfile=$(FEAT_IBY_PATH) $(FEAT_DATABASE)
+
+
+BLD SAVESPACE: ALL
+
+CLEAN :
+ -$(ERASE) $(call slash2generic,$(FEAT_HEADER_PATH)/featureuids.h)
+ -$(ERASE) $(call slash2generic,$(FEAT_IBY_PATH)/feature.iby)
+ -$(ERASE) $(call slash2generic,$(FEAT_DAT_PATH)/features.dat)
+
+RELEASABLES :
+ @echo $(FEAT_HEADER_PATH)/featureuids.h
+ @echo $(FEAT_IBY_PATH)/feature.iby
+ @echo $(FEAT_DAT_PATH)/features.dat
+
+DO_NOTHING :
+ @echo do nothing
+
+MAKMAKE : DO_NOTHING
+FREEZE : DO_NOTHING
+LIB : DO_NOTHING
+CLEANLIB : DO_NOTHING
+RESOURCE : DO_NOTHING
+FINAL : DO_NOTHING
+
+#if $(CFG_PATH) == "deb"
+else
+
+FINAL FREEZE LIB CLEANLIB RESOURCE RELEASABLES CLEAN BLD SAVESPACE MAKMAKE :
+
+endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/tools/x86tool.meta Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,19 @@
+# Copyright (c) 2006-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:
+# Meta information for the GNU makesis extension template
+#
+
+platform win32
+makefile gnumake
+techstream tools
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/extension/tools/x86tool.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,373 @@
+# Copyright (c) 2008-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:
+# /epoc32/tools/makefile_templates/tools/x86tool.mk
+# SBSv2 issues and differences from SBSv1
+# 1/ The shell is different
+# 2/ The msys shell can't handle absolute paths from root without the drive letter e.g. it can't find /epoc32 but it can find x:/epoc32
+# workaround is to go back to TO_ROOT
+# 3/ The current directory is at the bld.inf rather than /epoc32/build
+# 4/ Backslash is problematic
+# 5/ Path variables include the drive letter x: which causes problems for make when used in targets due to :
+# 6/ TO_ROOT is not defined
+# 7/ Some tool compatibility is problematic e.g. createdir doesn't work with paths containing forward slash
+#
+#
+
+# If this environment variable is defined we're definitely building for win32
+ifdef ComSpec
+WIN32:=1
+endif
+
+space:=
+space+=
+LETTERS:=a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
+
+# If win32 isn't defined yet - then we're probably building on sbsv2
+# So see if EPOCROOT starts with a drive letter to work out if we're building for win32
+ifndef WIN32
+ ifneq ($(subst $(space),,$(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EPOCROOT)),1,))),)
+ WIN32:=1
+ endif
+endif
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+# Get standard shell definitions
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+# Raptor includes the drive letter on paths - this makefile can't handle the drive letter
+# If we don't do this we get "multiple target patterns" errors in sbsv2
+TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EPOCROOT)),$(subst $(let):,,$(EPOCROOT)))))
+ifneq ($(TMPROOT),)
+ EPOCROOT:=$(TMPROOT)
+endif
+TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EXTENSION_ROOT)),$(subst $(let):,,$(EXTENSION_ROOT)))))
+ifneq ($(TMPROOT),)
+ EXTENSION_ROOT:=$(TMPROOT)
+endif
+
+# Make up for raptor not defining TO_ROOT properly
+# This might get broken if they change the current directory (which should really be in /epoc32/build)
+# We're using TO_ROOT to handle the fact that the msys shell doesn't seem to handle absolute paths
+ifdef WIN32
+ ifeq ($(TO_ROOT),)
+ TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(TO_BLDINF)),$(subst $(let):,,$(TO_BLDINF)))))
+ TO_ROOT:=.$(subst $(space),,$(foreach word,$(subst /,$(space),$(TMPROOT)),/..))
+ endif
+endif
+
+# Handle inconsistent case for build variant
+CFG_PATH:=$(CFG)
+ifeq ($(CFG_PATH),DEB)
+ CFG_PATH:=deb
+endif
+ifeq ($(CFG_PATH),REL)
+ CFG_PATH:=rel
+endif
+
+# Set the following to enable code coverage stats
+CODE_COVERAGE:=
+
+# Build
+ifdef WIN32
+ TARGET_DIR_REL:=$(EPOCROOT)epoc32/release/tools2/rel/
+ TARGET_DIR_DEB:=$(EPOCROOT)epoc32/release/tools2/deb/
+ GCOVDIR:=$(if $(CODE_COVERAGE),$(EPOCROOT)epoc32/gcc_mingw/libgcc/mingw32/3.4.5/)
+else
+ TARGET_DIR_REL:=$(EPOCROOT)epoc32/release/tools2/linux-i386/rel/
+ TARGET_DIR_DEB:=$(EPOCROOT)epoc32/release/tools2/linux-i386/deb/
+endif
+
+# The root to the source code - paths are relative to bld.inf if NOT specified
+# If SOURCE_ROOT specified then it's relative to EPOCROOT
+ifndef SOURCE_ROOT
+ ROOT:=$(subst \,/,$(EXTENSION_ROOT))
+ OBJSUBST:=/
+else
+ ROOT:=$(EPOCROOT)$(subst $(space)/,/,$(SOURCE_ROOT))
+ OBJSUBST:=$(EPOCROOT)
+endif
+
+# ***
+# STATIC LIBRARY
+#
+ifeq ($(TARGET_TYPE),lib)
+ TARGET_FULLNAME_REL:=$(TARGET_DIR_REL)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,.a)
+ TARGET_FULLNAME_DEB:=$(TARGET_DIR_DEB)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,.a)
+
+ ifeq ($(CFG_PATH),deb)
+ TARGET_LIB:=$(TARGET_FULLNAME_DEB)
+ endif
+ ifeq ($(CFG_PATH),rel)
+ TARGET_LIB:=$(TARGET_FULLNAME_REL)
+ endif
+ TARGET_LIB?=$(TARGET_FULLNAME_REL) $(TARGET_FULLNAME_DEB)
+endif
+
+# ***
+# EXE
+#
+ifeq ($(TARGET_TYPE),exe)
+ TARGET_FULLNAME_REL:=$(TARGET_DIR_REL)$(TARGET_SUB_DIR)$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.exe))
+ TARGET_FULLNAME_DEB:=$(TARGET_DIR_DEB)$(TARGET_SUB_DIR)$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.exe))
+
+ ifeq ($(CFG_PATH),deb)
+ TARGET_BLD:=$(TARGET_FULLNAME_DEB)
+ endif
+ ifeq ($(CFG_PATH),rel)
+ TARGET_BLD:=$(TARGET_FULLNAME_REL)
+ endif
+ TARGET_BLD?=$(TARGET_FULLNAME_REL) $(TARGET_FULLNAME_DEB)
+
+ LIBS+=symexestub
+ ifdef STLPORT
+ LIBS+=-lstlport.5.1
+ endif
+endif
+
+# ***
+# DLL/SO
+#
+ifeq ($(TARGET_TYPE),dll)
+
+ TARGET_FULLNAME_REL:=$(TARGET_DIR_REL)$(TARGET_SUB_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.dll,.so))
+ TARGET_FULLNAME_DEB:=$(TARGET_DIR_DEB)$(TARGET_SUB_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.dll,.so))
+
+ ifeq ($(CFG_PATH),deb)
+ TARGET_BLD:=$(TARGET_FULLNAME_DEB)
+ endif
+ ifeq ($(CFG_PATH),rel)
+ TARGET_BLD:=$(TARGET_FULLNAME_REL)
+ endif
+ TARGET_BLD?=$(TARGET_FULLNAME_REL) $(TARGET_FULLNAME_DEB)
+
+ ifdef STLPORT
+ LIBS+=-lstlport.5.1
+ endif
+endif
+
+# Pick up MINGW compiler from epoc32 on Windows
+ifdef WIN32
+ AR:=$(EPOCROOT)epoc32/gcc_mingw/bin/ar
+ CXX:=$(EPOCROOT)epoc32/gcc_mingw/bin/g++
+endif
+
+# Product include files are different for S60
+ifdef S60_BUILD
+ PRODUCT_INCLUDE:=$(EPOCROOT)epoc32/include/oem/bldvariant.hrh
+else
+ PRODUCT_INCLUDE:=$(EPOCROOT)epoc32/include/variant/Symbian_OS.hrh
+endif
+
+# Define macros we need
+CXXDEFS_COMMON:=$(foreach def,$(MACROS),-D$(def)) -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__X86__ -D_UNICODE -D__SUPPORT_CPP_EXCEPTIONS__ -D__TOOLS2__ -D'__PRODUCT_INCLUDE__="$(PRODUCT_INCLUDE)"'
+CXXDEFS_DEB:=$(CXXDEFS_COMMON) -D_DEBUG
+CXXDEFS_REL:=$(CXXDEFS_COMMON)
+
+# Setup the command line options for the compiler
+PREINC=$(EPOCROOT)epoc32/include/x86tool/x86tool.h
+CXXOPT_DEB:=-fshort-wchar -x c++ -O0 -g3 -Wall -c -fmessage-length=0 -include $(PREINC) -masm=intel
+OPTIMISE:=-fdefer-pop -fmerge-constants -fthread-jumps -floop-optimize -fif-conversion -fif-conversion2 -fguess-branch-probability -fcprop-registers -fforce-mem -foptimize-sibling-calls -fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fgcse-las -fdelete-null-pointer-checks -fexpensive-optimizations -fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks -freorder-functions -fstrict-aliasing -funit-at-a-time -falign-functions -falign-jumps -falign-loops -falign-labels -fcrossjumping
+CXXOPT_REL:=-fshort-wchar -x c++ -Wall -c -fmessage-length=0 -include $(PREINC) $(if $(CODE_COVERAGE),-O0,$(OPTIMISE)) -masm=intel
+
+# Allow specification of additional build include file
+ifdef BUILDINC
+ CXXOPT_DEB+= -include $(BUILDINC)
+ CXXOPT_REL+= -include $(BUILDINC)
+endif
+
+# Extra options needed for cia files
+ASMOPT:=-fomit-frame-pointer
+
+# Linker options for DLL
+ifndef DLL_WIN_LINKER_OPTS
+ DLL_WIN_LINKER_OPTS:= $(if $(CODE_COVERAGE),-lgcov) -Wl,-export-all-symbols
+endif
+ifndef DLL_LIN_LINKER_OPTS
+ DLL_LIN_LINKER_OPTS:= -Wl,-export-all-symbols $(if $(CODE_COVERAGE),-lgcov) -ldl
+endif
+
+# Source files to scan for in a directory
+# Note that CPP and cpp will match on the same files - so a sort is necessary on wildcard results
+SOURCE_EXT:=CPP cpp c cia
+
+# Source code assumed to be all cpp/cia files in supplied directories
+SOURCE_FILES:=$(foreach dir,$(SOURCE_DIRS),$(sort $(foreach ext,$(SOURCE_EXT),$(wildcard $(ROOT)/$(dir)/*.$(ext))))) \
+ $(foreach src,$(SOURCE),$(ROOT)/$(if $(SOURCE_FOLDER),$(SOURCE_FOLDER)/)$(src)) \
+ $(foreach src,$(SOURCE_MOD),$(subst \,/,$(EXTENSION_ROOT))/$(src)) \
+ $(foreach id,$(SOURCE_IDS),$(foreach src,$($(id)_SOURCE),$(subst $(space)/,/,$(if $($(id)_SOURCE_ROOT),$(EPOCROOT)$($(id)_SOURCE_ROOT),$(ROOT))/$(src))))
+
+# Include folders
+CXXINC:=$(foreach inc,$(INCLUDES) $(SOURCE_DIRS),-I$(ROOT)/$(inc)) \
+ $(foreach inc,$(SYS_INCLUDES),-I$(EPOCROOT)$(inc)) -I$(ROOT) \
+ $(foreach id,$(SOURCE_IDS),$(foreach inc,$($(id)_SOURCE_INC),-I$(subst $(space)/,/,$(if $($(id)_SOURCE_ROOT),$(EPOCROOT)$($(id)_SOURCE_ROOT),$(ROOT)))/$(inc)))
+
+# Add standard include paths?
+ifndef NO_STD_INCLUDE
+ CXXINC+= -I$(EPOCROOT)epoc32/include/x86tool -I$(EPOCROOT)epoc32/include
+ ifdef S60_BUILD
+ CXXINC+= -I$(EPOCROOT)epoc32/include/oem
+ endif
+endif
+
+# Support for building JNI
+ifdef JAVA_JNI
+ CXXINC+= -I"$(JAVA_HOME)/include"
+ ifdef WIN32
+ CXXINC+= -I"$(JAVA_HOME)/include/win32"
+ else
+ CXXINC+= -I"$(JAVA_HOME)/include/linux"
+ endif
+endif
+
+
+# STL Port support needed? Note STL and Symbian won't mix!
+ifdef STLPORT
+ CXXINC+= -I$(EPOCROOT)epoc32/include/tools/stlport
+endif
+
+# ***
+# DEBUG
+#
+
+# Object files are the same name as the source files with a .o extension
+OBJECTFILES_DEB:=$(foreach src,$(SOURCE_FILES),deb$(src).o)
+
+# Compile
+$(OBJECTFILES_DEB) : $(PREINC) $(SOURCE_FILES)
+ @echo ***
+ @echo Making: $@
+ $(call createdir,$(dir $@))
+ $(CXX) $(CXXDEFS_DEB) $(CXXINC) -I$(subst deb$(OBJSUBST),$(OBJSUBST),$(dir $@)) $(CXXOPT_DEB) $(if $(findstring .cia,$@),$(ASMOPT),$(if $(CODE_COVERAGE),-fprofile-arcs -ftest-coverage)) -o$@ $(subst deb$(OBJSUBST),$(OBJSUBST),$(basename $@))
+
+# Link
+$(TARGET_FULLNAME_DEB) : $(OBJECTFILES_DEB) $(foreach lib,$(LIBS),$(TARGET_DIR_DEB)lib$(lib).a) $(foreach lib,$(SHARED_LIBS),$(TARGET_DIR_DEB)lib$(lib)$(if $(WIN32),.a,.so))
+ifeq ($(TARGET_TYPE),lib)
+ @echo ***
+ @echo Creating lib: $@
+ $(AR) -r $(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB)
+endif
+ifeq ($(TARGET_TYPE),exe)
+ @echo ***
+ @echo Creating exe: $@
+ $(CXX) -L$(TARGET_DIR_DEB) $(if $(GCOVDIR),-L$(GCOVDIR)) \
+ -o$(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB) \
+ $(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+ $(if $(CODE_COVERAGE),-lgcov) $(if $(WIN32),,-ldl)
+endif
+ifeq ($(TARGET_TYPE),dll)
+ ifdef WIN32
+ @echo ***
+ @echo Creating Windows dll: $@
+ $(CXX) -L$(TARGET_DIR_DEB) $(if $(GCOVDIR),-L$(GCOVDIR)) \
+ -shared -o$(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB) \
+ $(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+ -Wl,-out-implib,$(@D)/$(basename $(@F)).a \
+ $(DLL_WIN_LINKER_OPTS)
+ else
+ @echo ***
+ @echo Creating Linux shared object: $@
+ $(CXX) -L$(TARGET_DIR_DEB) \
+ -shared -o$(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB) \
+ $(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+ $(DLL_LIN_LINKER_OPTS)
+ endif
+endif
+
+# ***
+# RELEASE
+#
+
+# Object files are the same name as the source files with a .o extension
+OBJECTFILES_REL:=$(foreach src,$(SOURCE_FILES),rel$(src).o)
+
+# Compile
+$(OBJECTFILES_REL) : $(PREINC) $(SOURCE_FILES)
+ @echo ***
+ @echo Making: $@
+ $(call createdir,$(dir $@))
+ $(CXX) $(CXXDEFS_REL) $(CXXINC) -I$(subst rel$(OBJSUBST),$(OBJSUBST),$(dir $@)) $(CXXOPT_REL) $(if $(findstring .cia,$@),$(ASMOPT),$(if $(CODE_COVERAGE),-fprofile-arcs -ftest-coverage)) -o$@ $(subst rel$(OBJSUBST),$(OBJSUBST),$(basename $@))
+
+# Link
+$(TARGET_FULLNAME_REL) : $(OBJECTFILES_REL) $(foreach lib,$(LIBS),$(TARGET_DIR_REL)lib$(lib).a) $(foreach lib,$(SHARED_LIBS),$(TARGET_DIR_REL)lib$(lib)$(if $(WIN32),.a,.so))
+ifeq ($(TARGET_TYPE),lib)
+ @echo ***
+ @echo Creating lib: $@
+ $(AR) -r $(TARGET_FULLNAME_REL) $(OBJECTFILES_REL)
+endif
+ifeq ($(TARGET_TYPE),exe)
+ @echo ***
+ @echo Creating exe: $@
+ $(CXX) -L$(TARGET_DIR_REL) $(if $(GCOVDIR),-L$(GCOVDIR)) \
+ -o$(TARGET_FULLNAME_REL) $(OBJECTFILES_REL) \
+ $(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+ $(if $(CODE_COVERAGE),-lgcov) $(if $(WIN32),,-ldl)
+endif
+ifeq ($(TARGET_TYPE),dll)
+ ifdef WIN32
+ @echo ***
+ @echo Creating Windows dll: $@
+ $(CXX) -L$(TARGET_DIR_REL) $(if $(GCOVDIR),-L$(GCOVDIR)) \
+ -shared -o$(TARGET_FULLNAME_REL) $(OBJECTFILES_REL) \
+ $(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+ -Wl,-out-implib,$(@D)/$(basename $(@F)).a \
+ $(DLL_WIN_LINKER_OPTS)
+ else
+ @echo ***
+ @echo Creating Linux shared object: $@
+ $(CXX) -L$(TARGET_DIR_REL) \
+ -shared -o$(TARGET_FULLNAME_REL) $(OBJECTFILES_REL) \
+ $(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+ $(DLL_LIN_LINKER_OPTS)
+ endif
+endif
+
+do_nothing:
+
+#
+# The targets invoked by abld...
+#
+
+MAKMAKE : do_nothing
+FREEZE : do_nothing
+RESOURCE : do_nothing
+CLEANLIB : do_nothing
+FINAL : do_nothing
+
+SAVESPACE :
+ifeq ($(CFG_PATH),deb)
+ $(call remove,$(OBJECTFILES_DEB))
+endif
+ifeq ($(CFG_PATH),rel)
+ $(call remove,$(OBJECTFILES_REL))
+endif
+
+LIB : $(TARGET_LIB)
+
+BLD : $(TARGET_BLD)
+
+CLEAN :
+ $(call remove,$(foreach file,$(TARGET_LIB) $(TARGET_BLD),$(TO_ROOT)$(file)))
+ifeq ($(CFG_PATH),deb)
+ $(call remove,$(OBJECTFILES_DEB))
+endif
+ifeq ($(CFG_PATH),rel)
+ $(call remove,$(OBJECTFILES_REL))
+endif
+
+RELEASABLES :
+ @echo $(TARGET_LIB) $(TARGET_BLD)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/group/bld.inf Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,126 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+
+../extension/app-services/buildstubsis.meta /epoc32/tools/makefile_templates/app-services/buildstubsis.meta
+../extension/app-services/buildstubsis.mk /epoc32/tools/makefile_templates/app-services/buildstubsis.mk
+../extension/app-services/buildupgradesis.meta /epoc32/tools/makefile_templates/app-services/buildupgradesis.meta
+../extension/app-services/buildupgradesis.mk /epoc32/tools/makefile_templates/app-services/buildupgradesis.mk
+../extension/application-protocols/buildstubsis.meta /epoc32/tools/makefile_templates/application-protocols/buildstubsis.meta
+../extension/application-protocols/buildstubsis.mk /epoc32/tools/makefile_templates/application-protocols/buildstubsis.mk
+../extension/base/bootstrap.meta /epoc32/tools/makefile_templates/base/bootstrap.meta
+../extension/base/bootstrap.mk /epoc32/tools/makefile_templates/base/bootstrap.mk
+../extension/base/bootstrap.flm /epoc32/tools/makefile_templates/base/bootstrap.flm
+../extension/base/bootstrap.xml /epoc32/tools/makefile_templates/base/bootstrap.xml
+../extension/base/config.meta /epoc32/tools/makefile_templates/base/config.meta
+../extension/base/config.mk /epoc32/tools/makefile_templates/base/config.mk
+../extension/base/copy_default.meta /epoc32/tools/makefile_templates/base/copy_default.meta
+../extension/base/copy_default.mk /epoc32/tools/makefile_templates/base/copy_default.mk
+../extension/base/genexec.meta /epoc32/tools/makefile_templates/base/genexec.meta
+../extension/base/genexec.mk /epoc32/tools/makefile_templates/base/genexec.mk
+../extension/base/h2_genbootinc.meta /epoc32/tools/makefile_templates/base/h2_genbootinc.meta
+../extension/base/h2_genbootinc.mk /epoc32/tools/makefile_templates/base/h2_genbootinc.mk
+../extension/base/h2_restricted_coreldr.meta /epoc32/tools/makefile_templates/base/h2_restricted_coreldr.meta
+../extension/base/h2_restricted_coreldr.mk /epoc32/tools/makefile_templates/base/h2_restricted_coreldr.mk
+../extension/base/h4_genbootinc.meta /epoc32/tools/makefile_templates/base/h4_genbootinc.meta
+../extension/base/h4_genbootinc.mk /epoc32/tools/makefile_templates/base/h4_genbootinc.mk
+../extension/base/h4_restricted_coreldr.meta /epoc32/tools/makefile_templates/base/h4_restricted_coreldr.meta
+../extension/base/h4_restricted_coreldr.mk /epoc32/tools/makefile_templates/base/h4_restricted_coreldr.mk
+../extension/base/h4_restricted_on_coreldr.meta /epoc32/tools/makefile_templates/base/h4_restricted_on_coreldr.meta
+../extension/base/h4_restricted_on_coreldr.mk /epoc32/tools/makefile_templates/base/h4_restricted_on_coreldr.mk
+../extension/base/h4_restricted_on_miniboot.meta /epoc32/tools/makefile_templates/base/h4_restricted_on_miniboot.meta
+../extension/base/h4_restricted_on_miniboot.mk /epoc32/tools/makefile_templates/base/h4_restricted_on_miniboot.mk
+../extension/base/ne1_tb_restricted_coreldr.meta /epoc32/tools/makefile_templates/base/ne1_tb_restricted_coreldr.meta
+../extension/base/ne1_tb_restricted_coreldr.mk /epoc32/tools/makefile_templates/base/ne1_tb_restricted_coreldr.mk
+../extension/base/ne1_tb_genbootinc.meta /epoc32/tools/makefile_templates/base/ne1_tb_genbootinc.meta
+../extension/base/ne1_tb_genbootinc.mk /epoc32/tools/makefile_templates/base/ne1_tb_genbootinc.mk
+../extension/base/lab_restricted_miniboot.meta /epoc32/tools/makefile_templates/base/lab_restricted_miniboot.meta
+../extension/base/lab_restricted_miniboot.mk /epoc32/tools/makefile_templates/base/lab_restricted_miniboot.mk
+../extension/base/nand_fbr_offset.meta /epoc32/tools/makefile_templates/base/nand_fbr_offset.meta
+../extension/base/nand_fbr_offset.mk /epoc32/tools/makefile_templates/base/nand_fbr_offset.mk
+../extension/base/omap3_genbootinc.meta /epoc32/tools/makefile_templates/base/omap3_genbootinc.meta
+../extension/base/omap3_genbootinc.mk /epoc32/tools/makefile_templates/base/omap3_genbootinc.mk
+../extension/base/omap3_restricted_coreldr.meta /epoc32/tools/makefile_templates/base/omap3_restricted_coreldr.meta
+../extension/base/omap3_restricted_coreldr.mk /epoc32/tools/makefile_templates/base/omap3_restricted_coreldr.mk
+../extension/base/omap3_restricted_coreldr.flm /epoc32/tools/makefile_templates/base/omap3_restricted_coreldr.flm
+../extension/base/omap3_restricted_coreldr.xml /epoc32/tools/makefile_templates/base/omap3_restricted_coreldr.xml
+../extension/base/lab_restricted_miniboot.flm /epoc32/tools/makefile_templates/base/lab_restricted_miniboot.flm
+../extension/base/lab_restricted_miniboot.xml /epoc32/tools/makefile_templates/base/lab_restricted_miniboot.xml
+../extension/base/ne1_tb_restricted_coreldr.flm /epoc32/tools/makefile_templates/base/ne1_tb_restricted_coreldr.flm
+../extension/base/ne1_tb_restricted_coreldr.xml /epoc32/tools/makefile_templates/base/ne1_tb_restricted_coreldr.xml
+../extension/base/base_rvct_common.mk /epoc32/tools/makefile_templates/base/base_rvct_common.mk
+../extension/converged-comms/createcommdbs.meta /epoc32/tools/makefile_templates/converged-comms/createcommdbs.meta
+../extension/converged-comms/createcommdbs.mk /epoc32/tools/makefile_templates/converged-comms/createcommdbs.mk
+../extension/converged-comms/installdefaultcommdb.meta /epoc32/tools/makefile_templates/converged-comms/installdefaultcommdb.meta
+../extension/converged-comms/installdefaultcommdb.mk /epoc32/tools/makefile_templates/converged-comms/installdefaultcommdb.mk
+../extension/security/upsserver.meta /epoc32/tools/makefile_templates/security/upsserver.meta
+../extension/security/upsserver.mk /epoc32/tools/makefile_templates/security/upsserver.mk
+../extension/syslibs/conversiontable.meta /epoc32/tools/makefile_templates/syslibs/conversiontable.meta
+../extension/syslibs/conversiontable.mk /epoc32/tools/makefile_templates/syslibs/conversiontable.mk
+../extension/syslibs/fm_copyfile_to_winscw_zdrive.meta /epoc32/tools/makefile_templates/syslibs/fm_copyfile_to_winscw_zdrive.meta
+../extension/syslibs/fm_copyfile_to_winscw_zdrive.mk /epoc32/tools/makefile_templates/syslibs/fm_copyfile_to_winscw_zdrive.mk
+../extension/syslibs/generate_cpp.meta /epoc32/tools/makefile_templates/syslibs/generate_cpp.meta
+../extension/syslibs/generate_cpp.mk /epoc32/tools/makefile_templates/syslibs/generate_cpp.mk
+../extension/syslibs/generate_snm.meta /epoc32/tools/makefile_templates/syslibs/generate_snm.meta
+../extension/syslibs/generate_snm.mk /epoc32/tools/makefile_templates/syslibs/generate_snm.mk
+../extension/tools/features.meta /epoc32/tools/makefile_templates/tools/features.meta
+../extension/tools/features.mk /epoc32/tools/makefile_templates/tools/features.mk
+../extension/tools/compsupp.meta /epoc32/tools/makefile_templates/tools/compsupp.meta
+../extension/tools/compsupp.mk /epoc32/tools/makefile_templates/tools/compsupp.mk
+../extension/tools/x86tool.meta /epoc32/tools/makefile_templates/tools/x86tool.meta
+../extension/tools/x86tool.mk /epoc32/tools/makefile_templates/tools/x86tool.mk
+../shell/cmd.mk /epoc32/tools/shell/cmd.mk
+../shell/generic.mk /epoc32/tools/shell/generic.mk
+../shell/sh.mk /epoc32/tools/shell/sh.mk
+
+
+PRJ_TESTEXPORTS
+
+../extension/app-services/tzlocaltestserver.meta /epoc32/tools/makefile_templates/app-services/tzlocaltestserver.meta
+../extension/app-services/tzlocaltestserver.mk /epoc32/tools/makefile_templates/app-services/tzlocaltestserver.mk
+../extension/syslibs/test/bafl_copytestfiles.meta /epoc32/tools/makefile_templates/syslibs/test/bafl_copytestfiles.meta
+../extension/syslibs/test/bafl_copytestfiles.mk /epoc32/tools/makefile_templates/syslibs/test/bafl_copytestfiles.mk
+../extension/syslibs/test/bafl_resource_files.meta /epoc32/tools/makefile_templates/syslibs/test/bafl_resource_files.meta
+../extension/syslibs/test/bafl_resource_files.mk /epoc32/tools/makefile_templates/syslibs/test/bafl_resource_files.mk
+../extension/syslibs/test/centrep_copydatfile.meta /epoc32/tools/makefile_templates/syslibs/test/centrep_copydatfile.meta
+../extension/syslibs/test/centrep_copydatfile.mk /epoc32/tools/makefile_templates/syslibs/test/centrep_copydatfile.mk
+../extension/syslibs/test/centrep_copyincentrepsrv.meta /epoc32/tools/makefile_templates/syslibs/test/centrep_copyincentrepsrv.meta
+../extension/syslibs/test/centrep_copyincentrepsrv.mk /epoc32/tools/makefile_templates/syslibs/test/centrep_copyincentrepsrv.mk
+../extension/syslibs/test/centrep_copypctestfile.meta /epoc32/tools/makefile_templates/syslibs/test/centrep_copypctestfile.meta
+../extension/syslibs/test/centrep_copypctestfile.mk /epoc32/tools/makefile_templates/syslibs/test/centrep_copypctestfile.mk
+../extension/syslibs/test/centrep_copypctestfilev2.meta /epoc32/tools/makefile_templates/syslibs/test/centrep_copypctestfilev2.meta
+../extension/syslibs/test/centrep_copypctestfilev2.mk /epoc32/tools/makefile_templates/syslibs/test/centrep_copypctestfilev2.mk
+../extension/syslibs/test/charconv_testpostbuild.meta /epoc32/tools/makefile_templates/syslibs/test/charconv_testpostbuild.meta
+../extension/syslibs/test/charconv_testpostbuild.mk /epoc32/tools/makefile_templates/syslibs/test/charconv_testpostbuild.mk
+../extension/syslibs/test/charconv_tiso8859x_generate_cpp.meta /epoc32/tools/makefile_templates/syslibs/test/charconv_tiso8859x_generate_cpp.meta
+../extension/syslibs/test/charconv_tiso8859x_generate_cpp.mk /epoc32/tools/makefile_templates/syslibs/test/charconv_tiso8859x_generate_cpp.mk
+../extension/syslibs/test/charconv_tsnmdata.meta /epoc32/tools/makefile_templates/syslibs/test/charconv_tsnmdata.meta
+../extension/syslibs/test/charconv_tsnmdata.mk /epoc32/tools/makefile_templates/syslibs/test/charconv_tsnmdata.mk
+../extension/syslibs/test/ecom3_buildsis.meta /epoc32/tools/makefile_templates/syslibs/test/ecom3_buildsis.meta
+../extension/syslibs/test/ecom3_buildsis.mk /epoc32/tools/makefile_templates/syslibs/test/ecom3_buildsis.mk
+../extension/syslibs/test/ecom3_postbuild.meta /epoc32/tools/makefile_templates/syslibs/test/ecom3_postbuild.meta
+../extension/syslibs/test/ecom3_postbuild.mk /epoc32/tools/makefile_templates/syslibs/test/ecom3_postbuild.mk
+../extension/syslibs/test/ecom3_relocatetarget.meta /epoc32/tools/makefile_templates/syslibs/test/ecom3_relocatetarget.meta
+../extension/syslibs/test/ecom3_relocatetarget.mk /epoc32/tools/makefile_templates/syslibs/test/ecom3_relocatetarget.mk
+../extension/syslibs/test/featmgr_moveplugin.meta /epoc32/tools/makefile_templates/syslibs/test/featmgr_moveplugin.meta
+../extension/syslibs/test/featmgr_moveplugin.mk /epoc32/tools/makefile_templates/syslibs/test/featmgr_moveplugin.mk
+../extension/syslibs/test/sqlite3_securecopytestfiles.meta /epoc32/tools/makefile_templates/syslibs/test/sqlite3_securecopytestfiles.meta
+../extension/syslibs/test/sqlite3_securecopytestfiles.mk /epoc32/tools/makefile_templates/syslibs/test/sqlite3_securecopytestfiles.mk
+../extension/syslibs/word_template.meta /epoc32/tools/makefile_templates/syslibs/word_template.meta
+../extension/syslibs/word_template.mk /epoc32/tools/makefile_templates/syslibs/word_template.mk
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/group/tools_buildsystem.mrp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,113 @@
+component tools_buildsystem
+
+ipr T
+
+source \sf\os\buildtools\toolsandutils\buildsystem
+
+binary \epoc32\tools\makefile_templates\app-services\buildstubsis.meta
+binary \epoc32\tools\makefile_templates\app-services\buildstubsis.mk
+binary \epoc32\tools\makefile_templates\app-services\buildupgradesis.meta
+binary \epoc32\tools\makefile_templates\app-services\buildupgradesis.mk
+binary \epoc32\tools\makefile_templates\app-services\tzlocaltestserver.meta
+binary \epoc32\tools\makefile_templates\app-services\tzlocaltestserver.mk
+binary \epoc32\tools\makefile_templates\application-protocols\buildstubsis.meta
+binary \epoc32\tools\makefile_templates\application-protocols\buildstubsis.mk
+binary \epoc32\tools\makefile_templates\base\bootstrap.meta
+binary \epoc32\tools\makefile_templates\base\bootstrap.mk
+binary \epoc32\tools\makefile_templates\base\bootstrap.xml
+binary \epoc32\tools\makefile_templates\base\bootstrap.flm
+binary \epoc32\tools\makefile_templates\base\config.meta
+binary \epoc32\tools\makefile_templates\base\config.mk
+binary \epoc32\tools\makefile_templates\base\copy_default.meta
+binary \epoc32\tools\makefile_templates\base\copy_default.mk
+binary \epoc32\tools\makefile_templates\base\genexec.meta
+binary \epoc32\tools\makefile_templates\base\genexec.mk
+binary \epoc32\tools\makefile_templates\base\base_rvct_common.mk
+binary \epoc32\tools\makefile_templates\base\h2_genbootinc.meta
+binary \epoc32\tools\makefile_templates\base\h2_genbootinc.mk
+binary \epoc32\tools\makefile_templates\base\h2_restricted_coreldr.meta
+binary \epoc32\tools\makefile_templates\base\h2_restricted_coreldr.mk
+binary \epoc32\tools\makefile_templates\base\h4_genbootinc.meta
+binary \epoc32\tools\makefile_templates\base\h4_genbootinc.mk
+binary \epoc32\tools\makefile_templates\base\h4_restricted_coreldr.meta
+binary \epoc32\tools\makefile_templates\base\h4_restricted_coreldr.mk
+binary \epoc32\tools\makefile_templates\base\h4_restricted_on_coreldr.meta
+binary \epoc32\tools\makefile_templates\base\h4_restricted_on_coreldr.mk
+binary \epoc32\tools\makefile_templates\base\h4_restricted_on_miniboot.meta
+binary \epoc32\tools\makefile_templates\base\h4_restricted_on_miniboot.mk
+binary \epoc32\tools\makefile_templates\base\lab_restricted_miniboot.meta
+binary \epoc32\tools\makefile_templates\base\lab_restricted_miniboot.mk
+binary \epoc32\tools\makefile_templates\base\lab_restricted_miniboot.xml
+binary \epoc32\tools\makefile_templates\base\lab_restricted_miniboot.flm
+binary \epoc32\tools\makefile_templates\base\nand_fbr_offset.meta
+binary \epoc32\tools\makefile_templates\base\nand_fbr_offset.mk
+binary \epoc32\tools\makefile_templates\base\ne1_tb_genbootinc.meta
+binary \epoc32\tools\makefile_templates\base\ne1_tb_genbootinc.mk
+binary \epoc32\tools\makefile_templates\base\ne1_tb_restricted_coreldr.meta
+binary \epoc32\tools\makefile_templates\base\ne1_tb_restricted_coreldr.mk
+binary \epoc32\tools\makefile_templates\base\ne1_tb_restricted_coreldr.xml
+binary \epoc32\tools\makefile_templates\base\ne1_tb_restricted_coreldr.flm
+binary \epoc32\tools\makefile_templates\base\omap3_genbootinc.meta
+binary \epoc32\tools\makefile_templates\base\omap3_genbootinc.mk
+binary \epoc32\tools\makefile_templates\base\omap3_restricted_coreldr.meta
+binary \epoc32\tools\makefile_templates\base\omap3_restricted_coreldr.mk
+binary \epoc32\tools\makefile_templates\base\omap3_restricted_coreldr.xml
+binary \epoc32\tools\makefile_templates\base\omap3_restricted_coreldr.flm
+binary \epoc32\tools\makefile_templates\converged-comms\createcommdbs.meta
+binary \epoc32\tools\makefile_templates\converged-comms\createcommdbs.mk
+binary \epoc32\tools\makefile_templates\converged-comms\installdefaultcommdb.meta
+binary \epoc32\tools\makefile_templates\converged-comms\installdefaultcommdb.mk
+binary \epoc32\tools\makefile_templates\security\upsserver.meta
+binary \epoc32\tools\makefile_templates\security\upsserver.mk
+binary \epoc32\tools\makefile_templates\syslibs\conversiontable.meta
+binary \epoc32\tools\makefile_templates\syslibs\conversiontable.mk
+binary \epoc32\tools\makefile_templates\syslibs\fm_copyfile_to_winscw_zdrive.meta
+binary \epoc32\tools\makefile_templates\syslibs\fm_copyfile_to_winscw_zdrive.mk
+binary \epoc32\tools\makefile_templates\syslibs\generate_cpp.meta
+binary \epoc32\tools\makefile_templates\syslibs\generate_cpp.mk
+binary \epoc32\tools\makefile_templates\syslibs\generate_snm.meta
+binary \epoc32\tools\makefile_templates\syslibs\generate_snm.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\bafl_copytestfiles.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\bafl_copytestfiles.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\bafl_resource_files.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\bafl_resource_files.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\centrep_copydatfile.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\centrep_copydatfile.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\centrep_copyincentrepsrv.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\centrep_copyincentrepsrv.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\centrep_copypctestfile.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\centrep_copypctestfile.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\centrep_copypctestfilev2.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\centrep_copypctestfilev2.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\charconv_testpostbuild.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\charconv_testpostbuild.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\charconv_tiso8859x_generate_cpp.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\charconv_tiso8859x_generate_cpp.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\charconv_tsnmdata.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\charconv_tsnmdata.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\ecom3_buildsis.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\ecom3_buildsis.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\ecom3_postbuild.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\ecom3_postbuild.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\ecom3_relocatetarget.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\ecom3_relocatetarget.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\featmgr_moveplugin.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\featmgr_moveplugin.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\logeng_copytestfiles.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\logeng_copytestfiles.mk
+binary \epoc32\tools\makefile_templates\syslibs\test\sqlite3_securecopytestfiles.meta
+binary \epoc32\tools\makefile_templates\syslibs\test\sqlite3_securecopytestfiles.mk
+binary \epoc32\tools\makefile_templates\syslibs\word_template.meta
+binary \epoc32\tools\makefile_templates\syslibs\word_template.mk
+binary \epoc32\tools\makefile_templates\tools\compsupp.meta
+binary \epoc32\tools\makefile_templates\tools\compsupp.mk
+binary \epoc32\tools\makefile_templates\tools\features.meta
+binary \epoc32\tools\makefile_templates\tools\features.mk
+binary \epoc32\tools\makefile_templates\tools\x86tool.meta
+binary \epoc32\tools\makefile_templates\tools\x86tool.mk
+binary \epoc32\tools\shell\cmd.mk
+binary \epoc32\tools\shell\generic.mk
+binary \epoc32\tools\shell\sh.mk
+
+
+notes_source \component_defs\release.src
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/shell/cmd.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,136 @@
+# Copyright (c) 2005-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:
+#
+
+include $(EPOCROOT)epoc32/tools/shell/generic.mk
+
+# Host platform dependant variables
+/:=$(shell echo \)
+;:=;
+CP=copy
+RM=del
+RMDIR=rmdir
+MKDIR=mkdir
+ERASE=@erase /q 2>>nul
+
+
+# Some tools do not work with slash but only dollar slash.
+# That is actually a defect for them and should be fixed.
+# Then this macro should be abandoned.
+define slash2generic
+$(subst /,$/,$(1))
+endef
+
+# Call perl script to create directory.
+# Used in base/config.mk and many others
+define createdir
+perl $(EPOCROOT)epoc32/tools/emkdir.pl $(1)
+endef
+
+# Check if not exist directory then create it first.
+# Used in BASE/lubbock_miniboot
+define ifnotexistd
+if not exist $(1) md $(subst /,\,$(1))
+endef
+
+# This means there are something to add for SBSv2 here.
+# For abld, there is nothing.
+# Used in base/lubbock_miniboot and should be used in similar situation.
+define sbsadd
+
+endef
+
+# Add double quotes for abld target. No quote for SBSv2.
+# Used in base/lubbock_miniboot
+define abldquote
+"$(1)"
+endef
+
+# Used in Syslibs/conversiontable.mk
+define generated
+$(EPOCROOT)epoc32/build/$(1)
+endef
+
+# Used in syslibs/generate_cpp.mk
+define formatreleasables
+@echo $(1)
+endef
+
+# Used in BASE/config.mk
+define generatedcpp
+$(EPOCROOT)epoc32/build/generatedcpp/hal
+endef
+
+# Set path. Used in BASE/bootstrap.mk
+define epocbldabs
+$(1)$(2)
+endef
+
+# Call perl script ecopyfile.pl to copy.
+# Used in BASE/bootstrap.mk
+define ecopy
+perl $(EPOCROOT)epoc32/tools/ecopyfile.pl
+endef
+
+# Abld does not support pipe symbol | while SBSv2 does. So for Abld it is nothing.
+# Used in Base/bootstrap.mk.
+define pipe
+
+endef
+
+# Call perl script copyfeaturevariants.pl. Used in BASE/copy_default.mk.
+define cpfeature
+perl $(EPOCROOT)epoc32/tools/copyfeaturevariants.pl $(1) $(2)
+endef
+
+# Used in Syslibs/generate_cpp.mk at the bottom to deal with different
+# way of includeing TEM in Abld and SBSv2.
+define include
+$(EPOCROOT)epoc32/tools/makefile_templates/syslibs/generate_cpp.mk
+endef
+
+# Macro to change working directory. Used for TOOLS/stlport.mk
+# The path needs to be fixed before passing to cd command
+define chdir
+-cd $(subst /,\,$(1))
+endef
+
+# Macro to remove files. All paths need to be corrected before deleting.
+# Used in TOOLS/stlport.mk
+define remove
+-$(ERASE) $(subst /,\,$(1))
+endef
+
+# Macro to copy files. Needed for sbsv2 build
+# Used in PDS components in syslibs/*.mk
+define forcecopy
+$(CP) $(subst /,\,$(1)) $(subst /,\,$(2))
+endef
+
+# Macro to remove files. Needed for sbsv2 build
+# Used in PDS components in syslibs/*.mk
+define forceremove
+-$(ERASE) $(subst /,\,$(1))
+endef
+
+define tmpmacro
+$(call chdir,$(BUILD_DIR));configure.bat -c gcc;
+endef
+
+define settPath
+1
+endef
+
+# Configuration needs to be returned as upper case for abld
+CONFIGURATION:=REL
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/shell/generic.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,63 @@
+# Copyright (c) 2006-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:
+# Definitions common to all shells
+# *_PATH variables to support filename policy conformance in makefile templates
+# NOTE: These should all be replaced by calls to a function that lower-cases
+# the current setting of the original variable
+#
+#
+
+PLATFORM_PATH=$(PLATFORM)
+CFG_PATH=$(CFG)
+
+ifeq ($(PLATFORM_PATH),WINS)
+ PLATFORM_PATH=wins
+else
+ifeq ($(PLATFORM_PATH),WINSCW)
+ PLATFORM_PATH=winscw
+else
+ifeq ($(PLATFORM_PATH),ARMV5)
+ PLATFORM_PATH=armv5
+else
+ifeq ($(PLATFORM_PATH),ARMV7)
+ PLATFORM_PATH=armv7
+else
+ifeq ($(PLATFORM_PATH),TOOLS)
+ PLATFORM_PATH=tools
+else
+ifeq ($(PLATFORM_PATH),TOOLS2)
+ PLATFORM_PATH=tools2
+endif
+endif
+endif
+endif
+endif
+endif
+
+ifeq ($(CFG_PATH),UREL)
+ CFG_PATH=urel
+else
+ifeq ($(CFG_PATH),UDEB)
+ CFG_PATH=udeb
+else
+ifeq ($(CFG_PATH),DEB)
+ CFG_PATH=deb
+else
+ifeq ($(CFG_PATH),REL)
+ CFG_PATH=rel
+endif
+endif
+endif
+endif
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystem/shell/sh.mk Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,117 @@
+# Copyright (c) 2006-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:
+#
+
+include $(EPOCROOT)epoc32/tools/shell/generic.mk
+
+
+# Some tools do not work with slash but only dollar slash.
+# That is actually a defect for them and should be fixed.
+# Then this macro should be abandoned.
+define slash2generic
+$(1)
+endef
+
+# Use $(MKDIR) to create directory
+# Use in base/config.mk and many others
+define createdir
+$(MKDIR) -p $(1)
+endef
+
+# Check if not exist directory then create it first.
+# Use in BASE/lubbock_miniboot and many others
+define ifnotexistd
+if [ ! -d $(1) ]; then $(MKDIR) -p $(1); fi
+endef
+
+# This means there are something to add for SBSv2 here.
+# Used in base/lubbock_miniboot and should be used in similar situation.
+define sbsadd
+$(1)
+endef
+
+# Add double quotes for abld target. No quote for SBSv2.
+# Used in base/lubbock_miniboot
+define abldquote
+$(1)
+endef
+
+# Used in Syslibs/conversiontable.mk
+define generated
+$(EPOCROOT)epoc32/build/$(1)
+endef
+
+# Used in syslibs/generate_cpp.mk
+define formatreleasables
+$(if $(1),@echo $(word 1,$(1)))
+$(if $(1),$(call formatreleasables,$(wordlist 2,$(words $(1)),$(1))))
+endef
+
+# Used in BASE/config.mk
+define generatedcpp
+$(EPOCROOT)epoc32/build/generatedcpp/hal
+endef
+
+# Set path. Used in BASE/bootstrap.mk
+define epocbldabs
+$(EPOCBLD)
+endef
+
+# Copy. Used in BASE/bootstrap.mk
+define ecopy
+cp
+endef
+
+# Abld does not support pipe symbol | while SBSv2 does. So for Abld it is nothing.
+# Used in Base/bootstrap.mk.
+define pipe
+| $(1)
+endef
+
+# Used in BASE/copy_default.mk.
+define cpfeature
+$(CP) $? $@
+endef
+
+# Used in Syslibs/generate_cpp.mk at the bottom to deal with different
+# way of includeing TEM in Abld and SBSv2.
+define include
+$(TEMPLATE_EXTENSION_MAKEFILE)
+endef
+
+# Macro to change working directory. Used for TOOLS/stlport.mk
+# The path needs to be fixed before passing to cd command
+define chdir
+-cd $(1)
+endef
+
+# Macro to remove files. Used in TOOLS/stlport.mk
+define remove
+-rm -f $(1)
+endef
+
+# Macro to copy files. Needed for sbsv2 build
+# Used in PDS components in syslibs/*.mk
+define forcecopy
+$(CP) -f $(1) $(2) && chmod a+rwx $(2)
+endef
+
+# Macro to remove files. Needed for sbsv2 build
+# Used in PDS components in syslibs/*.mk
+define forceremove
+-$(ERASE) -f $(1)
+endef
+
+# Configuration needs to be returned as upper case for abld
+CONFIGURATION:=rel
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/BuildClient.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,88 @@
+# Copyright (c) 2003-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:
+# Script to Process builds commands sent from the Build Server via TCP/IP
+#
+#
+
+use strict;
+use FindBin; # for FindBin::Bin
+use Getopt::Long;
+
+# Add the directory contain this perl script into the path to find modules
+use lib $FindBin::Bin;
+
+use BuildClient;
+
+# Process the commandline
+my ($iDataSource, $iConnectWait, $iClientName, $iExitAfter, $iDebug) = ProcessCommandLine();
+
+# Create socket to server
+&BuildClient::Connect($iDataSource, $iConnectWait, $iClientName, $iExitAfter, $iDebug);
+
+# ProcessCommandLine
+#
+# Inputs
+#
+# Outputs
+# $iDataSource - Reference to array of Hostname:Port combinations to try in sequence
+# $iConnectWait (How often it polls for a build server)
+# $iClientName (Client name used to help identify the machine, Must be unique)
+# $iExitAfter - Number of succesful connections to exit after
+# $iDebug - Prints Command output to screen to help debug
+#
+# Description
+# This function processes the commandline
+
+sub ProcessCommandLine {
+ my ($iHelp, @iDataSource, $iConnectWait, $iDebug);
+ my ($iExitAfter) = -1; #Set default to never exit
+ GetOptions('h' => \$iHelp, 'd=s' => \@iDataSource, 'debug:s' => \$iDebug, 'w=i' => \$iConnectWait, 'c=s' => \$iClientName, 'e=i' => \$iExitAfter);
+
+ if (($iHelp) || (!defined @iDataSource) || (!defined $iConnectWait) || (!defined $iClientName))
+ {
+ &Usage();
+ } else {
+ foreach my $iMachine (@iDataSource)
+ {
+ &Usage() if ($iMachine !~ /^\S+:\d+/);
+ }
+ return(\@iDataSource, $iConnectWait, $iClientName, $iExitAfter, $iDebug);
+ }
+}
+
+# Usage
+#
+# Output Usage Information.
+#
+
+sub Usage {
+ print <<USAGE_EOF;
+
+ Usage: BuildClient.pl [options]
+
+USAGE_EOF
+print " Version: ".&BuildClient::GetClientVersion()."\n";
+print <<USAGE_EOF;
+
+ options:
+
+ -h help
+ -d Data Source - format Hostname:Port (e.g. Machine:1234) [Multiple allowed]
+ -w Seconds to wait between each connection attempt
+ -c Client name (Used to identify the machine in the logs, Must be unique)
+ -e Exit after specified number of successful connections [optional]
+ default to never exit
+USAGE_EOF
+ exit 1;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/BuildClient.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,417 @@
+# Copyright (c) 2003-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:
+#
+
+package BuildClient;
+
+use FindBin; # for FindBin::Bin
+use lib "$FindBin::Bin/lib/freezethaw"; # For FreezeThaw
+
+use strict;
+use Carp;
+use Msg;
+use FreezeThaw qw(freeze thaw);
+use Cwd 'chdir';
+use Compress::Zlib; # For compression library routines
+
+# Global Varibales
+my $gClientName;
+my ($gHiResTimer) = 0; #Flag - true (1) if HiRes Timer module available
+my ($gDebug) = 0;
+
+# Check if HiRes Timer is available
+if (eval "require Time::HiRes;") {
+ $gHiResTimer = 1;
+} else {
+ print "Cannot load HiResTimer Module\n";
+}
+
+
+# GetClientVersion
+#
+# Inputs
+#
+# Outputs
+# Client Version Number
+#
+# Description
+# This function returns the Client version number
+sub GetClientVersion
+{
+ return "1.3";
+}
+
+# rcvd_msg_from_server
+#
+# Inputs
+# $iConn (Instance of the Msg Module)
+# $msg (the recieved message from the server)
+# $err (any error message from the Msg Module)
+#
+# Outputs
+#
+# Description
+# This function processes the incoming message from the Build Server and acts upon them
+sub rcvd_msg_from_server {
+ my ($iConn, $msg, $err) = @_;
+
+ my ($iResults, $iChdir);
+
+ # if the message is empty or a "Bad file descriptor" error happens
+ # This usually means the the Build Server has closed the socket connection.
+ # The client is returned to trying to connect to a build server
+ if (($msg eq "") || ($err eq "Bad file descriptor"))
+ {
+ print "Server Disconnected\n";
+ return 0;
+ } elsif ($err ne "") {
+ print "Error is communication occured:$err\n";
+ return 0;
+ }
+
+ # Thaw the message, this decodes the text string sent from the server back into perl variables
+ my ($sub_name, $iID, $iStage, $iComp, $iCwd, $iCommandline) = thaw ($msg);
+
+ # The server has determined that this client is using a non-unique client name.
+ # The server has added a random number on to the client name to try and make it unique.
+ # The server send this new name back to the client, so the two are in sync.
+ if ($sub_name eq 'ChangeClientName')
+ {
+ print "ClientName changed to: $iID by the server\n";
+ $BuildClient::gClientName = $iID;
+ }
+
+ # The server sent and exit message to this client, so exit.
+ if ($sub_name eq 'Exit')
+ {
+ print "Server request the client to exit\n";
+ exit 0;
+ }
+
+ # If the command sent by the server is "SetEnv", call the SetEnv Function and respond to server when complete
+ if ($sub_name eq 'SetEnv')
+ {
+ &SetEnv($iID, $iStage);
+ # Prepare and send the "SetEnv Ready" message to the server with the client name
+ my $serialized_msg = freeze ("SetEnv Ready", $BuildClient::gClientName);
+ $iConn->transmit_immediately($serialized_msg);
+ } elsif ($sub_name eq 'Execute') {
+ # Process the "Execute" command
+ print "Executing ID ". ($iID+1) ." Stage $iStage\n";
+ # Add the client side per command start timestamp
+ &TimeStampStart(\$iResults);
+
+ eval {
+ no strict 'refs'; # Because we call the subroutine using
+ # a symbolic reference
+ # Change the working directory, first replacing the environment variables
+ $iCwd =~ s/%(\w+)%/$ENV{$1}/g;
+ $iCommandline =~ s/%(\w+)%/$ENV{$1}/g;
+ # If the changing of the working directory fails it will remain in the current directory
+ $iChdir = chdir "$iCwd";
+ # Don't execute the command if the changing of the working directory failed.
+ if ($iChdir)
+ {
+ # Log the directory change
+ print "Chdir $iCwd\n";
+ $iResults .= "Chdir $iCwd\n";
+ # Execute the "Execute" function, passing it the commandline to execute and collect the results
+ $iResults .= normalize_line_breaks(&{$sub_name} ($iCommandline));
+ } else {
+ $iResults .= "ERROR: Cannot change directory to $iCwd for $iComp\n";
+ }
+ # Add the client side per command end HiRes timestamp if available
+ &TimeStampEnd(\$iResults);
+ };
+
+ # Send an appropriate message back to the server, depending on error situation
+ if ($@ && $iChdir) { # Directory changed OK, but an error occurred subsequently
+ # Handle Generic errors
+ $msg = bless \$@, "RPC::Error\n";
+
+ # Freeze the perl variables into a text string to send to the server
+ $msg = freeze('Results', $BuildClient::gClientName, $iID, $iStage, $iComp, $iCwd, $iCommandline, Compress($msg));
+ } else { # Directory change failed OR no error at all.
+ # $iResults will contain the error string if changing working directories failed
+ # otherwise it will contain the output of the execution of the commandline
+ # Freeze the perl variables into a text string to send to the server
+ $msg = freeze('Results', $BuildClient::gClientName, $iID, $iStage, $iComp, $iCwd, $iCommandline, Compress($iResults));
+ }
+ # Send the message back to the server
+ $iConn->transmit_immediately($msg);
+
+ }
+}
+
+# normalize_line_breaks
+#
+# Inputs
+# $lines Text string which may consist of many lines
+#
+# Outputs
+# $lines Text string which may consist of many lines
+#
+# Description
+# This subroutine converts any Unix, Macintosh or other line breaks into the DOS/Windows CRLF sequence
+# Text in each line remains unchanged. Empty lines are discarded.
+sub normalize_line_breaks
+{
+ my $lines = '';
+ foreach my $line (split /\r|\n/, shift)
+ {
+ unless ($line) { next; } # Discard empty line
+ $lines .= "$line\n";
+ }
+ return $lines;
+}
+
+# Execute
+#
+# Inputs
+# @args
+#
+# Outputs
+# @results
+#
+# Description
+# This Executes the command in the args, must return and array
+# It combines STDERR into STDOUT
+sub Execute
+{
+ my (@iCommandline) = @_;
+
+ print "Executing '@iCommandline'\n";
+ if (! defined($BuildClient::gDebug))
+ {
+ return my $ireturn= `@iCommandline 2>&1`; # $ireturn is not used but ensures that a scalar is returned.
+ } else {
+ if ($BuildClient::gDebug ne "")
+ {
+ # Open log file for append, if cannot revert to STDOUT
+ open DEBUGLOG, ">>$BuildClient::gDebug" || $BuildClient::gDebug== "";
+ }
+ my $iResults;
+
+ print DEBUGLOG "Executing '@iCommandline'\n" if ($BuildClient::gDebug ne "");
+ open PIPE, "@iCommandline 2>&1 |";
+ while (<PIPE>)
+ {
+ if ($BuildClient::gDebug ne "")
+ {
+ print DEBUGLOG $_;
+ } else {
+ print $_;
+ }
+ $iResults .= $_;
+ }
+ close PIPE;
+ close DEBUGLOG if ($BuildClient::gDebug ne "");
+ return $iResults;
+ }
+}
+
+# SetEnv
+#
+# Inputs
+# @args
+#
+# Outputs
+#
+# Description
+# This function sets the local Environment.
+sub SetEnv
+{
+ my ($iKey, $iValue) = @_;
+
+ # Replace an environment Variable referenced using %Variable% with the contents of the Environment Variable
+ # This allows the use of one Environment Variable in another as long as it is already set
+ $iValue =~ s/%(\w+)%/$ENV{$1}/g;
+ print "Setting Environment Variable $iKey to $iValue\n";
+ $ENV{$iKey} = $iValue;
+}
+
+# Connect
+#
+# Inputs
+# $iDataSource - Reference to array of Hostname:Port of BuildServers to connect to)
+# $iConnectWait (How often it polls for a build server)
+# $iClientName (Client name used to help identify the machine, Must be unique)
+# $iDebug - Debug Option
+#
+# Outputs
+#
+# Description
+# This function connects to the BuildServer and reads commands to run
+
+sub Connect
+{
+ my ($iDataSource, $iConnectWait, $iClientName, $iExitAfter, $iDebug) = @_;
+
+ my ($iSuccessConnect);
+
+ # Set the Client name
+ $BuildClient::gClientName = $iClientName;
+ # Set Global Debug flag/filename
+ $BuildClient::gDebug = $iDebug;
+
+ # In continual loop try and connect to the datasource
+ while (($iExitAfter == -1) || ($iSuccessConnect < $iExitAfter))
+ {
+ # Cycle through the datasource list
+ my $iMachine = shift @$iDataSource;
+ push @$iDataSource, $iMachine;
+ print "Connecting to $iMachine\n";
+
+ # Process the datasource into hostname and port number
+ my ($iHostname,$iPort) = $iMachine =~ /^(\S+):(\d+)/;
+
+ # Create an instance of the message Module to handle the TCP/IP connection
+ my $iConn = Msg->associate($iPort, $iHostname, \&rcvd_msg_from_server);
+
+ # Check the status of the connection attempt
+ if ($iConn)
+ {
+ # Connection was succesful
+ print "Connection successful to $iMachine\n";
+ $iSuccessConnect++;
+ # Send a "Ready" command to the Server
+ my $serialized_msg = freeze ("Ready", $BuildClient::gClientName, &GetClientVersion);
+ print "Sending Ready\n";
+ $iConn->transmit_immediately($serialized_msg);
+ # Start the message processing loop with inital timeout of 300 seconds
+ Msg->result_iteration(300);
+ # Server disconnected, clean up by chdir to root
+ chdir "\\";
+ # Set the client name back to the name specified on the commandline just in case it has had it's name changed.
+ $BuildClient::gClientName = $iClientName;
+ } else {
+ # Connection Failed, wait specified time before continuing and trying another connection attempt
+ print "Could not connect to $iHostname:$iPort\n";
+ print "Trying another connection attempt in $iConnectWait seconds\n";
+ sleep $iConnectWait;
+ }
+ }
+}
+
+# TimeStampStart
+#
+# Inputs
+# $iData - Reference to variable to put the start time stamp
+#
+# Outputs
+#
+# Description
+# This places a timestamp in the logs
+sub TimeStampStart
+{
+ my $ref = shift;
+
+ # Add the client side per command start timestamp
+ $$ref = "++ Started at ".localtime()."\n";
+ # Add the client side per command start HiRes timestamp if available
+ if ($gHiResTimer == 1)
+ {
+ $$ref .= "+++ HiRes Start ".Time::HiRes::time()."\n";
+ } else {
+ # Add the HiRes timer unavailable statement
+ $$ref .= "+++ HiRes Time Unavailable\n";
+ }
+}
+
+# TimeStampEnd
+#
+# Inputs
+# $iData - Reference to variable to put the end time stamp
+#
+# Outputs
+#
+# Description
+# This places a timestamp in the logs
+sub TimeStampEnd
+{
+ my $ref = shift;
+
+ # Add the client side per command end HiRes timestamp if available
+ $$ref .= "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+ # Add the client side per command end timestamp
+ $$ref .= "++ Finished at ".localtime()."\n";
+}
+
+# Subroutine for compressing data stream.
+# Input: message to be compressed.
+# Output: compressed message, ready for sending.
+sub Compress($)
+{
+ my $msg = shift; # Get the message.
+
+ # Initialise deflation stream
+ my $x;
+ eval {$x = deflateInit() or die "Error: Cannot create a deflation stream\n";};
+
+ if($@) # Deflation stream creationg has failed.
+ {
+ return Compress("Error: creation of deflation stream failed: $@\n");
+ }
+
+ # Compress the message
+ my ($output, $status);
+ my ($output2, $status2);
+
+ # First attempt to perform the deflation
+ eval { ($output, $status) = $x -> deflate($msg); };
+
+ if($@) # Deflation has failed.
+ {
+ $x = deflateInit();
+ ($output, $status) = $x -> deflate("ERROR: Compression failed: $@\n");
+ ($output2, $status2) = $x -> flush();
+
+ return $output.$output2;
+ }
+
+ # Now attempt to complete the compression
+ eval { ($output2, $status2) = $x -> flush(); };
+
+ if($@) # Deflation has failed.
+ {
+ $x = deflateInit();
+ ($output, $status) = $x -> deflate("ERROR: Compression failed: $@\n");
+ ($output2, $status2) = $x -> flush();
+
+ return $output.$output2;
+ }
+
+ if($status != Z_OK) # Deflation has failed.
+ {
+ $x = deflateInit();
+ ($output, $status) = $x -> deflate("ERROR: Compression failed: $@\n");
+ ($output2, $status2) = $x -> flush();
+
+ return $output.$output2;
+ }
+
+ # Attempt to complete the compressions
+ if($status2 != Z_OK)
+ {
+ $x = deflateInit();
+ ($output, $status) = $x -> deflate("ERROR: Compression failed: $@\n");
+ ($output2, $status2) = $x -> flush();
+ return $output.$output2;
+ }
+
+ # Return the compressed output.
+ return $output . $output2;
+}
+
+1;
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/BuildServer.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,125 @@
+# Copyright (c) 2003-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:
+# Script to send commands to 1 or more Build Clients to perform parallel builds
+#
+#
+
+use strict;
+use FindBin; # for FindBin::Bin
+use Getopt::Long;
+use File::Copy;
+
+# Add the directory contain this perl script into the path to find modules
+use lib $FindBin::Bin;
+
+use BuildServer;
+use ParseXML;
+
+# Turn on per command Buffering of STDOUT, so the log files are not so far behind what is actually happening
+$| = 1;
+
+# Process the commandline
+my ($iDataSource, $iPort, $iLogFile, $iEnvSource, $iConnectionTimeout, $iSocketConnections) = ProcessCommandLine();
+
+# Create socket to server
+&BuildServer::Start($iDataSource, $iPort, $iLogFile, $iEnvSource, $iConnectionTimeout, $iSocketConnections);
+
+
+# ProcessCommandLine
+#
+# Inputs
+#
+# Outputs
+# $iPort (Port to listen on for Build Clients)
+#
+# Description
+# This function processes the commandline
+
+sub ProcessCommandLine {
+ my ($iHelp, @iPort, $iDataSource, $iLogFile, $iEnvSource, $iConnectionTimeout, $iSocketConnections);
+ GetOptions('h' => \$iHelp, 'd=s' =>\$iDataSource, 'p=i' => \@iPort, 'l=s' => \$iLogFile, 'e=s' =>\$iEnvSource, 't=s' =>\$iConnectionTimeout, 'c=s' =>\$iSocketConnections);
+
+ if (($iHelp) || (scalar(@iPort) < 0) || (!defined $iDataSource) || (!defined $iLogFile))
+ {
+ Usage();
+ } elsif (! -e $iDataSource) {
+ die "Cannot open $iDataSource";
+ }
+ if ((defined $iEnvSource) && (! -e $iEnvSource))
+ {
+ die "Cannot open $iEnvSource";
+ }
+
+ &backupFile($iLogFile) if (-e $iLogFile);
+
+ return($iDataSource,\@iPort,$iLogFile, $iEnvSource, $iConnectionTimeout, $iSocketConnections);
+}
+
+# backupFile
+#
+# Inputs
+# $iFile - filename to backup
+#
+# Outputs
+#
+# Description
+# This function renames a file with the .baknn extension
+sub backupFile
+{
+ my ($iFile) = @_;
+
+ my ($iBak) = $iFile.".bak";
+ my ($i, $freefilename);
+ # Loop until you find a free file name by increamenting the number on the end of the .bak extension
+ while (!$freefilename)
+ {
+ if (-e $iBak.$i)
+ {
+ $i++;
+ } else {
+ $iBak .= $i;
+ $freefilename = 1;
+ }
+ }
+ print "WARNING: $iFile already exists, creating backup of orignal with new name of $iBak\n";
+ move($iFile,$iBak) or die "Could not backup $iFile to $iBak because of: $!\n";
+}
+
+# Usage
+#
+# Output Usage Information.
+#
+
+sub Usage {
+ print <<USAGE_EOF;
+
+ Usage: BuildServer.pl [options]
+
+USAGE_EOF
+print " Version: ".&BuildServer::GetServerVersion()."\n";
+print <<USAGE_EOF;
+
+ options:
+
+ -h help
+ -p Port number to listen on for Build Clients [Multiple allowed]
+ -t Time between connection attempts [Optional - default 0 seconds]
+ -c Number of connection attempts per port [Optional - default infinite]
+ -d Data Source (XML command file)
+ -l Log file for output from commands run on the Build Client
+ -e Use Environment of this data source (XML command file)
+ The Environment in the main data source takes precedence
+USAGE_EOF
+ exit 1;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/BuildServer.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,582 @@
+# Copyright (c) 2003-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:
+#
+
+package BuildServer;
+
+use strict;
+
+use FindBin; # for FindBin::Bin
+use lib "$FindBin::Bin/lib/freezethaw"; # For FreezeThaw
+
+# Other necessary modules. For "use Scanlog;" see dynamic code below.
+use Carp;
+use Msg;
+use ParseXML;
+use FreezeThaw qw(freeze thaw);
+use IO::File;
+use File::Basename;
+use File::Copy;
+use Compress::Zlib; # For decompression library routines
+
+
+# Globals
+my @gCommands; # Holds the parsed "Execute" data from the XML file.
+my @gSetEnv; # Holds the parsed "SetEnv" data from the XML file.
+my $gIDCount = 0; # The current Execute ID we're processing.
+my $gStage; # The current Stage we're in.
+my %gClientEnvNum; # Holds the current index into @gSetEnv for each client. Indexed by client name.
+my %gClientStatus; # Holds the status of each client. Indexed by client name.
+my %gClientHandles; # Holds the socket of each client. Indexed by client name
+my $gLogFileH; # The logfile.
+my $gLogStarted = 0; # Boolean to say if the logfile has been started.
+my $gRealTimeError = ""; # "" = No error, otherwise a string significant to AutoBuild's log parsing
+my $gScanlogAvailable = 0; # Boolean to say if scanlog is available.
+my $gExit = 0; # 0 = FALSE (Do not exit) # 1 = TRUE (Send Exit to all clients for next command)
+
+
+
+# Check if HiRes Timer is available
+my ($gHiResTimer) = 0; #Flag - true (1) if HiRes Timer module available
+if (eval "require Time::HiRes;") {
+ $gHiResTimer = 1;
+} else {
+ print "Cannot load HiResTimer Module\n";
+}
+
+
+# Check if Scanlog.pm is available.
+# In the Perforce order of things, scanlog.pm is in directory ".\scanlog" relative to BuildServer.pl
+# However, at build time, BuildServer.pl is in "\EPOC32\Tools\Build" while scanlog.pm is in "\EPOC32\Tools"
+# i.e. in the parent directory relative to BuildServer.pl
+# If Scanlog cannot be found in either place, we continue, but the Scanlog functionality will be skipped.
+if (eval {require scanlog::Scanlog;})
+ {
+ $gScanlogAvailable = 1;
+ }
+elsif (eval {use lib $FindBin::Bin.'/..'; require Scanlog;})
+ {
+ $gScanlogAvailable = 1;
+ }
+else
+ {
+ print "Cannot load Scanlog Module\n";
+ }
+
+# GetServerVersion
+#
+# Inputs
+#
+# Outputs
+# Server Version Number
+#
+# Description
+# This function returns the server version number
+sub GetServerVersion
+{
+ return "1.3";
+}
+
+# rcvd_msg_from_client
+#
+# Inputs
+# $iConn (Instance of the Msg Module)
+# $msg (the recieved message from the client)
+# $err (any error message from the Msg Module)
+#
+# Outputs
+#
+# Description
+# This function processes the incoming message from the BuildClient and acts upon them
+sub rcvd_msg_from_client {
+ my ($iConn, $msg, $err) = @_;
+
+ # If the message is empty or a "Bad file descriptor" error happens then it
+ # usually means the the BuildServer has closed the socket connection.
+ # The BuildClient will keep trying to connect to a BuildServer
+ if (($msg eq "") || ($err eq "Bad file descriptor"))
+ {
+ print "A client has probably Disconnected\n";
+ croak "ERROR: Cannot recover from Error: $err\n";
+ }
+
+ # Thaw the message, this decodes the text string sent from the client back into perl variables
+ my ($iCommand, $iClientName, $iID, $iStage, $iComp, $iCwd, $iCommandline, $args) = thaw ($msg);
+
+ # Handle a "Ready" command. A client wishes to connect.
+ if ( $iCommand eq "Ready")
+ {
+ # Check the Client Version. $iID holds the client version in the "Ready" message.
+ if ($iID ne &GetServerVersion)
+ {
+ die "ERROR: Client version \"$iID\" does not match Server version \"".&GetServerVersion."\", cannot continue\n";
+ }
+ # Handle the initial "Ready" Command from the client
+ # Check that the Client name is unique
+ if (defined $gClientHandles{$iClientName})
+ {
+ # The Client name is not unique, a client by this name has already connected
+ warn "WARNING: Multiple Clients using the same name\n";
+ warn "Adding random number to client name to try and make it unique\n";
+ warn "This will affect the preference order of the Clients\n";
+ # Generate a ramdom number to add to the client name.
+ my ($iRNum) = int(rand 10000000);
+ $iClientName .= $iRNum;
+ print "Changing ClientName to \"$iClientName\"\n";
+ # Send the new Client name to the client
+ my $iMsg = freeze("ChangeClientName", $iClientName);
+ $iConn->transmit_immediately($iMsg);
+ }
+
+ # Add the connection object to the store of connections
+ $gClientHandles{$iClientName} = $iConn;
+
+ # Write the header to the logfile on first connection only
+ if ( $gLogStarted == 0)
+ {
+ # The start of the log file only needs to be printed once
+ $gLogStarted = 1;
+ &PrintStageStart;
+ }
+
+ # Set Environment Variable counter to zero
+ # This client has not been sent any environment variables yet
+ $gClientEnvNum{$iClientName} = 0;
+ # Set the $iCommand variable so that we begin sending Environment Variables
+ $iCommand = "SetEnv Ready";
+ }
+
+ # Handle the "SetEnv Ready" command. The client is ready for a command or env var.
+ if ( $iCommand eq "SetEnv Ready")
+ {
+ # If there are any environment variables to be set, send the next one to the client to set it
+ if (defined $gSetEnv[$gClientEnvNum{$iClientName}])
+ {
+ &Send_SetEnv($iConn, $gClientEnvNum{$iClientName});
+ $gClientEnvNum{$iClientName}++;
+ } else {
+ # The client has gone through the connect process and has been sent all its environment variables
+ # Add this client to the list of client ready to process commands
+ AddReady($iClientName, $iConn);
+ }
+ }
+
+ # Handle the "Results" command. The client has finished a step and given us the results.
+ if ( $iCommand eq "Results")
+ {
+ $args = Decompress($args); # Decompress the results.
+
+ # If Scanlog has been found, check returned text for real time error string.
+ # If a client reports a real time error, set global flag. We can't just die here and
+ # now; instead we must wait for other "busy" clients to finish their current tasks.
+ if ($gScanlogAvailable)
+ {
+ if (Scanlog::CheckForRealTimeErrors($args))
+ {
+ # Command returned a RealTimeBuild error - abort this script,
+ # and propagate it up to our parent process
+ $gRealTimeError = "RealTimeBuild:";
+ }
+ elsif ($gCommands[$iID]{'ExitOnScanlogError'} =~ /y/i && Scanlog::CheckForErrors($args) )
+ {
+ # This is a critical step - flag a real time error,
+ # and don't process anything else in this script
+ $gRealTimeError = "Realtime error (ExitOnScanlogError)";
+ }
+ }
+
+ # Print the correct headers for an individual command to the log
+ print $gLogFileH "=== Stage=$gStage == $iComp\n";
+ print $gLogFileH "-- $iCommandline\n";
+ print $gLogFileH "--- $iClientName Executed ID ".($iID+1)."\n";
+ # Print the output of the command into the log
+ print $gLogFileH "$args";
+ # Flush the handle to try and make sure the logfile is up to date
+ $gLogFileH->flush;
+ # Add this client to the list of client ready to process commands
+ AddReady($iClientName, $iConn);
+ }
+}
+
+# Send_SetEnv
+#
+# Inputs
+# $iOrder - index into @gSetEnv
+#
+# Outputs
+# Sends frozen SetEnv message
+#
+# Description
+# This function is used to produce frozen SetEnv messages from the hash and then sends its
+sub Send_SetEnv
+{
+ my ($iConn, $iOrder) = @_;
+
+ my $iName = $gSetEnv[$iOrder]{'Name'};
+ my $iValue = $gSetEnv[$iOrder]{'Value'};
+
+ my $iMsg = freeze ('SetEnv', $iName, $iValue);
+
+ $iConn->transmit_immediately($iMsg);
+}
+
+
+# login_proc
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function can be used to process a login procedure
+# No login procedure is implemented
+sub login_proc {
+ # Unconditionally accept
+ \&rcvd_msg_from_client;
+}
+
+# Start
+#
+# Inputs
+# $iDataSource (XML Command file)
+# $iPort (Port number to listen on for Build Clients)
+# $iLogFile (Logfile to write output from Build Clients to)
+#
+# Outputs
+#
+# Description
+# This function starts the server
+
+sub Start
+{
+ my ($iDataSource, $iPort, $iLogFile, $iEnvSource, $iConnectionTimeout, $iSocketConnections) = @_;
+
+ my ($iHost) = '';
+
+ # Open the log file for writing, it will not overwrite logs
+ $gLogFileH = IO::File->new("> $iLogFile")
+ or croak "ERROR: Couldn't open \"$iLogFile\" for writing: $!\n";
+
+ # If $iEnvSource is defined the Environment needs to be processed from this file
+ if (defined $iEnvSource)
+ {
+ # Parse the XML data
+ my ($iCommands, $iSetEnv) = &ParseXML::ParseXMLData($iEnvSource);
+ push @gSetEnv, @$iSetEnv;
+ }
+
+ # Parse the XML data
+ my ($iCommands, $iSetEnv) = &ParseXML::ParseXMLData($iDataSource);
+ push @gCommands, @$iCommands;
+ push @gSetEnv, @$iSetEnv;
+
+ # Assuming there are commands to be executed, initialise the "current stage"
+ # variable with the stage of the first command
+ $gStage = $gCommands[$gIDCount]{'Stage'} if (scalar @gCommands);
+
+ # Create the TCP/IP listen socket
+ Msg->recent_agent($iPort, $iHost, \&login_proc, $iConnectionTimeout, $iSocketConnections);
+ print "BuildServer created. Waiting for BuildClients\n";
+ # Enter event loop to process incoming connections and messages
+ Msg->result_iteration();
+}
+
+
+# SendCommand
+#
+# Inputs
+# $iConn - the socket to use
+# $iID - the ID of the command
+#
+# Outputs
+# Command or file or file request sent via TCP connection
+#
+# Description
+# Sends the command or file or file request indexed by $iID to the client
+sub SendCommand
+{
+ my ($iConn, $iID) = @_;
+
+ my $msg;
+ my $iData;
+
+ $msg = freeze ($gCommands[$iID]{'Type'}, $iID, $gCommands[$iID]{'Stage'}, $gCommands[$iID]{'Component'}, $gCommands[$iID]{'Cwd'}, $gCommands[$iID]{'CommandLine'});
+
+
+ $iConn->transmit_immediately($msg);
+}
+
+
+# AddReady
+#
+# Inputs
+# $iClientName (Client name)
+# $iConn (Connection Object)
+#
+# Outputs
+#
+# Description
+# This function adds the client defined by the connection ($iConn) to the list of ready clients
+# It also sends new commands to clients if apropriate
+sub AddReady
+{
+ my ($iClientName, $iConn) = @_;
+
+ my @iClientsWaiting;
+
+ # Set the client status to the "Waiting" State
+ $gClientStatus{$iClientName} = "Waiting";
+
+ # If the next command is Exit set global Exit flag
+ if (defined $gCommands[$gIDCount])
+ {
+ $gExit = 1 if ($gCommands[$gIDCount]{'Type'} eq "Exit");
+ }
+
+ # Add the all "Waiting" clients to a list of waiting Clients
+ foreach my $iClient (keys %gClientStatus)
+ {
+ push @iClientsWaiting, $iClient if ($gClientStatus{$iClient} eq "Waiting");
+ }
+
+ # Are all the clients waiting?
+ if (scalar @iClientsWaiting == $iConn->AllAssociations)
+ {
+ # Everyone has finished. Everyone is waiting. One of 3 things has happened:
+ # - There has been a realtime error.
+ # - All commands have been run.
+ # - We have come to the end of the current stage.
+ # - There is only one client, and it has further commands in the current stage.
+
+ if ($gRealTimeError)
+ {
+ &PrintStageEnd;
+
+ print $gLogFileH "ERROR: $gRealTimeError BuildServer terminating\n";
+ close ($gLogFileH);
+ die "ERROR: $gRealTimeError BuildServer terminating\n";
+ }
+
+ # If all other clients waiting for a command and an exit pending
+ # Send Messages to all clients (not just current) to exit their procees
+ # No return is expected so exit the buildserver process
+ if ($gExit)
+ {
+ # Close up log nicely
+ &PrintStageEnd;
+ foreach my $key (keys %gClientHandles)
+ {
+ my $msg = freeze ("Exit");
+ $gClientHandles{$key}->transmit_immediately($msg);
+ }
+ exit 0;
+ }
+
+ if (!defined $gCommands[$gIDCount])
+ {
+ # All commands have been run. There are no more commands.
+ &PrintStageEnd;
+
+ print "No more stages\n";
+ close ($gLogFileH);
+ # Exit successfully
+ exit 0;
+ }
+
+ if ( !defined $gStage || # the last command had no stage set
+ $gStage eq '' || # the last command had no stage set
+ $gStage != $gCommands[$gIDCount]{'Stage'} # the last command's stage is different to the next command's stage
+ )
+ {
+ # We've successfully reached the end of a stage
+ &PrintStageEnd;
+
+ # Update the current stage variable to be the stage of the next command
+ $gStage = $gCommands[$gIDCount]{'Stage'};
+
+ &PrintStageStart;
+ }
+ }
+
+ # If the next command is the first in a stage then all clients are waiting.
+
+ # Below this point we are approaching the command sending section.
+ # Other clients could be working on previous commands at this point.
+
+ # If the next command can not be run in parallel with the previous command
+ # and another client is executing the previous command, then we should
+ # return and simply wait for the other client to finish.
+
+ # Don't issue anymore commands if there is an exit pending
+ return if ($gExit);
+
+ # Don't issue anymore commands if there has been a realtime error.
+ return if ($gRealTimeError);
+
+ # Sort the waiting clients alphabetically
+ @iClientsWaiting = sort(@iClientsWaiting);
+ # Extract the first client name
+ my $iClient = shift @iClientsWaiting;
+
+ # Check if there are commands and clients available
+ while (defined $gCommands[$gIDCount] and defined $iClient)
+ {
+ # Check if the next command's stage is different to the current stage.
+ # They will be identical if we are running the first command in a stage.
+ # They will also be identical if we are running a subsequent command in the same stage.
+ # So if they are different it means the next command is in a different stage.
+ # Therefore we want to return and wait until all other clients have finished before
+ # sending this command.
+ return if ($gStage ne $gCommands[$gIDCount]{'Stage'});
+
+ # Check to make sure a Exit command is not sent to 1 of multiple clients if Exit was not in it's own stage
+ return if ($gCommands[$gIDCount]{'Type'} eq "Exit");
+
+ # If at least one client is doing some work, and both the previous and next
+ # commands' stages are not set, just wait until the working client finishes.
+ # So we treat two steps with no stage name as though a stage change has occurred between them.
+ if ((!defined $gCommands[$gIDCount-1]{'Stage'} or '' eq $gCommands[$gIDCount-1]{'Stage'}) and
+ (!defined $gCommands[$gIDCount]{'Stage'} or '' eq $gCommands[$gIDCount]{'Stage'}) )
+ {
+ foreach my $status (values %gClientStatus)
+ {
+ return if ($status ne 'Waiting');
+ }
+ }
+
+ print "Sending Step ". ($gIDCount+1) ." to $iClient\n";
+
+ # Set client as "Busy" and then send the command
+ $gClientStatus{$iClient} = "Busy";
+ &SendCommand($gClientHandles{$iClient}, $gIDCount);
+ $gIDCount++;
+
+ # Extract the next client name
+ $iClient = shift @iClientsWaiting;
+ }
+}
+
+sub PrintStageStart
+{
+ # Output to log that the Stage has started
+ print $gLogFileH "===-------------------------------------------------\n";
+ print $gLogFileH "=== Stage=$gStage\n";
+ print $gLogFileH "===-------------------------------------------------\n";
+ print $gLogFileH "=== Stage=$gStage started ".localtime()."\n";
+
+ # Flush the handle to try and make sure the logfile is up to date
+ $gLogFileH->flush;
+}
+
+sub PrintStageEnd
+{
+ print "Stage End $gStage\n";
+
+ # Output to the log that the Stage has finished
+ print $gLogFileH "=== Stage=$gStage finished ".localtime()."\n";
+ # Flush the handle to try and make sure the logfile is up to date
+ $gLogFileH->flush;
+}
+
+# TimeStampStart
+#
+# Inputs
+# $iData - Reference to variable to put the start time stamp
+#
+# Outputs
+#
+# Description
+# This places a timestamp in the logs
+sub TimeStampStart
+{
+ my $ref = shift;
+
+ # Add the client side per command start timestamp
+ $$ref = "++ Started at ".localtime()."\n";
+ # Add the client side per command start HiRes timestamp if available
+ if ($gHiResTimer == 1)
+ {
+ $$ref .= "+++ HiRes Start ".Time::HiRes::time()."\n";
+ } else {
+ # Add the HiRes timer unavailable statement
+ $$ref .= "+++ HiRes Time Unavailable\n";
+ }
+}
+
+# TimeStampEnd
+#
+# Inputs
+# $iData - Reference to variable to put the end time stamp
+#
+# Outputs
+#
+# Description
+# This places a timestamp in the logs
+sub TimeStampEnd
+{
+ my $ref = shift;
+
+ # Add the client side per command end HiRes timestamp if available
+ $$ref .= "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+ # Add the client side per command end timestamp
+ $$ref .= "++ Finished at ".localtime()."\n";
+}
+
+# Subroutine for decompressing data stream.
+# Input: message to be decompressed.
+# Output: decompressed message.
+# Note: here, when decompression is taking place, usually a complete message
+# is passed as the input parameter; in this case Z_STREAM_END is the
+# returned status. If an empty message is decompressed (e.g. because ""
+# was sent) Z_OK is returned.
+sub Decompress($)
+{
+ my $msg = shift; # Get the message.
+
+ # Initialise deflation stream
+ my ($x, $init_status);
+ eval { ($x, $init_status) = inflateInit() or die "Cannot create an inflation stream\n"; };
+
+ if($@) # Inflation initialisation has failed.
+ {
+ return "ERROR: Decompression initialisation failed: $@\nERROR: zlib error message: ", $x->msg(), "\n";
+ }
+
+ # Some other failure?
+ if($init_status != Z_OK and !defined($x))
+ {
+ return "ERROR: Decompression initialisation failed: $init_status\n";
+ }
+
+ # Decompress the message
+ my ($output, $status);
+ eval { ($output, $status) = $x->inflate(\$msg) or die "ERROR: Unable to decompress message"; };
+
+ if($@) # Failure of decompression
+ {
+ return "ERROR: unable to decompress: $@\n";
+ }
+
+ # Some other failure?
+ if($status != Z_STREAM_END and $status != Z_OK)
+ {
+ my $error = $x->msg();
+ return "ERROR: Decompression failed: $error\n";
+ }
+
+ # Return the decompressed output.
+ return $output;
+}
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/GenBuild.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,850 @@
+# Copyright (c) 2003-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:
+#
+
+package GenBuild;
+
+use strict;
+use Carp;
+use IO::File;
+
+# Global Variables
+
+my @components;
+my $iIDCount;
+my $iStageCount;
+my %arm_assplist;
+my $savespace="";
+my $keepgoing="";
+my $build_tools=0;
+my $build_cwtools=0;
+my $build_winc=0;
+my $build_thumb=0;
+my $build_armi=0;
+my $build_arm4=0;
+my $build_arm4t=0;
+my $build_armv5=0;
+my $build_arm3=0;
+my $epoc_only=0;
+my $build_winscw=0;
+my $build_wins=0;
+my $build_bootstrap;
+my $basename;
+my $iSourceDir;
+my $build_UREL=0;
+my $build_UDEB=0;
+my $build_urel_udeb="";
+my $build_test=0;
+
+my ($XMLFileH, $gLogFileH);
+
+my ($gHiResTimer) = 0; #Flag - true (1) if HiRes Timer module available
+
+# Check if HiRes Timer is available
+if (eval "require Time::HiRes;") {
+ $gHiResTimer = 1;
+} else {
+ print "Cannot load HiResTimer Module\n";
+}
+
+sub Start
+{
+ my ($iDataSource, $iDataOutput, $iLogFile, $iSourceDir, $iReallyClean, $iClean) = @_;
+
+ # Copied from genbuild.pl
+
+ # Check for EPOCROOT
+ # It's not used directly by GENBUILD, but this is a good early stage at which
+ # to discover that it hasn't been set...
+
+ 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 not include a drive letter\n" if ($epocroot =~ /^.:/);
+ die "ERROR: EPOCROOT must be an absolute path without 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);
+
+ # $iSourceDir must en in a \
+ # Add a \ if not present
+ if ($iSourceDir !~ /\\$/)
+ {
+ $iSourceDir .= "\\";
+ }
+
+ for(my $j = 0; $j < scalar(@$iDataSource); $j++)
+ {
+ $GenBuild::basename .= " " if ($j > 0);
+ my ($iFile) = @$iDataSource[$j] =~ m#.*([\\\/]|^)(.*?)\..*$#;
+ $GenBuild::basename .= @$iDataSource[$j];
+ }
+
+ #Set the global iSourceDir
+ $GenBuild::iSourceDir = $iSourceDir;
+
+ # Open Log file
+ $GenBuild::gLogFileH = IO::File->new("> $iLogFile")
+ or croak "Couldn't open $iLogFile for writing: $!\n";
+
+ print $GenBuild::gLogFileH "===-------------------------------------------------\n";
+ print $GenBuild::gLogFileH "=== Genxml\n";
+ print $GenBuild::gLogFileH "===-------------------------------------------------\n";
+ print $GenBuild::gLogFileH "=== Genxml started ".localtime()."\n";
+
+ for(my $j = 0; $j < scalar(@$iDataSource); $j++)
+ {
+ # Open DataSource
+ my ($iFile) = @$iDataSource[$j];
+ open FILE, "< $iFile" or die "Can't read $iFile\n";
+
+ print $GenBuild::gLogFileH "=== Genxml == $iFile\n";
+
+ print $GenBuild::gLogFileH "-- Genxml\n";
+ # Add the per command start timestamp
+ print $GenBuild::gLogFileH "++ Started at ".localtime()."\n";
+ # Add the per command start HiRes timestamp if available
+ if ($gHiResTimer == 1)
+ {
+ print $GenBuild::gLogFileH "+++ HiRes Start ".Time::HiRes::time()."\n";
+ } else {
+ # Add the HiRes timer missing statement
+ print $GenBuild::gLogFileH "+++ HiRes Time Unavailable\n";
+ }
+
+ # Process the Txt file in the same manner as the old genbuild
+ # Note:
+ # Additional options 'udeb', 'urel' and 'test' were added in response
+ # to a specific request, but are not otherwise supported by Symbian.
+ while (<FILE>)
+ {
+ s/\s*#.*$//;
+ s/^\s*//;
+ my $line = lc $_;
+ if ($line =~ /^$/)
+ {
+ next;
+ }
+
+ if ($line =~ /<option (\w+)\s*(.*)>/)
+ {
+ my $option = $1;
+ my $optargs= $2;
+ if ($option =~ "savespace")
+ {
+ $GenBuild::savespace = "-savespace";
+ next;
+ }
+ if ($option =~ "keepgoing")
+ {
+ $GenBuild::keepgoing = "-keepgoing";
+ next;
+ }
+ if ($option =~ "tools")
+ {
+ $GenBuild::build_tools = 1;
+ next;
+ }
+ if ($option eq "cwtools")
+ {
+ $GenBuild::build_cwtools = 1;
+ next;
+ }
+ if ($option =~ "winc")
+ {
+ $GenBuild::build_winc = 1;
+ next;
+ }
+
+ # Do not build winc, wins or winscw
+ if ($option =~ "epoconly")
+ {
+ $GenBuild::build_winc = 0;
+ $GenBuild::epoc_only = 1;
+ next;
+ }
+ if ($option =~ "thumb")
+ {
+ $GenBuild::build_thumb = 1;
+ next;
+ }
+
+ # ARMI option
+ if ($option =~ "armi")
+ {
+ $GenBuild::build_armi = 1;
+ next;
+ }
+
+ # ARM4
+ if ($option eq "arm4")
+ {
+ $GenBuild::build_arm4 = 1;
+ next;
+ }
+
+ # ARM4T
+ if ($option eq "arm4t")
+ {
+ $GenBuild::build_arm4t = 1;
+ next;
+ }
+
+ # ARMv5
+ if ($option =~ "armv5")
+ {
+ $GenBuild::build_armv5 = 1;
+ next;
+ }
+
+ if ($option =~ "arm3")
+ {
+ $GenBuild::build_arm3 = 1;
+ next;
+ }
+
+ # Use Visual Studio
+ if ($option eq "wins")
+ {
+ $GenBuild::build_wins = 1;
+ next;
+ }
+
+ # Use CodeWarrior
+ if ($option eq "winscw")
+ {
+ $GenBuild::build_winscw = 1;
+ next;
+ }
+
+ if ($option eq "udeb")
+ {
+ $GenBuild::build_UDEB = 1;
+ next;
+ }
+
+ if ($option eq "urel")
+ {
+ $GenBuild::build_UREL = 1;
+ next;
+ }
+
+ if ($option eq "test")
+ {
+ $GenBuild::build_test = 1;
+ next;
+ }
+
+ if ($option =~ "arm_assp")
+ {
+ $GenBuild::arm_assplist{$optargs} = 1;
+ next;
+ }
+
+
+ print "Option $1 not yet implemented\n";
+ next;
+ }
+ if ($line =~ /^([^<]\S+)\s+(\S+)/)
+ {
+ if (!-e "$GenBuild::iSourceDir$2\\bld.inf")
+ {
+ print $GenBuild::gLogFileH "MISSING COMPONENT $1: can't find $GenBuild::iSourceDir$2\\bld.inf\n";
+ next;
+ }
+ }
+ if ($line =~ /<special bldfiles e32toolp group>/)
+ {
+ # Handle Special
+ $GenBuild::build_bootstrap = 1;
+ next;
+ }
+
+ push @GenBuild::components, $line;
+ }
+
+ close(FILE);
+ # Add the per command end HiRes timestamp if available
+ print $GenBuild::gLogFileH "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+ # Add the per command end timestamp
+ print $GenBuild::gLogFileH "++ Finished at ".localtime()."\n";
+ }
+
+ print $GenBuild::gLogFileH "=== Genxml == Output\n";
+
+ print $GenBuild::gLogFileH "-- Genxml\n";
+ # Add the per command start timestamp
+ print $GenBuild::gLogFileH "++ Started at ".localtime()."\n";
+ # Add the per command start HiRes timestamp if available
+ if ($gHiResTimer == 1)
+ {
+ print $GenBuild::gLogFileH "+++ HiRes Start ".Time::HiRes::time()."\n";
+ } else {
+ # Add the HiRes timer missing statement
+ print $GenBuild::gLogFileH "+++ HiRes Missing\n";
+ }
+
+ &PBuildLevels($iDataOutput);
+
+ # Generate additional ReallyClean and Clean XML files if required
+ &GenReallyClean($iReallyClean) if (defined $iReallyClean);
+ &GenClean($iClean) if (defined $iClean);
+
+ # Close file handles
+ close($GenBuild::gLogFileH);
+
+}
+
+# PBuildLevels
+#
+# Inputs
+# $iDataOutput - Filename for normal build xml
+#
+# Outputs
+#
+# Description
+# This function generates a xml file to run normal buildon all components
+sub PBuildLevels
+{
+ my ($iDataOutput) = @_;
+ # Print the XML file
+ $GenBuild::XMLFileH = IO::File->new("> $iDataOutput")
+ or croak "Couldn't open $iDataOutput for writing: $!\n";
+
+ $GenBuild::iIDCount = 1;
+ $GenBuild::iStageCount = 1;
+
+ my ($epocroot) = $ENV{'EPOCROOT'};
+
+ &PrintXMLHeader($GenBuild::XMLFileH);
+
+ if (($GenBuild::build_UREL) && (!$GenBuild::build_UDEB))
+ {
+ $GenBuild::build_urel_udeb = " UREL";
+ }
+ elsif ((!$GenBuild::build_UREL) && ($GenBuild::build_UDEB))
+ {
+ $GenBuild::build_urel_udeb = " UDEB";
+ }
+
+ if ($GenBuild::build_bootstrap)
+ {
+ # Do the BootStrapping
+ # Temporary workaround for non-common code between old setup and Beech
+ # Defaults to old setup
+ # This will be removed when final functionality is added
+ if ($ENV{'Platform'} eq 'beech')
+ {
+ print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{beech\\generic\\tools\\e32toolp\\group" CommandLine="setupprj.bat"/>\n};
+ } elsif ($ENV{'Platform'} eq 'cedar') {
+ print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{os\\buildtools\\sbsv1_os\\e32toolp\\group" CommandLine="setupprj.bat"/>\n};
+ } else {
+ print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{tools\\e32toolp\\group" CommandLine="setupprj.bat"/>\n};
+ }
+ $GenBuild::iIDCount++;
+ $GenBuild::iStageCount++;
+ # Temporary workaround for non-common code between old setup and Beech
+ # Defaults to old setup
+ # This will be removed when final functionality is added
+ if ($ENV{'Platform'} eq 'beech')
+ {
+ print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{beech\\generic\\tools\\e32toolp\\group" CommandLine="bld.bat rel"/>\n};
+ } elsif ($ENV{'Platform'} eq 'cedar') {
+ print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{os\\buildtools\\sbsv1_os\\e32toolp\\group" CommandLine="bld.bat rel"/>\n};
+ } else {
+ print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{tools\\e32toolp\\group" CommandLine="bld.bat rel"/>\n};
+ }
+ $GenBuild::iIDCount++;
+ $GenBuild::iStageCount++;
+ }
+
+ &BuildLevels("0", "bldmake bldfiles $GenBuild::keepgoing");
+ $GenBuild::iStageCount++;
+ &BuildLevels("0", "abld export $GenBuild::keepgoing");
+ &BuildLevels("0", "abld test export $GenBuild::keepgoing") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+
+ if ($GenBuild::build_tools)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "tools");
+ $GenBuild::iStageCount++;
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "tools");
+ &BuildLevels("1", "abld target $GenBuild::keepgoing $GenBuild::savespace", "tools", "rel");
+ &BuildLevels("0", "abld -what build", "tools", "rel");
+ &BuildLevels("0", "abld -check build", "tools", "rel");
+ $GenBuild::iStageCount++;
+ }
+
+ if ($GenBuild::build_cwtools)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "cwtools");
+ $GenBuild::iStageCount++;
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "cwtools");
+ &BuildLevels("1", "abld target $GenBuild::keepgoing $GenBuild::savespace", "cwtools", "rel");
+ &BuildLevels("0", "abld -what build", "cwtools", "rel");
+ &BuildLevels("0", "abld -check build", "cwtools", "rel");
+ $GenBuild::iStageCount++;
+ }
+
+ if ($GenBuild::build_winc)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "winc");
+ $GenBuild::iStageCount++;
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "winc");
+ &BuildLevels("1", "abld target $GenBuild::keepgoing $GenBuild::savespace", "winc");
+ &BuildLevels("0", "abld -what build", "winc");
+ &BuildLevels("0", "abld -check build", "winc");
+ $GenBuild::iStageCount++;
+
+ }
+
+ unless ($epoc_only)
+ {
+ # Emulator things, WINS, up to resources
+ if ($GenBuild::build_wins)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "wins");
+ &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "wins") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ &BuildLevels("1", "abld resource $GenBuild::keepgoing", "wins$GenBuild::build_urel_udeb");
+ &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "wins$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "wins");
+ &BuildLevels("1", "abld test library $GenBuild::keepgoing", "wins") if ($GenBuild::build_test);
+ }
+
+ # Emulator things, WINSCW, up to resources
+ if ($GenBuild::build_winscw)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "winscw");
+ &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "winscw") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ &BuildLevels("1", "abld resource $GenBuild::keepgoing", "winscw$GenBuild::build_urel_udeb");
+ &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "winscw$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "winscw");
+ &BuildLevels("1", "abld test library $GenBuild::keepgoing", "winscw") if ($GenBuild::build_test);
+ }
+ }
+ # Arm Stuff
+ if ($GenBuild::build_arm4)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "arm4");
+ &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "arm4") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ }
+ if ($GenBuild::build_arm4t)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "arm4t");
+ &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "arm4t") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ }
+ if ($GenBuild::build_armv5)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "armv5");
+ &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "arm5") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ }
+ if ($GenBuild::build_armi)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "armi");
+ &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "armi") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ }
+ if ($GenBuild::build_thumb)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "thumb");
+ &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "thumb") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ }
+ if ($GenBuild::build_arm3)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "arm3");
+ &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "arm3") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ }
+ foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+ {
+ &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", $iAssp);
+ &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", $iAssp) if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ }
+
+ &BuildLevels("1", "abld resource $GenBuild::keepgoing", "arm4$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4);
+ &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "arm4$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld resource $GenBuild::keepgoing", "arm4t$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4t);
+ &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "arm4t$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld resource $GenBuild::keepgoing", "armv5$GenBuild::build_urel_udeb") if ($GenBuild::build_armv5);
+ &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "armv5$GenBuild::build_urel_udeb") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld resource $GenBuild::keepgoing", "armi$GenBuild::build_urel_udeb") if ($GenBuild::build_armi);
+ &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "armi$GenBuild::build_urel_udeb") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld resource $GenBuild::keepgoing", "thumb$GenBuild::build_urel_udeb") if ($GenBuild::build_thumb);
+ &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "thumb$GenBuild::build_urel_udeb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld resource $GenBuild::keepgoing", "arm3$GenBuild::build_urel_udeb") if ($GenBuild::build_arm3);
+ &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "arm3$GenBuild::build_urel_udeb") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+
+ foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+ {
+ &BuildLevels("1", "abld resource $GenBuild::keepgoing", "$iAssp$GenBuild::build_urel_udeb");
+ &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "$iAssp$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+ }
+
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "arm4") if ($GenBuild::build_arm4);
+ &BuildLevels("1", "abld test library $GenBuild::keepgoing", "arm4") if (($GenBuild::build_arm4) &&($GenBuild::build_test));
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "arm4t") if ($GenBuild::build_arm4t);
+ &BuildLevels("1", "abld test library $GenBuild::keepgoing", "arm4t") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "armv5") if ($GenBuild::build_armv5);
+ &BuildLevels("1", "abld test library $GenBuild::keepgoing", "armv5") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "armi") if ($GenBuild::build_armi);
+ &BuildLevels("1", "abld test library $GenBuild::keepgoing", "armi") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "thumb") if ($GenBuild::build_thumb);
+ &BuildLevels("1", "abld test library $GenBuild::keepgoing", "thumb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", "arm3") if ($GenBuild::build_arm3);
+ &BuildLevels("1", "abld test library $GenBuild::keepgoing", "arm3") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+
+ foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+ {
+ &BuildLevels("1", "abld library $GenBuild::keepgoing", $iAssp);
+ &BuildLevels("1", "abld test library $GenBuild::keepgoing", $iAssp) if ($GenBuild::build_test);
+ }
+
+ # Build all targets
+ my @iTargets;
+ # Push the defaults on
+ push @iTargets, "wins$GenBuild::build_urel_udeb" if (($GenBuild::build_wins) && (!$GenBuild::epoc_only));
+ push @iTargets, "arm4$GenBuild::build_urel_udeb" if ($GenBuild::build_arm4);
+ push @iTargets, "arm4t$GenBuild::build_urel_udeb" if ($GenBuild::build_arm4t);
+ push @iTargets, "armv5$GenBuild::build_urel_udeb" if ($GenBuild::build_armv5);
+ push @iTargets, "armi$GenBuild::build_urel_udeb" if ($GenBuild::build_armi);
+ push @iTargets, "winscw$GenBuild::build_urel_udeb" if (($GenBuild::build_winscw) && (!$GenBuild::epoc_only));
+ push @iTargets, "thumb$GenBuild::build_urel_udeb" if ($GenBuild::build_thumb);
+ push @iTargets, "arm3$GenBuild::build_urel_udeb" if ($GenBuild::build_arm3);
+ foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+ {
+ push @iTargets, "$iAssp$GenBuild::build_urel_udeb";
+ }
+ &BuildTargets("0", "abld target $GenBuild::keepgoing $GenBuild::savespace", @iTargets);
+ &BuildTargets("0", "abld test target $GenBuild::keepgoing $GenBuild::savespace", @iTargets) if ($GenBuild::build_test);
+
+ unless ($epoc_only)
+ {
+ if ($GenBuild::build_wins)
+ {
+ # Final Part of WINS
+ &BuildLevels("1", "abld final $GenBuild::keepgoing", "wins","$GenBuild::build_urel_udeb");
+ &BuildLevels("1", "abld test final $GenBuild::keepgoing", "wins","$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+ &BuildLevels("0", "abld -what build", "wins","$GenBuild::build_urel_udeb");
+ &BuildLevels("0", "abld test -what build", "wins","$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ &BuildLevels("0", "abld -check build", "wins","$GenBuild::build_urel_udeb");
+ &BuildLevels("0", "abld test -check build", "wins","$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ }
+
+ if ($GenBuild::build_winscw)
+ {
+ # Final Part of WINSCW
+ &BuildLevels("1", "abld final $GenBuild::keepgoing", "winscw$GenBuild::build_urel_udeb");
+ &BuildLevels("1", "abld test final $GenBuild::keepgoing", "winscw$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+ &BuildLevels("0", "abld -what build", "winscw$GenBuild::build_urel_udeb");
+ &BuildLevels("0", "abld test -what build", "winscw$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ &BuildLevels("0", "abld -check build", "winscw$GenBuild::build_urel_udeb");
+ &BuildLevels("0", "abld test -check build", "winscw$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+ $GenBuild::iStageCount++;
+ }
+ }
+
+ # Other Final Parts
+ &BuildLevels("1", "abld final $GenBuild::keepgoing", "arm4$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4);
+ &BuildLevels("1", "abld test final $GenBuild::keepgoing", "arm4$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld final $GenBuild::keepgoing", "arm4t$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4t);
+ &BuildLevels("1", "abld test final $GenBuild::keepgoing", "arm4t$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld final $GenBuild::keepgoing", "armv5$GenBuild::build_urel_udeb") if ($GenBuild::build_armv5);
+ &BuildLevels("1", "abld test final $GenBuild::keepgoing", "armv5$GenBuild::build_urel_udeb") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld final $GenBuild::keepgoing", "armi$GenBuild::build_urel_udeb") if ($GenBuild::build_armi);
+ &BuildLevels("1", "abld test final $GenBuild::keepgoing", "armi$GenBuild::build_urel_udeb") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld final $GenBuild::keepgoing", "thumb$GenBuild::build_urel_udeb") if ($GenBuild::build_thumb);
+ &BuildLevels("1", "abld test final $GenBuild::keepgoing", "thumb$GenBuild::build_urel_udeb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+ &BuildLevels("1", "abld final $GenBuild::keepgoing", "arm3$GenBuild::build_urel_udeb") if ($GenBuild::build_arm3);
+ &BuildLevels("1", "abld test final $GenBuild::keepgoing", "arm3$GenBuild::build_urel_udeb") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+ foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+ {
+ &BuildLevels("1", "abld final $GenBuild::keepgoing", $iAssp);
+ &BuildLevels("1", "abld test final $GenBuild::keepgoing", $iAssp) if ($GenBuild::build_test);
+ }
+
+ &BuildLevels("0", "abld -what build", "arm4$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4);
+ &BuildLevels("0", "abld test -what build", "arm4$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -what build", "arm4t$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4t);
+ &BuildLevels("0", "abld test -what build", "arm4t$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -what build", "armv5$GenBuild::build_urel_udeb") if ($GenBuild::build_armv5);
+ &BuildLevels("0", "abld test -what build", "armv5$GenBuild::build_urel_udeb") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -what build", "armi$GenBuild::build_urel_udeb") if ($GenBuild::build_armi);
+ &BuildLevels("0", "abld test -what build", "armi$GenBuild::build_urel_udeb") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -what build", "thumb$GenBuild::build_urel_udeb") if ($GenBuild::build_thumb);
+ &BuildLevels("0", "abld test -what build", "thumb$GenBuild::build_urel_udeb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -what build", "arm3$GenBuild::build_urel_udeb") if ($GenBuild::build_arm3);
+ &BuildLevels("0", "abld test -what build", "arm3$GenBuild::build_urel_udeb") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+
+ foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+ {
+ &BuildLevels("0", "abld -what build", $iAssp);
+ &BuildLevels("0", "abld test -what build", $iAssp) if ($GenBuild::build_test);
+ }
+ $GenBuild::iStageCount++;
+
+ &BuildLevels("0", "abld -check build", "arm4$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4);
+ &BuildLevels("0", "abld test -check build", "arm4$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -check build", "arm4t$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4t);
+ &BuildLevels("0", "abld test -check build", "arm4t$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -check build", "armv5$GenBuild::build_urel_udeb") if ($GenBuild::build_armv5);
+ &BuildLevels("0", "abld test -check build", "armv5$GenBuild::build_urel_udeb") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -check build", "armi$GenBuild::build_urel_udeb") if ($GenBuild::build_armi);
+ &BuildLevels("0", "abld test -check build", "armi$GenBuild::build_urel_udeb") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -check build", "thumb$GenBuild::build_urel_udeb") if ($GenBuild::build_thumb);
+ &BuildLevels("0", "abld test -check build", "thumb$GenBuild::build_urel_udeb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+ &BuildLevels("0", "abld -check build", "arm3$GenBuild::build_urel_udeb") if ($GenBuild::build_arm3);
+ &BuildLevels("0", "abld test -check build", "arm3$GenBuild::build_urel_udeb") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+
+ foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+ {
+ &BuildLevels("0", "abld -check build", $iAssp);
+ &BuildLevels("0", "abld test -check build", $iAssp) if ($GenBuild::build_test);
+ }
+
+ # Print the XML Footer
+ print $GenBuild::XMLFileH qq{\t</Commands>\n</Product>};
+
+ # Add the per command end HiRes timestamp if available
+ print $GenBuild::gLogFileH "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+ # Add the per command end timestamp
+ print $GenBuild::gLogFileH "++ Finished at ".localtime()."\n";
+
+ # Print Genxml log footer
+ print $GenBuild::gLogFileH "=== Genxml finished ".localtime()."\n";
+
+ # Close XML File
+ close($GenBuild::XMLFileH);
+}
+
+sub BuildLevels
+{
+ my ($iIncStage, $action, $arg1, $arg2, $arg3) = @_;
+
+ for(my $j = 0; $j < scalar(@GenBuild::components); $j++)
+ {
+ my $line = $GenBuild::components[$j];
+ my @MyList;
+ my $tempvar;
+
+ @MyList = split(/\s+/,$line);
+ $tempvar= lc $MyList[$#MyList];
+ $tempvar =~ s/\\group//;
+ push @MyList, $tempvar;
+
+ print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="$MyList[2]" Cwd="$GenBuild::iSourceDir$MyList[1]" CommandLine="$action $arg1 $arg2 $arg3"/>\n};
+ $GenBuild::iIDCount++;
+
+ if ( $iIncStage )
+ {
+ $GenBuild::iStageCount++;
+ }
+ }
+
+}
+
+sub BuildTargets
+{
+ my ($iIncStage, $action, @iTargets) = @_;
+
+
+ for(my $j = 0; $j < scalar(@GenBuild::components); $j++)
+ {
+ my $line = $GenBuild::components[$j];
+ my @MyList;
+ my $tempvar;
+
+ @MyList = split(/\s+/,$line);
+ $tempvar= lc $MyList[$#MyList];
+ $tempvar =~ s/\\group//;
+ push @MyList, $tempvar;
+
+ # Process target list
+ foreach my $iTarget (@iTargets)
+ {
+ print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="$MyList[2]" Cwd="$GenBuild::iSourceDir$MyList[1]" CommandLine="$action $iTarget"/>\n};
+ $GenBuild::iIDCount++;
+ }
+ if ( $iIncStage )
+ {
+ $GenBuild::iStageCount++;
+ }
+ }
+ $GenBuild::iStageCount++ if (!$iIncStage);
+
+}
+
+# GenReallyClean
+#
+# Inputs
+# $iReallyClean - Filename for reallyclean xml
+#
+# Outputs
+#
+# Description
+# This function generates a xml file to run abld reallyclean on all components
+sub GenReallyClean
+{
+ my ($iReallyClean) = @_;
+
+ # Reset ID and Stage Counf for New XML File
+ $GenBuild::iIDCount = 1;
+ $GenBuild::iStageCount = 1;
+
+
+ # Add the section header
+ print $GenBuild::gLogFileH "=== Genxml == ReallyClean\n";
+
+ print $GenBuild::gLogFileH "-- Genxml\n";
+ # Add the per command start timestamp
+ print $GenBuild::gLogFileH "++ Started at ".localtime()."\n";
+ # Add the per command start HiRes timestamp if available
+ if ($gHiResTimer == 1)
+ {
+ print $GenBuild::gLogFileH "+++ HiRes Start ".Time::HiRes::time()."\n";
+ } else {
+ # Add the HiRes timer missing statement
+ print $GenBuild::gLogFileH "+++ HiRes Missing\n";
+ }
+
+ # Open XML file
+ $GenBuild::XMLFileH = IO::File->new("> $iReallyClean")
+ or croak "Couldn't open $iReallyClean for writing: $!\n";
+
+ # Write Header
+ &PrintXMLHeader($GenBuild::XMLFileH);
+ # Generate XML file
+ &BuildLevels("0", "abld reallyclean");
+ # Write Footer and Close XML File
+ print $GenBuild::XMLFileH qq{\t</Commands>\n</Product>};
+ close($GenBuild::XMLFileH);
+
+
+ # Add the per command end HiRes timestamp if available
+ print $GenBuild::gLogFileH "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+ # Add the per command end timestamp
+ print $GenBuild::gLogFileH "++ Finished at ".localtime()."\n";
+
+ # Print Genxml log footer
+ print $GenBuild::gLogFileH "=== Genxml finished ".localtime()."\n";
+}
+
+# GenClean
+#
+# Inputs
+# $iClean - Filename for reallyclean xml
+#
+# Outputs
+#
+# Description
+# This function generates a xml file to run abld reallyclean on all components
+sub GenClean
+{
+ my ($iClean) = @_;
+
+ # Reset ID and Stage Counf for New XML File
+ $GenBuild::iIDCount = 1;
+ $GenBuild::iStageCount = 1;
+
+ # Add the section header
+ print $GenBuild::gLogFileH "=== Genxml == Clean\n";
+
+ print $GenBuild::gLogFileH "-- Genxml\n";
+ # Add the per command start timestamp
+ print $GenBuild::gLogFileH "++ Started at ".localtime()."\n";
+ # Add the per command start HiRes timestamp if available
+ if ($gHiResTimer == 1)
+ {
+ print $GenBuild::gLogFileH "+++ HiRes Start ".Time::HiRes::time()."\n";
+ } else {
+ # Add the HiRes timer missing statement
+ print $GenBuild::gLogFileH "+++ HiRes Missing\n";
+ }
+
+ # Open XML file
+ $GenBuild::XMLFileH = IO::File->new("> $iClean")
+ or croak "Couldn't open $iClean for writing: $!\n";
+
+ # Write Header
+ &PrintXMLHeader($GenBuild::XMLFileH);
+ # Generate XML file
+ &BuildLevels("0", "abld clean");
+
+ # Write Footer and Close XML File
+ print $GenBuild::XMLFileH qq{\t</Commands>\n</Product>};
+ close($GenBuild::XMLFileH);
+
+
+ # Add the per command end HiRes timestamp if available
+ print $GenBuild::gLogFileH "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+ # Add the per command end timestamp
+ print $GenBuild::gLogFileH "++ Finished at ".localtime()."\n";
+
+ # Print Genxml log footer
+ print $GenBuild::gLogFileH "=== Genxml finished ".localtime()."\n";
+}
+
+# PrintXMLHeader
+#
+# Inputs
+# $iFileHandle
+#
+# Outputs
+#
+# Description
+# This function print the common start of the XML File
+sub PrintXMLHeader
+{
+ my ($iFileHandle) = @_;
+
+ my ($epocroot) = $ENV{'EPOCROOT'};
+
+ # Print the XML Header
+ print $iFileHandle qq{<?xml version="1.0"?>\n};
+ print $iFileHandle <<DTD_EOF;
+<!DOCTYPE Build [
+ <!ELEMENT Product (Commands)>
+ <!ATTLIST Product name CDATA #REQUIRED>
+ <!ELEMENT Commands (Execute+ | SetEnv*)>
+ <!ELEMENT Execute EMPTY>
+ <!ATTLIST Execute ID CDATA #REQUIRED>
+ <!ATTLIST Execute Stage CDATA #REQUIRED>
+ <!ATTLIST Execute Component CDATA #REQUIRED>
+ <!ATTLIST Execute Cwd CDATA #REQUIRED>
+ <!ATTLIST Execute CommandLine CDATA #REQUIRED>
+ <!ELEMENT SetEnv EMPTY>
+ <!ATTLIST SetEnv Order ID #REQUIRED>
+ <!ATTLIST SetEnv Name CDATA #REQUIRED>
+ <!ATTLIST SetEnv Value CDATA #REQUIRED>
+]>
+DTD_EOF
+ print $iFileHandle qq{<Product Name="$GenBuild::basename">\n\t<Commands>\n};
+
+ #Set EPOCROOT
+ print $iFileHandle qq{\t\t<SetEnv Order="1" Name="EPOCROOT" Value="$epocroot"/>\n};
+
+ #Add Tools to the path using EPOCROOT
+ print $iFileHandle qq{\t\t<SetEnv Order="2" Name="PATH" Value="}.$epocroot.qq{epoc32\\gcc\\bin;}.$epocroot.qq{epoc32\\tools;%PATH%"/>\n};
+
+}
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/GenXml.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,2133 @@
+# Copyright (c) 2003-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:
+#
+
+package GenXml;
+
+ use strict;
+
+ use FindBin;
+ use lib "$FindBin::Bin/lib";
+ use XML::DOM;
+ use XML::DOM::ValParser;
+
+ # produces the "Use of uninitialized value in concatenation (.) or string" warning
+ use XML::XQL;
+ use XML::XQL::DOM;
+
+ # Variable to indicate the version of xml file used. It will be set by subroutine Parse_xml
+ my $iVer = 1;
+
+ # Used by debug prints
+ #my $count;
+
+my ($gHiResTimer) = 0; #Flag - true (1) if HiRes Timer module available
+my ($gLogFileH); # Log file handle
+my ($gEmbeddedLog) = 0; # Flag false (0) if logging must include scanlog headers etc
+my ($gValidateFailed) = 0; # Flag true (1) if the XML validation has failed
+my ($gValidate) = 0; # Flag true (1) if to do XML validation only
+
+ #assign STDERR to STDOUT so both are printed in the same file, without overwriting lines
+ open (STDERR, ">&STDOUT") or die("ERROR: Unable to redirect STDERR to STDOUT: $!");
+ select((select(STDOUT), $|=1)[0]);
+ select((select(STDERR), $|=1)[0]);
+
+
+# Check if HiRes Timer is available
+if (eval "require Time::HiRes;") {
+ $gHiResTimer = 1;
+} else {
+ print "Cannot load HiResTimer Module, install the Perl module Time-HiRes for more accurate timing data\n";
+}
+
+# Start
+#
+# Inputs
+# $iXMLSource - ref to array of XML filenames, to be merged into one
+# $iLogFile - name of logfile
+# $iSourceDir - root of the current source tree
+# $iEffectiveDir - root of source tree in which output files will be used
+# $iValidate - if true, validate the input and then stop
+#
+# $iFilter - (optional) filter the merged file against this value
+# $iMergedXml - (optional) create file of this name containing the merged XML
+# $iConfName - name of the configuration: needed by subsequent arguments
+# $iDataOutput - (optional) create file of this name containing the XML build commands
+# $iTextOutput - (optional) create file of this name containing the list of components
+# $iCBROutput - (optional) create file of this name containing the list of MRP files
+#
+# Description
+# This function merges multiple XML files into one document, then optionally outputs various
+# files.
+#
+sub Start
+{
+ my ($iXmlSource, $iDataOutput, $iLogFile, $iSourceDir, $iConfName, $iMergedXml, $iValidate, $iTextOutput, $iCBROutput, $iFilter, $iEffectiveDir) = @_;
+
+ # Set global validation Flag
+ $GenXml::gValidate = $iValidate;
+
+ my $doc;
+
+ if ($iLogFile)
+ {
+ # Open Log file
+ $GenXml::gLogFileH = IO::File->new("> $iLogFile")
+ or die "ERROR: RealTimeBuild: Couldn't open $iLogFile for writing: $!\n";
+ $gEmbeddedLog = 0; # Generate scanlog-compatible log format
+ } else {
+ $GenXml::gLogFileH = *STDOUT;
+ $gEmbeddedLog = 1; # Assume that we are embedded in a scanlog-format log file
+ }
+
+ if (!$gEmbeddedLog)
+ {
+ # Logfile headers
+ print $GenXml::gLogFileH "===-------------------------------------------------\n";
+ print $GenXml::gLogFileH "=== Genxml\n";
+ print $GenXml::gLogFileH "===-------------------------------------------------\n";
+ print $GenXml::gLogFileH "=== Genxml started ".localtime()."\n";
+ }
+
+ # $iSourceDir must end in a \
+ # Add a \ if not present
+ # And make sure they are in windows style
+ if ($iSourceDir !~ /\\$/)
+ {
+ $iSourceDir =~ s/\//\\/g;
+ $iSourceDir .= "\\";
+ }
+ if ($iEffectiveDir !~ /\\$/)
+ {
+ $iEffectiveDir =~ s/\//\\/g;
+ $iEffectiveDir .= "\\";
+ }
+
+ # Parse all the files into one DOM doc
+ $doc = &Parse_files($iXmlSource, \$iVer);
+ # ... XML::DOM::Document was created sucessfully ...
+
+ # Exit here if validating only
+ exit if ($GenXml::gValidate);
+
+ # Try normalising it
+ $doc->normalize;
+
+ # filter it, if desired
+ if ($iFilter && $iVer == 1) {
+ &logfileHeader("Filtering model against $iFilter");
+ &Filter_doc($doc, $iFilter);
+ &logfileFooter();
+ } elsif ($iFilter && $iVer == 2) {
+ &logfileHeader("Filtering model against $iFilter");
+ &Filter_doc2($doc, $iFilter);
+ &logfileFooter();
+ }
+
+
+ # Debug dump new doc to file
+ #~ $doc->printToFile("$iMergedXml") if ($iMergedXml);
+
+ #################write only non-empty lines################
+ if ($iMergedXml)
+ {
+ open(HANDLE, "+> $iMergedXml") or die "Error: Can't open $iMergedXml: $!";
+ my $MergedXMLString = $doc->toString;
+ my @lines = split(/\n/,$MergedXMLString);
+ my @tempLines = ();
+ foreach (@lines)
+ {
+ push @tempLines, $_ if $_ !~ /^[\s]*$/;
+ }
+
+ $MergedXMLString = join("\n",@tempLines);
+ seek(HANDLE,0,0);
+ print HANDLE $MergedXMLString;
+ truncate(HANDLE,tell(HANDLE));
+ close HANDLE;
+ }
+ #################################
+ if ($iConfName)
+ {
+ # Process the configuration to get the lists of units, tasks and options
+ &logfileHeader("Processing configuration $iConfName");
+ my ($topunits, $subunits, $options, $tasks) = &process_configuration($doc,$iConfName, $iVer);
+ my @topbldList = &compute_bldList($iSourceDir,$iEffectiveDir,$topunits, $iVer);
+
+ &logfileFooter();
+
+ if ($iTextOutput)
+ {
+ &logfileHeader("Generating text output $iTextOutput");
+
+ # Generate old-style text output
+ &write_component_list($doc, $iTextOutput, $iConfName, \@topbldList, $options, $tasks, $iEffectiveDir, $iVer);
+
+ &logfileFooter();
+ }
+
+ if ($iCBROutput)
+ {
+ &logfileHeader("Generating CBR component list $iCBROutput");
+
+ # Generate list of CBR components for "makecbr"
+ my @allunits;
+ #if ($iVer == 1) {
+ @allunits = (@$topunits, @$subunits);
+ #} else {
+ # @allunits = (@$topunits); # No subunits required for the new version of system_definition.xml
+ #}
+ my @fullbldList = &compute_bldList($iSourceDir,$iEffectiveDir,\@allunits, $iVer);
+
+ &write_CBR_list($iCBROutput, \@fullbldList);
+
+ &logfileFooter();
+ }
+
+ if ($iDataOutput)
+ {
+ &logfileHeader("Generating output XML $iDataOutput");
+
+ # Generate the output document by applying the tasks to the bldList
+
+ my $ID = 1; # Execute Element ID counter
+ my $Stage = 1; # Execute Element Stage counter
+
+ my ($outDoc, $docElem, $commands) = &start_output_doc($iConfName, $iVer);
+
+ process_prebuilt(\$outDoc, \$commands, \$ID, \$Stage, $topunits, 'N', $iVer);
+ foreach my $task (@{$tasks})
+ {
+ &process_task($task, $doc, \$outDoc, \$commands, \$ID, \$Stage, \@topbldList, $options, $iSourceDir, $iEffectiveDir, $iVer);
+ }
+ process_prebuilt(\$outDoc, \$commands, \$ID, \$Stage, $topunits, 'Y', $iVer);
+
+ $docElem->appendChild($commands);
+ $docElem->addText("\n");
+ #print $outDoc->toString;
+ $outDoc->printToFile($iDataOutput);
+ $outDoc->dispose;
+
+ &logfileFooter();
+ }
+ }
+
+ if (!$gEmbeddedLog)
+ {
+ # Print Genxml log footer
+ print $GenXml::gLogFileH "=== Genxml finished ".localtime()."\n";
+ }
+
+ # Close file handles
+ close($GenXml::gLogFileH);
+
+ $doc->dispose;
+
+}
+
+# Error Processing function for the XML Validation
+#
+# Throws an exception (with die) when an error is encountered, this
+# will stop the parsing process.
+# Don't die if a warning or info message is encountered, just print a message.
+sub my_fail
+{
+ my $code = shift;
+
+ if ($code < 200)
+ {
+ print $GenXml::gLogFileH "ERROR: ".XML::Checker::error_string ($code, @_);
+ # Set Flag so all the errors are reported before dieing
+ $GenXml::gValidateFailed = 1;
+ }
+
+ # Useful debug output
+ print $GenXml::gLogFileH XML::Checker::error_string ($code, @_) if ($GenXml::gValidate);
+}
+
+sub my_Unparsed_handler
+{
+ my ($Parser, $Entity, $Base, $Sysid, $Pubid, $Notation) = @_;
+ print $GenXml::gLogFileH "$Entity Unparsed";
+ die "ERROR: RealTimeBuild: Processing error\n";
+}
+
+# Parse_files
+#
+# Inputs
+# $iXMLSource - ref to array of filenames
+# $iVersion - Version of xml file (new or old) ?
+#
+# Outputs
+# $doc - XML DOM doc
+#
+# Description
+# This function merges multiple XML files into one document
+sub Parse_files
+{
+ my ($iXmlSource, $iVersion) = @_; # Version info passed for conditional processing of xml files
+ my (@docs);
+
+ # Load the XML document
+ my %expat_options = (KeepCDATA => 1,
+ Handlers => [ Unparsed => \&my_Unparsed_handler ]);
+
+ for (my $i = 0; $i < scalar(@$iXmlSource); $i++)
+ {
+ # Create header for parsing each file
+ &logfileHeader(@$iXmlSource[$i]);
+
+ my $parser = new XML::DOM::ValParser (%expat_options);
+ XML::DOM::ignoreReadOnly (1);
+ local $XML::Checker::FAIL = \&my_fail;
+
+ # Useful debug output
+ #print "Parsing ".@$iXmlSource[$i]."\n";
+
+ $docs[$i] = $parser->parsefile (@$iXmlSource[$i]);
+
+ # Create footer for parsing each file
+ &logfileFooter();
+ }
+
+ # Check to see if any of the XML files failed validation and die
+ die "ERROR: RealTimeBuild: Validation failed\n" if ($GenXml::gValidateFailed);
+
+# Set the appropriate version number
+ for (my $i = 0; $i < scalar(@docs); $i++)
+ { if((scalar(@docs))>1) {
+ if ($docs[$i]->getDocumentElement->getAttribute('schema') =~ /^2\./ &&
+ $docs[$i]->getDocumentElement->getTagName eq "SystemDefinition" &&
+ $docs[1]->getDocumentElement->getTagName eq "SystemBuild")
+ {
+ $$iVersion = 2;
+ last;
+ }
+ }
+ else
+ {
+ if ($docs[$i]->getDocumentElement->getAttribute('schema') =~ /^2\./ &&
+ $docs[$i]->getDocumentElement->getTagName eq "SystemDefinition")
+ {
+ $$iVersion = 2;
+ last;
+ }
+ }
+ }
+
+ if ($$iVersion == 1) { # Docs load now merge into $docs[0] if $iVersion is 1 (i.e. old version of xml file)
+ for (my $i = 1; $i < scalar(@docs); $i++) {
+ # Create header for merging each file
+ &logfileHeader("Merging in XML file ".@$iXmlSource[$i]);
+ &process_node(\($docs[0]->getElementsByTagName("SystemDefinition")),\($docs[$i]->getElementsByTagName("SystemDefinition")), \($docs[0]));
+
+ # Re-validate merged file
+ local $XML::Checker::FAIL = \&my_fail;
+ $docs[0]->check();
+
+ # Create footer for merging each file
+ &logfileFooter();
+ # Check to see if any of the XML files failed validation and die
+ die "ERROR: RealTimeBuild: Merged Validation failed\n" if ($GenXml::gValidateFailed);
+ }
+ } elsif ($$iVersion == 2) { # Docs load now merge into $docs[$#docs + 1] if $iVersion is 2 (i.e. new version of xml file)
+ for (my $i = 1; $i < scalar(@docs); $i++) {
+ # Create header for merging each file
+ &logfileHeader("Merging in XML file ".@$iXmlSource[$i]);
+ my $mergedDoc = &process_node2(\($docs[0]), \($docs[$i]));
+
+ # Re-validate merged file
+ local $XML::Checker::FAIL = \&my_fail;
+ $mergedDoc->check();
+
+ # Create footer for merging each file
+ &logfileFooter();
+ # Check to see if any of the XML files failed validation and die
+ die "ERROR: RealTimeBuild: Merged Validation failed\n" if ($GenXml::gValidateFailed);
+
+ $docs[0] = $mergedDoc;
+ }
+ }
+ return $docs[0];
+}
+
+# process_node
+#
+# Inputs
+# $node1 - ref to a node from the master
+# $node2 - ref to a node from the slave
+# $doc1 - ref to the doc of node1 so we can set the doc owner to the (not DOM spec) to get around WRONG_DOCUMENT_ERR restriction
+#
+# Outputs
+#
+# Description
+# This function processes a node in two DOM documents, if any children match then it calls itself to process
+# the children nodes further
+sub process_node
+{
+ my ($node1, $node2, $doc1) = @_;
+
+ # Some nodes need special processing e.g. SystemDefinition
+ # This is because there can only be a certain number of these nodes
+ # child node / element rules outlined below, this rules are applied to the children of the node in question
+ # Child Node / element tag Rule
+ # ------------------------ ----
+ # SystemDefinition Merge the name and revision/schema CDATA as there can be only one of this element
+ # systemModel Always processed further as there can only be 1 or 0 of these
+ # layer Same name process further otherwise append child
+ # logicalset Same name process further otherwise append child
+ # logicalsubset Same name process further otherwise append child
+ # module Same name process further otherwise append child
+ # component Same name process further otherwise append child
+ # unit Same unitID generate ERROR and not replace child, otherwise append child
+ # sub elements of unit No processing needed as these cannot be merged
+ # package Same name process further otherwise append child
+
+ # build Always processed further as there can only be 1 or 0 of these
+ # unitList Same name process further otherwise append child
+ # unitRef Same unit ignore, different unit append child
+ # targetList Same name generate ERROR and not replace child, otherwise append child
+ # target Same name generate ERROR and not replace child, otherwise append child
+ # option Same name generate ERROR and not replace child, otherwise append child
+ # configuration Same name generate ERROR and not replace child, otherwise append child
+ # sub elements of configuration No processing needed as these cannot be merged
+
+
+ # All other nodes Append child
+
+ # Useful debug stuff
+ #$GenXml::count++;
+ #print "enter $GenXml::count\n";
+
+ # Handle the special case for the first call to this function with the node containing the SystemDefinition
+ if (($$node1->getTagName eq "SystemDefinition") && ($$node2->getTagName eq "SystemDefinition"))
+ {
+ # Get the name attributes
+ my ($name1) = $$node1->getAttribute('name');
+ my ($name2) = $$node2->getAttribute('name');
+ # Combine the two and set the attribute into the merged file
+ $$node1->setAttribute('name',$name1." + ".$name2);
+
+ # Get the revision attributes
+ my ($revision1) = $$node1->getAttribute('revision');
+ my ($revision2) = $$node2->getAttribute('revision');
+ # Get the schema attributes
+ my ($schema1) = $$node1->getAttribute('schema');
+ my ($schema2) = $$node2->getAttribute('schema');
+ # If both schema attributes are defined, combine the two and set the attribute into the merged file
+ # Note that even if an attribute does not exist in the XML file, XML::DOM returns an empty string (not undef)
+ if (($schema1) and ($schema2))
+ { # Both files have "new DTD".
+ if (($revision1) or ($revision2))
+ {
+ print $GenXml::gLogFileH "ERROR: Cannot define both schema and revison attributes in same file. Merged file will probably not be usable.\n";
+ }
+ if ($schema1 eq $schema2)
+ { # Both files have same schema attribute. Assign it to merged file
+ $$node1->setAttribute('schema',$schema1);
+ }
+ else
+ { # Files have different schema attributes. Combine and assign it to merged file. Warn!!
+ print $GenXml::gLogFileH "WARNING: Source file schema attribute values differ ($schema1 vs $schema2). Merged file may not be usable.\n";
+ $$node1->setAttribute('schema',$schema1." + ".$schema2);
+ }
+ }
+ # If both revision attributes are defined, combine the two and set the attribute into the merged file
+ elsif (($revision1) and ($revision2))
+ { # Both files have "old DTD". Retain this code for compatibility
+ print $GenXml::gLogFileH "REMARK: Both source files have \"old style\" DTDs. See SystemDefinition \"revision\" attribute.\n";
+ $$node1->setAttribute('revision',$revision1." + ".$revision2);
+ }
+ else
+ { # Files have different DTDs. Use attribute found in first file. report as ERROR!!
+ print $GenXml::gLogFileH "ERROR: Source file schema/revison attributes conflict. Merged file will probably not be usable.\n";
+ if ($schema1)
+ { # First file had new DTD and had a schema attribute
+ $$node1->setAttribute('schema',$schema1);
+ }
+ elsif ($revision1)
+ { # First file had old DTD and had a revision attribute (not a schema)
+ $$node1->setAttribute('revision',$revision1);
+ }
+ }
+ }
+
+ # Get the children of the parent nodes
+
+ my $nodelist1 = $$node1->getChildNodes;
+ my $nodelist2 = $$node2->getChildNodes;
+
+ # Useful debug stuff
+ #print "has ".$nodelist2->getLength." children\n";
+
+ # Itterate throught the children of node2 check to see if they are present / rule match in node 1
+ my $ni = $nodelist2->getLength;
+ for (my $i = 0; $i < $ni; $i++)
+ {
+ # Useful debug stuff
+ #print "node $i ".$nodelist2->item($i)->getNodeTypeName."\n";
+ if ($nodelist2->item($i)->getNodeTypeName eq "ELEMENT_NODE")
+ {
+ # Handle rule match on ELEMENTS
+ my $tagname2 = $nodelist2->item($i)->getTagName;
+
+ # Useful debug stuff
+ # print "Tagname = $tagname\n";
+ if (($tagname2 eq "systemModel") || ($tagname2 eq "build") )
+ {
+ my $iBuildIndx;
+ # find the $node1 for this elements
+ my $nj = $nodelist1->getLength;
+ my $match = 0;
+ for (my $j = 0; $j < $nj; $j++)
+ {
+ if ($nodelist1->item($j)->getNodeTypeName eq "ELEMENT_NODE")
+ {
+ my $tagname1 = $nodelist1->item($j)->getTagName;
+ if ($tagname1 eq $tagname2)
+ {
+ # process further
+
+ # Useful debug stuff
+ #print "processing $tagname further\n";
+ &process_node(\($nodelist1->item($j)), \($nodelist2->item($i)), $doc1);
+ $match = 1;
+ }
+ else
+ {
+ if ($tagname1 eq 'build')
+ {
+ $iBuildIndx = $j;
+ }
+ if ((($tagname2 eq 'systemModel') and ($tagname1 ne 'systemModel')) or ((($tagname2 eq 'build') and ($tagname1 ne 'build'))))
+ {
+ next;
+ }
+ # no systemModel or build element found so append child
+ &append_child($node1, \($nodelist2->item($i)), $doc1)
+ }
+ }
+ }
+ unless ($match)
+ {
+ # no systemModel or build element found so append child
+ # In the special case of adding an instance of 'systemModel' we must specify that this goes before any instance of 'build'
+ my $iRefChildRef = ($tagname2 eq 'systemModel')? $nodelist1->item($iBuildIndx): undef;
+ &append_child($node1, \($nodelist2->item($i)), $doc1, $iRefChildRef);
+ }
+ } elsif (($tagname2 eq "layer") || ($tagname2 eq "logicalset") || ($tagname2 eq "logicalsubset") || ($tagname2 eq "module") || ($tagname2 eq "component") || ($tagname2 eq "package") || ($tagname2 eq "unitList"))
+ {
+ # Check the $node1 for elements with the same "name"
+ my $match; # Flag for matching element found
+ my $nj = $nodelist1->getLength;
+ for (my $j = 0; $j < $nj; $j++)
+ {
+ # Only look at element nodes in node1
+ if ($nodelist1->item($j)->getNodeTypeName eq "ELEMENT_NODE")
+ {
+ if ($nodelist2->item($i)->getAttribute('name') eq $nodelist1->item($j)->getAttribute('name'))
+ {
+ # Process further match found
+ $match = 1;
+
+ # Useful debug stuff
+ #print "processing j=$j $tagname2 further ".$nodelist2->item($i)->getAttribute('name')."\n";
+
+ &process_node(\($nodelist1->item($j)), \($nodelist2->item($i)), $doc1);
+ }
+ }
+ }
+ # If no match found Append child
+
+ # Useful debug stuff
+ #print "new $tagname2 added\n" if (!$match);
+
+ &append_child($node1, \($nodelist2->item($i)), $doc1) if (!$match);
+
+ } elsif (($tagname2 eq "unit") || ($tagname2 eq "targetList") || ($tagname2 eq "target") || ($tagname2 eq "option") || ($tagname2 eq "configuration")) {
+ # Check the $node1 for elements with the same ID attribute (Global check for ID clashes)
+ my $idAttrib;
+ if ($tagname2 eq "unit")
+ {
+ # Special case of the unit element as this has uses the attribute of unitID instead of name
+ $idAttrib = "unitID";
+ } else {
+ $idAttrib = "name";
+ }
+
+ my $ID = $nodelist2->item($i)->getAttribute($idAttrib);
+ # Search for the XML ID in $doc1
+ if( scalar(XML::XQL::solve ("//*[\@$idAttrib = '$ID']", $$doc1)))
+ {
+ print $GenXml::gLogFileH "REMARK: $ID already exists, not merging this $tagname2 element\n";
+ } else {
+ # unitID not found so append elememnt
+
+ # Useful debug stuff
+ # print "new $tagname2 added\n";
+
+ &append_child($node1, \($nodelist2->item($i)), $doc1);
+ }
+ } elsif ($tagname2 eq "unitRef") {
+ # Check the $node1 for elements with the same "name"
+ my $match; # Flag for matching element found
+ my $nj = $nodelist1->getLength;
+ for (my $j = 0; $j < $nj; $j++)
+ {
+ # Only look at element nodes in node1
+ if ($nodelist1->item($j)->getNodeTypeName eq "ELEMENT_NODE")
+ {
+ if ($nodelist2->item($i)->getAttribute('unit') eq $nodelist1->item($j)->getAttribute('unit'))
+ {
+ # Ignore the unitRef element as it is a duplicate
+ $match = 1;
+ print $GenXml::gLogFileH "WARNING: Duplicate unitRef ".$nodelist2->item($i)->getAttribute('unit')." not merging\n";
+ }
+ }
+ }
+ # No match found Append Child
+
+ # Useful debug stuff
+ # print "New unitRef\n" if (!$match);
+
+ &append_child($node1, \($nodelist2->item($i)), $doc1) if (!$match);
+
+ } else {
+ # Element not recognised so append child
+ &append_child($node1, \($nodelist2->item($i)), $doc1);
+ }
+ } else {
+ # Handle non element nodes (append child of node2 to node 1)
+ # At the moment adding in non element nodes adds a lot of whitespace
+ # TODO: correctly handle non element nodes
+ # This is not important at the moment as there are no important non element nodes for the merge
+ #&append_child($node1, \($nodelist2->item($i)), $doc1);
+ }
+ }
+
+ #print "return $GenXml::count\n";
+ #$GenXml::count--;
+}
+
+# append_child
+#
+# Inputs
+# $node1 - is already a ref of the node to append to
+# $node2 - ref of node from nodelist2 to append to $node1
+# $doc1 - ref to document to merge the node into (need for non DOM operation of changing owner of node)
+# $refnode - ref to node in fromt of which to insert node2 (If undef, append node2)
+#
+# Description
+# ???
+sub append_child
+{
+ my ($node1, $node2, $doc1, $refnode) = @_;
+
+ # Clone the node
+ my $clone = $$node2->cloneNode(1);
+ # Fix the owner of node
+ $clone->setOwnerDocument($$doc1);
+ # Append a line return for more tidy xml
+ $$node1->addText("\n");
+ # Append (or insert) the node
+ # Note: it seems that insertBefore($clone,undef) is identical to appendChild($clone)
+ $$node1->insertBefore($clone,$refnode);
+}
+
+# write_component_list
+#
+# Inputs
+# $doc - Reference to input document
+# $iTextOutput - Name of output file
+# $iConfName - Name of configuration being described
+# $bldList - Reference to the bldList array
+# $options - Reference to the options array
+# $tasks - Reference to the tasks array
+# $iEffectiveDir - Root of source tree in which file will be used
+# $iVersion - Version of xml file (new or old) ?
+#
+# Description:
+# Write out old-style "list of components" build description for the configuration
+#
+sub write_component_list
+ {
+ my ($doc, $iTextOutput, $iConfName, $bldList, $options, $tasks, $iEffectiveDir, $iVersion) = @_;
+
+ # process list of tasks to find build targets and bootstrap info
+ my %targets;
+ my $bootflag = 0;
+
+ foreach my $task (@$tasks)
+ {
+ # Read all the task
+ my @children = $task->getChildNodes;
+ foreach my $child (@children)
+ {
+ next if ($child->getNodeTypeName ne "ELEMENT_NODE");
+ if ($child->getTagName eq "specialInstructions")
+ {
+ # "setupprj" in the command is taken to mean "bootstrap E32ToolP"
+ $bootflag = 1 if ($child->getAttribute("command") =~ /setupprj/i);
+ next;
+ }
+ my $targetlist = $child->getAttributeNode("targetList");
+ if (defined $targetlist)
+ {
+ my @targetnames = &find_targetList_by_ID($doc, $targetlist->getValue);
+ foreach my $target (@targetnames)
+ {
+ $targets{$target}= 1;
+ }
+ }
+ }
+ }
+
+ # create output file
+ open TEXTFILE, "> $iTextOutput" or die "ERROR: RealTimeBuild: Couldn't open $iTextOutput for writing: $!\n";
+
+ print TEXTFILE <<HEADER_TXT;
+#
+# ****************************** IMPORTANT NOTE ************************************
+#
+# The configuration was specified as: $iConfName
+#
+# **********************************************************************************
+#
+
+HEADER_TXT
+
+ print TEXTFILE "# Optional variations in the generated scripts\n\n";
+
+ my $column2pos = 8;
+ foreach my $option (@$options) {
+ my $name = '<option ????>';
+ if ($option =~ /^-(.+)/) {$name = "<option $1>"}
+ my $len = length $name;
+ while ($len > $column2pos) { $column2pos += 8; }
+ printf TEXTFILE "%-*s\t# use abld %s\n", $column2pos, $name, $option;
+ }
+
+ $column2pos = 8;
+ foreach my $target (sort keys %targets) {
+ # abld targets are only one word
+ next if ($target =~ /\w+\s+\w+/);
+ my $name;
+ if ($target =~ /(misa|mint|mcot|mtemplate|meig)/i) {
+ $name = "<option arm_assp $target>";
+ } else {
+ $name = "<option $target>";
+ }
+ my $len = length $name;
+ while ($len > $column2pos) { $column2pos += 8; }
+ printf TEXTFILE "%-*s\t#\n", $column2pos, $name;
+ }
+
+ print TEXTFILE "\n";
+ print TEXTFILE "# List of components required \n";
+ print TEXTFILE "#\n# Name abld_directory\n";
+
+ if($bootflag) {
+ print TEXTFILE "#\n# Bootstrapping....\n\n";
+ print TEXTFILE "<special bldfiles E32Toolp group> # Special installation for E32ToolP\n\n";
+ print TEXTFILE "# Components:\n";
+ }
+ print TEXTFILE "#\n";
+
+
+ my $srcprefix = quotemeta($iEffectiveDir);
+
+ $column2pos = 8;
+ foreach my $component (@$bldList) {
+ my $bldinfdir = $component->[1];
+ next if ($bldinfdir eq ""); # skip MRP-only entries
+
+ $bldinfdir =~ s/^$srcprefix//o;
+ my $len = length $component->[0];
+ while ($len > $column2pos) { $column2pos += 8; }
+ printf TEXTFILE "%-*s\t%s\n", $column2pos, $component->[0], $bldinfdir;
+ }
+ close TEXTFILE
+}
+
+# write_CBR_list
+#
+# Inputs
+# $iCBROutput - Name of output file
+# $bldList - Reference to the bldList array
+#
+# Description:
+# Write out "list of CBR components" for the configuration
+#
+sub write_CBR_list
+ {
+ my ($iCBROutput, $bldList) = @_;
+
+ my @components = ();
+ foreach my $component (@$bldList)
+ {
+ my $mrp = $component->[2];
+ next if ($mrp eq ""); # skip entries without MRP files
+
+ push @components, sprintf("%s\t%s\n", $component->[0], $mrp);
+ }
+
+ # create output file
+ open TEXTFILE, "> $iCBROutput" or die "ERROR: RealTimeBuild: Couldn't open $iCBROutput for writing: $!\n";
+ print TEXTFILE sort @components;
+ close TEXTFILE
+ }
+
+# start_output_doc
+#
+# Inputs
+# $iConfName - Configuration name used
+# $iVersion - Version of xml file (new or old) ?
+#
+# Outputs
+# $outDoc - document
+# $docElem - root element
+# $commands - command node
+#
+# Description
+# This function produces the static parts of the output XML file
+sub start_output_doc
+{
+ my ($iConfName, $iVersion) = @_;
+
+ my ($outParser, $outDoc, $docElem, $commands);
+
+ # set the doctype based on which version of file is passed.
+ my $doctype;
+ if ($iVersion == 1) {
+ $doctype = "Build";
+ } elsif ($iVersion == 2) {
+ $doctype = "SystemBuild" ;
+ }
+
+ $outParser = new XML::DOM::Parser;
+
+ my $str = <<END;
+<?xml version="1.0"?>
+<!DOCTYPE $doctype [
+ <!ELEMENT Product (Commands)>
+ <!ATTLIST Product name CDATA #REQUIRED>
+ <!ELEMENT Commands (Execute+ | SetEnv*)>
+ <!ELEMENT Execute EMPTY>
+ <!ATTLIST Execute
+ ID CDATA #REQUIRED
+ Stage CDATA #REQUIRED
+ Component CDATA #REQUIRED
+ Cwd CDATA #REQUIRED
+ CommandLine CDATA #REQUIRED>
+ <!ELEMENT SetEnv EMPTY>
+ <!ATTLIST SetEnv
+ Order ID #REQUIRED
+ Name CDATA #REQUIRED
+ Value CDATA #REQUIRED>
+]>
+<Product>
+</Product>
+END
+
+ $outDoc = $outParser->parse($str);
+
+ # get the document element
+ $docElem = $outDoc->getDocumentElement;
+ $docElem->setAttribute('name', $iConfName);
+ # Add the Commands Node
+ $commands = $outDoc->createElement('Commands');
+ $commands->addText("\n");
+ # create the default SetEnv elements
+ my $SetEnv1 = $outDoc->createElement('SetEnv');
+ $SetEnv1->setAttribute('Order', '1');
+ $SetEnv1->setAttribute('Name', 'EPOCROOT');
+ $SetEnv1->setAttribute('Value', '\\');
+ $commands->appendChild($SetEnv1);
+ $commands->addText("\n");
+ my $SetEnv2 = $outDoc->createElement('SetEnv');
+ $SetEnv2->setAttribute('Order', '2');
+ $SetEnv2->setAttribute('Name', 'PATH');
+ $SetEnv2->setAttribute('Value', '\\epoc32\\gcc\\bin;\\epoc32\\tools;%PATH%');
+ $commands->appendChild($SetEnv2);
+ $commands->addText("\n");
+
+ return ($outDoc, $docElem, $commands);
+}
+
+# process_prebuilt
+#
+# Inputs
+# $outDoc - Reference to output document
+# $commands - Reference to the command node
+# $ID - Reference to theExecute ID counter
+# $Stage - Reference to the Execute Stage counter
+# $topunits - Reference to the list of unit, package & prebuilt elements
+# $late - Selects on the "late" attribute of prebuilt elements
+# $iVersion - Version of xml file (new or old) ?
+#
+# Outputs
+#
+# Description
+# Generates the "getrel" commands for prebuilt elements
+sub process_prebuilt
+{
+ my ($outDoc, $commands, $ID, $Stage, $topunits, $late, $iVersion) = @_;
+
+ my ($name, $version, $islate);
+ foreach my $unit (@$topunits)
+ {
+ my @prebuilt; # a list of all <prebuilt> or <unit prebuilt="...">
+ if ($iVersion == 1) {
+ if ($unit->getTagName eq "prebuilt")
+ {
+ push(@prebuilt, $unit);
+ }
+ } elsif ($iVersion == 2) {
+ my @subunits = $unit->getElementsByTagName("unit");
+ foreach my $subunit (@subunits)
+ {
+ if ($subunit->getAttribute("prebuilt"))
+ {
+ push(@prebuilt, $subunit);
+ }
+ }
+ }
+ foreach my $unit (@prebuilt)
+ {
+ $version = $unit->getAttribute("version");
+ $islate = $unit->getAttribute("late");
+ $name = $unit->getAttribute(($iVersion == 1) ? "name" : "prebuilt");
+
+ $islate = "N" if (!defined $islate || $islate eq "");
+
+ next if ($late ne $islate);
+ next if (!$late && $islate eq "Y");
+
+ # Create the element
+ my $task_elem = $$outDoc->createElement('Execute');
+ $task_elem->setAttribute('ID', $$ID);
+ $$ID++; # The ID must always be incremented
+ $task_elem->setAttribute('Stage', $$Stage);
+ $$Stage++; # getrel operations are serial
+
+ $task_elem->setAttribute('Component',$name);
+ $task_elem->setAttribute('Cwd','%EPOCROOT%');
+ $task_elem->setAttribute('CommandLine',"getrel $name $version");
+
+ $$commands->appendChild($task_elem);
+ $$commands->addText("\n");
+ }
+ }
+}
+
+# process_task
+#
+# Inputs
+# $task - task node
+# $doc - Reference to input document
+# $outDoc - Reference to output document
+# $commands - Reference to the command node
+# $ID - Reference to theExecute ID counter
+# $Stage - Reference to the Execute Stage counter
+# $bldList - Reference to the bldList array
+# $options - Reference to the options array
+# $iSourceDir - root of the current source tree
+# $iEffectiveDir - root from which the source tree will be used
+# $iVersion - Version of xml file (new or old) ?
+#
+# Outputs
+#
+# Description
+# This function processes the task nodes
+sub process_task
+{
+ my ($task, $doc, $outDoc, $commands, $ID, $Stage, $bldList, $options, $iSourceDir, $iEffectiveDir, $iVersion) = @_;
+
+ my @targets;
+ my @localBldList; # Used for task specific unit list overrides
+
+ # re-process the $iSourceDir & $iSourceDir based on version of xml file along with value for unitListRef and unitList
+ my ($unitListRef, $unitList);
+ if($iVersion == 1) {
+ $unitListRef = "unitListRef";
+ $unitList = "unitList";
+ } elsif ($iVersion == 2) {
+ $unitListRef = "listRef";
+ $unitList = "list";
+ }
+
+ # Read all the task
+ my @children = $task->getChildNodes;
+ foreach my $child (@children)
+ {
+ if ($child->getNodeTypeName eq "ELEMENT_NODE")
+ {
+ # Check for unitListRef for task unit list override
+ if ($child->getTagName eq $unitListRef)
+ {
+ #Processes the unitListRefs to build up a complete list of units which are IDREFs
+ my @localUnits= &find_unitList_by_ID($doc, $child->getAttribute($unitList), $iVersion);
+ push @localBldList, &compute_bldList($iSourceDir,$iEffectiveDir,\@localUnits, $iVersion);
+ # Overwrite Ref $bldList with new Ref to @localBldList
+ $bldList = \@localBldList;
+ }
+
+ if ($child->getTagName eq "specialInstructions")
+ {
+ #Processes the unitListRefs to build up a complete list of units which are IDREFs
+ my $task_elem = $$outDoc->createElement('Execute');
+ $task_elem->setAttribute('ID', $$ID);
+ $$ID++; # The ID must always be incremented
+ $task_elem->setAttribute('Stage', $$Stage);
+ $$Stage++; # All specialInstructions are done sequentially
+ $task_elem->setAttribute('Component', $child->getAttributeNode("name")->getValue);
+ my ($cwd) = $child->getAttributeNode("cwd")->getValue;
+ # Replace any Environment variables
+ my ($cwdtemp) = $cwd;
+ $cwdtemp =~ s/%(\w+)%/$ENV{$1}/g;
+ # If $cwd does not starts with a drive letter or absolute path then add the source Directory on the front
+ if (!(($cwdtemp =~ /^\w:[\\]/) || ($cwdtemp =~ /^\\/)))
+ {
+ $cwd = $iEffectiveDir . $cwd;
+ }
+ $task_elem->setAttribute('Cwd', $cwd);
+ $task_elem->setAttribute('CommandLine', $child->getAttributeNode("command")->getValue);
+ $$commands->appendChild($task_elem);
+ $$commands->addText("\n");
+ } elsif ($child->getTagName eq "buildLayer") {
+ # targetParallel & unitParallel are optional so check that they exist before trying to get the value.
+ my $unitP = $child->getAttribute("unitParallel");
+ my $targetP = $child->getAttribute("targetParallel") if ($child->getAttributeNode("targetParallel"));
+ my $abldCommand = $child->getAttribute("command");
+
+ # Build the list of targets, targets are optional
+ if ($child->getAttributeNode("targetList"))
+ {
+ @targets = &find_targetList_by_ID($doc, $child->getAttributeNode("targetList")->getValue);
+ } else {
+ # There are no targets associated with this buildlayer
+ $targetP = "NA"; # Not applicable
+ }
+
+ # Build the correct option string
+ my $optionStr = "";
+ foreach my $option (@$options)
+ {
+ # only add -savespace if the command abld target or abld build take this option
+ # don't add -keepgoing if -what or -check are part of the command
+ if ((($option =~ /\s*-savespace\s*/i) || ($option =~ /\s*-s\s*/i) ) && (($abldCommand =~ /^\s*abld\s+makefile/i) || ($abldCommand =~ /^\s*abld\s+target/i) || ($abldCommand =~ /^\s*abld\s+build/i)))
+ {
+ $optionStr .= " $option" ;
+ }
+ if (($option =~ /\s*-keepgoing\s*/i) || ($option =~ /\s*-k\s*/i) )
+ {
+ if (!(($abldCommand =~ /^\s*abld\s+\w*\s*\w*\s*-check\s*/i) || ($abldCommand =~ /^\s*abld\s+\w*\s*\w*\s*-c\s*/i) || ($abldCommand =~ /^\s*abld\s+\w*\s*\w*\s*-what\s*/i) || ($abldCommand =~ /^\s*abld\s+\w*\s*\w*\s*-w\s*/i)))
+ {
+ $optionStr .= " $option" ;
+ }
+ }
+ # This allows us to either build symbol files or not build symbols to save build time.
+ # only add -no_debug if the command abld makefile
+ if (($option =~ /\s*-no_debug\s*/i) && ($abldCommand =~ /^\s*abld\s+makefile/i))
+ {
+ $optionStr .= " $option" ;
+ }
+ }
+
+ # Remove the mrp-only entries from the bldList
+ my @bldInfList;
+ foreach my $array (@{$bldList})
+ {
+ push @bldInfList, $array if ($$array[1] ne "");
+ }
+
+ # Cover all the combinations of units and targets
+ my ($Ref1, $Ref2, $loop1, $loop2);
+
+ if ($targetP eq "N")
+ {
+ # Got to switch order of looping
+ $Ref2 = \@bldInfList;
+ $Ref1 = \@targets;
+ $loop2 = $unitP;
+ $loop1 = $targetP;
+ } else {
+ $Ref1 = \@bldInfList;
+ $Ref2 = \@targets;
+ $loop1 = $unitP;
+ $loop2 = $targetP;
+ }
+
+ for (my $i = 0; $i < scalar(@$Ref1); $i++)
+ {
+ if ($targetP ne "NA")
+ {
+ for (my $j = 0; $j < scalar(@$Ref2); $j++)
+ {
+ # Create the element
+ my $task_elem = $$outDoc->createElement('Execute');
+ $task_elem->setAttribute('ID', $$ID);
+ $$ID++; # The ID must always be incremented
+ $task_elem->setAttribute('Stage', $$Stage);
+
+ if ($targetP eq "N") {
+ # loops swapped but the order of unitP and targetP need to be swapped back
+ # unit (Component) name is the 0 element of the sub array, source location in element 1
+ $task_elem->setAttribute('Component',$$Ref2[$j][0]);
+ # Find the bldFile directory and set as Cwd
+ $task_elem->setAttribute('Cwd',$$Ref2[$j][1]);
+
+ $task_elem->setAttribute('CommandLine',$abldCommand.$optionStr." ".$$Ref1[$i]);
+ $$commands->appendChild($task_elem);
+ $$commands->addText("\n");
+ } else {
+ # unit (Component) name is the 0 element of the sub array, source location in element 1
+ $task_elem->setAttribute('Component',$$Ref1[$i][0]);
+ # Find the bldFile directory and set as Cwd
+ $task_elem->setAttribute('Cwd',$$Ref1[$i][1]);
+
+ $task_elem->setAttribute('CommandLine',$abldCommand.$optionStr." ".$$Ref2[$j]);
+ $$commands->appendChild($task_elem);
+ $$commands->addText("\n");
+ }
+ $$Stage++ if (($loop1 eq "N") && ($loop2 eq "N"));
+ }
+ $$Stage++ if (($loop1 eq "N") && ($loop2 eq "Y"));
+ } else {
+ # Create the element
+ my $task_elem = $$outDoc->createElement('Execute');
+ $task_elem->setAttribute('ID', $$ID);
+ $$ID++; # The ID must always be incremented
+ $task_elem->setAttribute('Stage', $$Stage);
+
+ # unit (Component) name is the 0 element of the sub array, source location in element 1
+ $task_elem->setAttribute('Component',$$Ref1[$i][0]);
+ # Find the bldFile directory and set as Cwd
+ $task_elem->setAttribute('Cwd',$$Ref1[$i][1]);
+
+ $task_elem->setAttribute('CommandLine',$abldCommand.$optionStr);
+ $$commands->appendChild($task_elem);
+ $$commands->addText("\n");
+
+ $$Stage++ if ($loop1 ne "Y");
+ }
+ }
+ # Add the * (stage++) for the combinations that don't get this done by the loops
+ $$Stage++ if ($loop1 eq "Y");
+ }
+ }
+ }
+}
+
+# delete_unmatched_units
+#
+# Inputs
+# $node - node in the system model
+# $deletedref - reference to hash of deleted unitIDs
+#
+# Outputs
+# Returns 1 if all significant children of the node have been removed
+#
+# Description
+# This function simplifies the XML by removing anything which wasn't marked as MATCHED.
+# It's called recursively so that it can "clean up" the structure if whole subtrees have
+# all of their significant content removed.
+sub delete_unmatched_units
+ {
+ my ($node, $deletedUnitsRef) = @_;
+ my @children = $node->getChildNodes;
+ return 0 if (scalar @children == 0);
+ my $now_empty = 1;
+ my $deleted_something = 0;
+ foreach my $child (@children)
+ {
+ if ($child->getNodeTypeName ne "ELEMENT_NODE")
+ {
+ # text and comments don't count
+ next;
+ }
+ my $tag = $child->getTagName;
+ my $deletedThis = 0;
+ if ((($tag eq "unit" || $tag eq "package" || $tag eq "prebuilt") && $iVer == 1) || (($tag eq "component" || $tag eq "unit") && $iVer == 2))
+ {
+ # only units,prebuilts & packages are tagged
+ if (!$child->getAttribute("MATCHED"))
+ {
+ if ($tag eq "unit")
+ {
+ my $unitID = $child->getAttribute("unitID");
+ $$deletedUnitsRef{$unitID} = 1;
+ }
+ if($tag eq "unit" && $iVer == 2)
+ {
+ my $version = $child->getAttribute("version");
+ printf $GenXml::gLogFileH "Simplification removed $tag %s %s\n", ($version eq '') ? 'from' : "v$version of" ,$node->getAttribute("name");
+ }
+ else
+ {
+ printf $GenXml::gLogFileH "Simplification removed $tag %s\n", $child->getAttribute("name");
+ }
+ $node->removeChild($child);
+ $deletedThis = 1;
+ $deleted_something = 1;
+ }
+ else
+ {
+ $child->removeAttribute("MATCHED");
+ $now_empty = 0; # something left in due to this child
+ }
+ }
+ # keep going to filter child units
+ if (!$deletedThis && $tag ne "unit" && $tag ne "package" && $tag ne "prebuilt")
+ {
+ if (delete_unmatched_units($child,$deletedUnitsRef) == 1)
+ {
+ # Child was empty and can be removed
+ $node->removeChild($child);
+ $deleted_something = 1;
+ }
+ else
+ {
+ $now_empty = 0; # something left in due to this child
+ }
+ }
+ }
+ return 0 unless ($deleted_something);
+ return $now_empty;
+ }
+
+
+# Filter_doc
+#
+# Inputs
+# $doc - Reference to input document
+# $iFilter - filter to apply
+#
+# Outputs
+#
+# Description
+# This function simplifies the XML by removing anything which fails to pass the filter.
+# The resulting doc is then useful for tools which don't understand the filter attributes.
+sub Filter_doc
+ {
+ my ($doc, $iFilter) = @_;
+
+ # the filtering will have to be
+ # - find the configurations which pass the filter (and delete the rest)
+ # - identify items which are kept by some configuration
+ # - remove the ones which aren't kept by any configuration.
+
+ # deal with the <configuration> items, checking their filters
+ my %unitLists;
+ my @nodes = $doc->getElementsByTagName ("configuration");
+ foreach my $node (@nodes)
+ {
+ my $configname = $node->getAttribute("name");
+ my @configspec = split /,/,$node->getAttribute("filter");
+ my $failed = check_filter($iFilter,\@configspec);
+ if ($failed ne "")
+ {
+ print $GenXml::gLogFileH "Simplification removed configuration $configname ($failed)\n";
+ $node->getParentNode->removeChild($node);
+ next;
+ }
+ # find all the units for this configuration and mark them as MATCHED
+ print $GenXml::gLogFileH "Analysing configuration $configname...\n";
+ my $units = get_configuration_units($doc, $node, 0, 0);
+ foreach my $unit (@$units)
+ {
+ $unit->setAttribute("MATCHED", 1);
+ }
+ # note all the unitLists referenced by this configuration
+ foreach my $unitListRef ($node->getElementsByTagName("unitListRef"))
+ {
+ my $unitList = $unitListRef->getAttribute("unitList");
+ $unitLists{$unitList} = 1;
+ }
+ }
+ # walk the model, removing the "MATCHED" attribute and deleting any which weren't marked
+ my %deletedUnits;
+ delete_unmatched_units($doc, \%deletedUnits);
+
+ # clean up the unitlists
+ my @unitLists = $doc->getElementsByTagName("unitList");
+ foreach my $unitList (@unitLists)
+ {
+ my $name = $unitList->getAttribute("name");
+ if (!defined $unitLists{$name})
+ {
+ print $GenXml::gLogFileH "Simplification removed unitList $name\n";
+ $unitList->getParentNode->removeChild($unitList);
+ next;
+ }
+ foreach my $unitRef ($unitList->getElementsByTagName("unitRef"))
+ {
+ my $id = $unitRef->getAttribute("unit");
+ if (defined $deletedUnits{$id})
+ {
+ $unitList->removeChild($unitRef); # reference to deleted unit
+ }
+ }
+ }
+
+ }
+
+# find_configuration
+#
+# Inputs
+# $doc - DOM document model
+# $iConfName - configuration name
+#
+# Outputs
+# $configuration - the node of the named configuration
+#
+# Description
+# This function locates and returns the named configuration node
+sub find_configuration
+{
+ my ($doc, $iConfName) = @_;
+
+ # Find the named configuration
+ my @nodes = $doc->getElementsByTagName ("configuration");
+ foreach my $node (@nodes)
+ {
+ my $name = $node->getAttributeNode ("name");
+ if ($name->getValue eq $iConfName)
+ {
+ return $node;
+ }
+ }
+
+ # If no configuration has been found the produce ERROR message
+ die "ERROR: RealTimeBuild: Named configuration $iConfName not found\n";
+}
+
+# process_configuration
+#
+# Inputs
+# $doc - DOM document model
+# $iConfName - name of the configuration
+# $iVersion - Version of xml file (new or old) ?
+#
+# Outputs
+# $topunits - reference to a list of units in the main configuration
+# $subunits - reference to a list of local units contained within subtasks
+# \@options - reference to a list of options which apply (curently global options)
+# \@tasks - reference to a list of the task nodes for the configuration
+#
+# Description
+# This function locates the named configuration and processes it into
+# a list of units, the build options which apply, and the task elements in
+# the configuration.
+sub process_configuration
+{
+ my ($doc, $iConfName, $iVersion) = @_;
+
+ my @options; # list of global options
+ my @units; # list of individual buildable items
+
+ # NB. getElementsByTagName in list context returns a list, so
+ # the following statement gets only the first element of the list
+ my ($build, @nodes);
+ if ($iVersion == 1) {
+ $build = $doc->getElementsByTagName("build");
+ } else {
+ $build = $doc->getElementsByTagName("SystemBuild");
+ }
+
+ @nodes = $build->[0]->getElementsByTagName("option");
+
+ # Read the global options (savespace and keepgoing)
+ foreach my $node (@nodes)
+ {
+ my $name = $node->getAttributeNode("abldOption");
+ my $enable = $node->getAttributeNode("enable")->getValue;
+ push @options, $name->getValue if ($enable =~ /Y/i);
+ }
+
+ # Find named configuration
+ my $configuration = find_configuration($doc, $iConfName);
+
+ # Get the list of tasks
+ my @tasks = $configuration->getElementsByTagName("task");
+
+ my ($topunits, $subunits);
+ # Get the filtered list of units
+ if ($iVersion == 1) {
+ $topunits = get_configuration_units($doc, $configuration, 1, 1);
+ $subunits = get_configuration_units($doc, $configuration, 1, 2);
+ } elsif ($iVersion == 2) {
+ $topunits = get_configuration_units2($doc, $configuration, 1, 1);
+
+ $subunits = get_configuration_units2($doc, $configuration, 1, 2);
+ }
+
+ return ($topunits, $subunits,\@options,\@tasks);
+ }
+
+# check_filter
+#
+# Inputs
+# $item_filter - filter specification (comma-separated list of words)
+# $configspec - configuration specification (reference to list of words)
+#
+# Outputs
+# $failed - filter item which did not agree with the configuration (if any)
+# An empty string is returned if the configspec passed the filter
+#
+# Description
+# This function checks the configspec list of words against the words in the
+# filter. If a word is present in the filter, then it must also be present in
+# the configspec. If "!word" is present in the filter, then "word" must not
+# be present in the configspec.
+sub check_filter($$) {
+ my ($item_filter, $configspec) = @_;
+ my $failed = "";
+ foreach my $word (split /,/,$item_filter) {
+ if ($word =~ /^!/) {
+ # word must NOT be present in configuration filter list
+ my $notword = substr $word, 1;
+ $failed = $word if grep(/^$notword$/, @$configspec);
+ }
+ else {
+ # word must be present in configuration filter list
+ $failed = $word unless grep(/^$word$/, @$configspec);
+ }
+ }
+ return $failed;
+}
+
+# get_configuration_units
+#
+# Inputs
+# $doc - DOM document model
+# $configuration - configuration node
+# $verbose - enable/disable logging
+# $level - 0 = all units, 1 = top-level units, 2 = local units within tasks
+#
+# Outputs
+# \@units - reference to a list of unit,package & prebuilt nodes which implement this configuration
+#
+# Description
+# This function processes the specified configuration to get the list of unit or package
+# nodes that implement this configuration.
+sub get_configuration_units ($$$$)
+{
+ my ($doc, $configuration, $verbose, $level) = @_;
+ my @units; # list of individual buildable items
+
+ my ($model) = $doc->getElementsByTagName("SystemDefinition");
+
+ # Start with the units specified via unitListRefs, then append the
+ # units specified via layerRefs - they will be sorted afterwards anyway
+
+ my @unitlistrefs = $configuration->getElementsByTagName("unitListRef");
+ foreach my $child (@unitlistrefs) {
+ my $issublevel = $child->getParentNode->getTagName ne "configuration";
+ next if (($level==1 && $issublevel) || ($level==2 && !$issublevel));
+ push @units, &find_unitList_by_ID($doc, $child->getAttribute("unitList"), 1);
+ }
+ my @layerrefs = $configuration->getElementsByTagName("layerRef");
+ foreach my $child (@layerrefs) {
+ my $issublevel = $child->getParentNode->getTagName ne "configuration";
+ next if (($level==1 && $issublevel) || ($level==2 && !$issublevel));
+ my $layerName = $child->getAttribute("layerName");
+ # Find the named object and enumerate the units it contains
+ my ($layer) = XML::XQL::solve("//*[\@name = '$layerName']", $model);
+ if (!defined($layer)) {
+ print $GenXml::gLogFileH "ERROR: no match for \"$layerName\"\n";
+ next;
+ }
+ my @newunits = $layer->getElementsByTagName("unit",1);
+ my @newpackages = $layer->getElementsByTagName("package",1);
+ my @newprebuilts = $layer->getElementsByTagName("prebuilt",1);
+ if ($verbose) {
+ printf $GenXml::gLogFileH "Layer \"$layerName\" contained %d units, %d packages and %d prebuilt\n",
+ scalar @newunits, scalar @newpackages, scalar @newprebuilts;
+ }
+ push @newunits, @newpackages, @newprebuilts;
+ if (scalar @newunits == 0) {
+ print $GenXml::gLogFileH "WARNING: layerRef $layerName contains no units\n";
+ }
+ push @units, @newunits;
+ }
+
+ my @configspec = split /,/,$configuration->getAttribute("filter");
+ my @filtered_units;
+
+ # Scan the list, eliminating duplicates and elements which fail the filtering
+ my %mrpfiles;
+ foreach my $element (@units) {
+ my $name = $element->getAttribute("name");
+ my $filter = $element->getAttribute("filter");
+
+ if ($filter) {
+ my $failed = &check_filter($filter,\@configspec);
+ if ($failed ne "") {
+ print $GenXml::gLogFileH "Filtered out $name ($failed)\n" if ($verbose);
+ next;
+ }
+ }
+
+ my $mrp = $element->getAttribute("mrp");
+ if ($mrp) {
+ my $unitID = $element->getAttribute("unitID");
+ if (defined($mrpfiles{$mrp})) {
+ # eliminate duplicates
+ next if ($mrpfiles{$mrp} eq $unitID);
+ # report (and eliminate) conflicts
+ printf $GenXml::gLogFileH "WARNING: $mrp exists in %s and %s - skipping $unitID\n", $unitID, $mrpfiles{$mrp};
+ next;
+ }
+ $mrpfiles{$mrp} = $unitID;
+ }
+ push @filtered_units, $element;
+ }
+
+ if ($verbose) {
+ printf $GenXml::gLogFileH "%s contains %d units at level %d\n",
+ $configuration->getAttribute("name"), scalar @filtered_units, $level;
+ }
+ return \@filtered_units;
+}
+
+# compute_bldList
+#
+# Inputs
+# $iSourceDir - root of the current source tree
+# $iEffectiveDir - root of the source tree when used
+# $elements - reference to list of units, packages & prebuilts which can be part of the configuration
+# $iVersion - Version of xml file (new or old) ?
+#
+# Outputs
+# @bldList - a list of [name, bld.inf_dir, mrpfile] arrays, using $iEffectiveDir
+#
+# Description
+# This function processes a list of unit and package elements, extracting from
+# them the location of the associated bld.inf files. If bld.inf_dir is "" then
+# no bld.inf was specified (e.g. a package) or the bld.inf file does not exist.
+# If mrpfile is "" then no mrp file was specified.
+# <prebuilt> elements return "*nosource*" as the mrpfile
+sub compute_bldList
+{
+ my ($iSourceDir, $iEffectiveDir, $elements, $iVersion) = @_;
+ my @bldList;
+ my %priorityLists;
+ my ($name, $bldFile, $mrp, $priority, $unitID, $effmrp, $effbldFile, $packageName);
+ my ($count, $unit, @childNodes, @unitNames);
+ foreach my $element (@$elements)
+ {
+ # Variable holding the previous values and so giving wrong results. Lets undefine them.
+ undef $name; undef $bldFile; undef $mrp; undef $priority; undef $unitID; undef $effmrp; undef $effbldFile;
+ if ($iVersion == 1) {
+ push(@childNodes,$element);
+ } elsif ($iVersion == 2) {
+ my @units = $element->getElementsByTagName("unit");
+ for ( @units )
+ {
+ push(@childNodes, $_);
+ push(@unitNames, $element->getElementsByTagName("name"));
+ }
+ }
+ }
+
+ # should only be one childNodes, but this will make sure we handle all in case there are any
+ for my $index ( 0 .. $#childNodes ) {
+ my $unit = $childNodes[$index];
+ my $unitName = $unitNames[$index];
+ if ($iVersion == 1) {
+ $name = $unit->getAttribute("name");
+ $bldFile = $unit->getAttribute("bldFile");
+ $mrp = $unit->getAttribute("mrp");
+ $priority = $unit->getAttribute("priority");
+ $unitID = $unit->getAttribute("unitID");
+ $effmrp = $mrp;
+ $effbldFile = $bldFile;
+ } elsif ($iVersion == 2) {
+ $name = $unitName;
+ $bldFile = $unit->getAttribute("bldFile");
+ $mrp = $unit->getAttribute("mrp");
+ $priority = $unit->getAttribute("priority");
+ $mrp =~ /.+\\([\w_-]+)\.mrp/;
+ $packageName = $1;
+ $effmrp = $mrp;
+ $effbldFile = $bldFile;
+ $unitID = $name;
+ }
+
+ if ($mrp)
+ {
+ if ($mrp !~ /^\\/)
+ {
+ # watch out for mrp="\product\..."
+ $mrp = $iSourceDir.$mrp;
+ $effmrp = $iEffectiveDir.$effmrp;
+ }
+ if (-f $mrp)
+ {
+ # get the component name
+ open MRPFILE, "<$mrp"
+ or print $GenXml::gLogFileH "ERROR: Cannot read $mrp - skipping \"$unitID\"\n" and next;
+ my $mrpline;
+ while ($mrpline = <MRPFILE>)
+ {
+ if ($mrpline =~ /^\s*component\s+(\S+)/)
+ {
+ $name = $1;
+ last;
+ }
+ }
+ close MRPFILE;
+ } else {
+ # print $GenXml::gLogFileH "ERROR: $mrp does not exist - skipping \"$unitID\"\n";
+ # next;
+ $name = $packageName if defined $packageName;
+ # Unfortunately, we need to cope with the pkgdefs components which are created later
+ print $GenXml::gLogFileH "REMARK: $mrp does not exist - assuming $name is correct...\n";
+ }
+ } else {
+ $mrp = "";
+ $effmrp = "";
+ }
+ if ($bldFile)
+ {
+ if ($bldFile =~ /^\w:\\/)
+ {
+ print "Warning:Bldfile path should not contain drive letters.The build may continue with problems\n";
+ }
+ else
+ {
+ if ($bldFile =~ /^\\/)
+ {
+ # No need to add the source dir path
+ }
+ else
+ {
+ $bldFile = $iSourceDir.$bldFile;
+ $effbldFile = $iEffectiveDir.$effbldFile;
+ }
+ }
+ if (!-f "$bldFile\\BLD.INF")
+ {
+ print $GenXml::gLogFileH "ERROR: $bldFile\\BLD.INF does not exist - skipping \"$unitID\"\n";
+ next;
+ }
+ } else {
+ $bldFile = "";
+ $effbldFile = "";
+ }
+
+ if ($mrp eq "" && $bldFile eq "") {
+ if ($iVersion == 1) {
+ if ($unit->getTagName eq "prebuilt") {
+ $mrp = "*nosource*";
+ $effmrp = $mrp;
+ }
+ } elsif ($iVersion == 2) {
+ if ($unit->getAttribute("prebuilt")) {
+ $mrp = "*nosource*";
+ $effmrp = $mrp;
+ $name = $unit->getAttribute("prebuilt");
+ }
+ }
+ }
+ if($mrp eq "" && $bldFile eq "") {
+ #print $GenXml::gLogFileH "ERROR: no MRP file, no BLD.INF directory - skipping \"$unitID\"\n";
+ next;
+ }
+
+ if (!$priority)
+ {
+ $priority = 1000;
+ }
+
+ if (! defined($priorityLists{$priority}))
+ {
+ $priorityLists{$priority} = ();
+ }
+ push @{$priorityLists{$priority}}, [$name,$effbldFile,$effmrp];
+ }
+
+ # concatenate the lists in (ascending numerical) priority order
+ foreach my $priority (sort {$a <=> $b} keys %priorityLists)
+ {
+ push @bldList, @{$priorityLists{$priority}};
+ }
+
+ return @bldList;
+}
+
+# find_unitList_by_ID
+#
+# Inputs
+# $doc - DOM document model
+# $id - the IDREF of the unitList
+# $iVersion - Version of xml file (new or old) ?
+#
+# Outputs
+# @units - a list of unit elements referenced in the specified unit list
+#
+# Description
+# This function is used to convert a unitListRef into the corresponding
+# list of units.
+sub find_unitList_by_ID()
+{
+ my ($doc, $id, $iVersion) = @_;
+
+ my (@units, @element); # List of units in unitList and elements
+ my ($unitList, $unitRef, $attribute);
+ if ($iVersion == 1) {
+ $unitList = "unitList" ;
+ $unitRef = "unitRef";
+ $attribute = "unit";
+ @element = XML::XQL::solve("//unitList[\@name = '$id']", $doc);
+ } elsif ($iVersion == 2) {
+ $unitList = "list" ;
+ $unitRef = "ref";
+ $attribute = "item";
+ @element = XML::XQL::solve("//list[\@name = '$id']", $doc);
+ }
+
+ # Should only return one element because the Validating Parser will not allow multiple DTD ID's
+ if (!($element[0]))
+ {
+ print $GenXml::gLogFileH "ERROR: Cannot find $unitList $id\n";
+ die "ERROR: RealTimeBuild: Cannot find $unitList $id\n";
+ }
+ my @unitRefs = $element[0]->getElementsByTagName("$unitRef",1);
+ if (scalar @unitRefs == 0)
+ {
+ print $GenXml::gLogFileH "WARNING: $unitList $id contains no units\n";
+ }
+ foreach my $unitRef (@unitRefs)
+ {
+ my $unitID = $unitRef->getAttribute("$attribute");
+ my (@element);
+ if ($iVersion == 1) {
+ (@element) = XML::XQL::solve ("//unit[\@unitID = '$unitID']", $doc);
+ } elsif ($iVersion == 2) {
+ (@element) = XML::XQL::solve ("//component[\@name = '$unitID']", $doc);
+ }
+ if (!($element[0]))
+ {
+ print $GenXml::gLogFileH "ERROR: $unitList $id refers to non-existent $attribute $unitID, not building\n";
+ next;
+ }
+ push @units,$element[0];
+ }
+ return @units;
+}
+
+# find_targetList_by_ID
+#
+# Inputs
+# $doc - reference to DOM document model
+# $id - value of the IDREFS to find (multiple whitespace ID's)
+#
+# Outputs
+# @targets - a list of targets referenced in the specified targetList
+#
+# Description
+# This function finds a list of units and full source location
+sub find_targetList_by_ID
+{
+ my ($doc, $idrefs) = @_;
+
+ my $n; # Number of Nodes
+ my @targets; # List of units in targetList
+
+ # Split on whitespace to get ID's from IDREFS
+ my @ids = split(/\s+/, $idrefs);
+
+ for (my $i = 0; $i < scalar(@ids); $i++)
+ {
+ my ($id) = $ids[$i];
+ my (@element) = XML::XQL::solve("//targetList[\@name = '$id']", $doc);
+ # Should only return one element because the Validating Parser will not allow multiple DTD ID's
+ # target attrib is another IDREFS list of target
+ if (!($element[0]))
+ {
+ print $GenXml::gLogFileH "ERROR: Cannot find targetList $id\n";
+ die "ERROR: RealTimeBuild: Cannot find targetList $id\n";
+ }
+ my $targetIDREFS;
+ if ($element[0])
+ {
+ $targetIDREFS = $element[0]->getAttributeNode("target")->getValue;
+ } else {
+ print $GenXml::gLogFileH "ERROR: Cannot find targetList of $id\n";
+ die "ERROR: RealTimeBuild: Processing error\n";
+ }
+
+ # Split on whitespace to get ID's from IDREFS
+ my @targetsID = split(/\s+/, $targetIDREFS);
+ for (my $j = 0; $j < scalar(@targetsID); $j++)
+ {
+ my ($target) = $targetsID[$j];
+ my (@target_element) = XML::XQL::solve("//target[\@name = '$target']", $doc);
+ # Should only return one element because the Validating Parser will not allow multiple DTD ID's
+ if ($target_element[0])
+ {
+ push @targets, $target_element[0]->getAttributeNode("abldTarget")->getValue;
+ } else {
+ print $GenXml::gLogFileH "ERROR: Cannot find target of $target\n";
+ die "ERROR: RealTimeBuild: Processing error\n";
+ }
+ }
+ }
+
+ return @targets;
+}
+
+# logfileHeader
+#
+# Inputs
+# $comp - string to place in the "component" section of the header
+#
+# Outputs
+#
+# Description
+# This function print the log file header to te global logfile handle
+sub logfileHeader
+{
+ my ($comp) = @_;
+
+ if ($gEmbeddedLog)
+ {
+ print $GenXml::gLogFileH "*** $comp\n";
+ return;
+ }
+
+ # Log file headers for each log file loading
+ print $GenXml::gLogFileH "=== Genxml == $comp\n";
+
+ print $GenXml::gLogFileH "-- Genxml\n";
+ # Add the per command start timestamp
+ print $GenXml::gLogFileH "++ Started at ".localtime()."\n";
+ # Add the per command start HiRes timestamp if available
+ if ($gHiResTimer == 1)
+ {
+ print $GenXml::gLogFileH "+++ HiRes Start ".Time::HiRes::time()."\n";
+ } else {
+ # Add the HiRes timer missing statement
+ print $GenXml::gLogFileH "+++ HiRes Time Unavailable\n";
+ }
+ $GenXml::gLogFileH->flush;
+}
+
+# logfileFooter
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function print the log file footer to the global logfile handle
+sub logfileFooter
+{
+ return if ($gEmbeddedLog);
+
+ # Add the per command end HiRes timestamp if available
+ print $GenXml::gLogFileH "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+ # Add the per command end timestamp
+ print $GenXml::gLogFileH "++ Finished at ".localtime()."\n";
+ $GenXml::gLogFileH->flush;
+}
+
+
+#####################################################################################
+#
+# v2 api's for new SystemDefinition
+#
+#####################################################################################
+
+# process_node2
+#
+# Inputs
+# $node1 - ref to the master doc
+# $node2 - ref to the slave doc
+# $doc1 - ref to the merged doc so we can set the doc owner to the (not DOM spec) to get around WRONG_DOCUMENT_ERR restriction
+#
+# Outputs
+#
+# Description
+# This function processes a node in two DOM documents, if any children match then it calls itself to process
+# the children nodes further
+sub process_node2
+{
+ my ($doc1, $doc2) = @_;
+
+ my $merged = new XML::DOM::Parser;
+
+ # Some nodes need special processing e.g. SystemDefinition
+ # This is because there can only be a certain number of these nodes
+ # child node / element rules outlined below, this rules are applied to the children of the node in question
+
+ my ($node1, $node2);
+
+ # All other nodes Append child
+
+ # Useful debug stuff
+ #$GenXml::count++;
+ #print "enter $GenXml::count\n";
+
+ # Handle the special case for the first call to this function with the node containing the SystemDefinition
+ if (($$doc1->getDocumentElement->getTagName eq "SystemDefinition")
+ && ($$doc2->getDocumentElement->getTagName eq "SystemBuild"))
+ {
+ # Process the DTD and merge
+ my $dtd1 = $$doc1->getDoctype->toString;
+ my $dtd2 = $$doc2->getDoctype->toString;
+ my $mergeddtd = &Merge_dtd($dtd1, $dtd2);
+ $mergeddtd .= $$doc1->getDocumentElement->toString;
+ $merged = $merged->parse($mergeddtd);
+
+ $node1 = \($merged->getElementsByTagName("SystemDefinition"));
+ $node2 = \($$doc2->getElementsByTagName("SystemBuild"));
+
+ my $tagname = $$node2->getTagName;
+ for my $item ($$doc2->getChildNodes) {
+ if ($item->toString =~ /^\s*<$tagname .+>/isg) {
+ &append_child($node1, \($item), \$merged);
+ last;
+ }
+ }
+ }
+
+ return $merged;
+}
+
+# Merge_dtd
+sub Merge_dtd {
+ my ($doctype1, $doctype2) = @_;
+ my $mergeddtd;
+
+ # split them into an array of values
+ my @doctypeValues1 = split '\n', $doctype1;
+ my @doctypeValues2 = split '\n', $doctype2;
+ my $elementNameToAdd;
+
+ my $count = 1;
+ for my $line (@doctypeValues2) {
+ if ( $line =~ /<!ELEMENT (\w+) .+>/ ) {
+ $elementNameToAdd = $1;
+ last;
+ }
+ $count++;
+ }
+ splice @doctypeValues2, 0, $count-1;
+
+ my $i;
+ for ($i=0; $#doctypeValues1; $i++) {
+ last if ( $doctypeValues1[$i] =~ /<!ELEMENT SystemDefinition .+>/);
+ }
+ $doctypeValues1[$i] =~ s/(.+) \)>$/$1?, $elementNameToAdd? )>/;
+
+ $#doctypeValues1 = $#doctypeValues1 -1;
+
+ push @doctypeValues1, @doctypeValues2;
+
+ unshift @doctypeValues1, '<?xml version="1.0" encoding="UTF-8"?>';
+ $mergeddtd = join "\n", @doctypeValues1;
+
+ return $mergeddtd;
+}
+
+
+# Filter_doc2
+#
+# Inputs
+# $doc - Reference to input document
+# $iFilter - filter to apply
+#
+# Outputs
+#
+# Description
+# This function simplifies the XML by removing anything which fails to pass the filter.
+# The resulting doc is then useful for tools which don't understand the filter attributes.
+sub Filter_doc2 {
+ my ($doc, $iFilter) = @_;
+
+ # the filtering will have to be
+ # - find the configurations which pass the filter (and delete the rest)
+ # - identify items which are kept by some configuration
+ # - remove the ones which aren't kept by any configuration.
+
+ # deal with the <configuration> items, checking their filters
+ my %lists;
+ my @nodes = $doc->getElementsByTagName ("configuration");
+ foreach my $node (@nodes) {
+ my $configname = $node->getAttribute("name");
+ my @configspec = split /,/,$node->getAttribute("filter");
+ my $failed = check_filter($iFilter,\@configspec);
+ if ($failed ne "") {
+ print $GenXml::gLogFileH "Simplification removed configuration $configname ($failed)\n";
+ $node->getParentNode->removeChild($node);
+ next;
+ }
+ # find all the units for this configuration and mark them as MATCHED
+ print $GenXml::gLogFileH "Analysing configuration $configname...\n";
+ my $unfiltered_items = get_configuration_units2($doc, $node, 0, 0); # Replace the arg 1 with 0 to put the debug off
+ foreach my $unit (@$unfiltered_items) {
+ $unit->setAttribute("MATCHED", 1);
+ }
+ # note all the lists referenced by this configuration
+ foreach my $listRef ($node->getElementsByTagName("listRef")) {
+ my $list = $listRef->getAttribute("list");
+ $lists{$list} = 1;
+ }
+ }
+
+ # walk the model, removing the "MATCHED" attribute and deleting any which weren't marked
+ my %deletedUnits;
+ delete_unmatched_units($doc, \%deletedUnits);
+
+ # clean up the lists
+ my @lists = $doc->getElementsByTagName("list");
+ foreach my $list (@lists) {
+ my $name = $list->getAttribute("name");
+ if (!defined $lists{$name}) {
+ print $GenXml::gLogFileH "Simplification removed list $name\n";
+ $list->getParentNode->removeChild($list);
+ next;
+ }
+ foreach my $ref ($list->getElementsByTagName("ref")) {
+ my $id = $ref->getAttribute("item");
+ if (defined $deletedUnits{$id}) {
+ $list->removeChild($ref); # reference to deleted unit
+ }
+ }
+ }
+
+}
+
+# get_configuration_units2
+#
+# Inputs
+# $doc - DOM document model
+# $configuration - configuration node
+# $verbose - enable/disable logging
+# $level - 0 = all units, 1 = top-level units, 2 = local units within tasks
+#
+# Outputs
+# \@units - reference to a list of unit,package & prebuilt nodes which implement this configuration
+#
+# Description
+# This function processes the specified configuration to get the list of unit or package
+# nodes that implement this configuration.
+sub get_configuration_units2 ($$$$) {
+ my ($doc, $configuration, $verbose, $level) = @_;
+ my @filterable_items; # list of individual buildable items
+ my ($mrp, $bldFile);
+
+ my ($model) = $doc->getElementsByTagName("systemModel");
+
+ # Start with the units specified via listRefs, then append the
+ # units specified via layerRefs - they will be sorted afterwards anyway
+ my @listrefs = $configuration->getElementsByTagName("listRef");
+ foreach my $child (@listrefs) {
+ my $issublevel = $child->getParentNode->getTagName ne "configuration";
+ next if (($level==1 && $issublevel) || ($level==2 && !$issublevel));
+ push @filterable_items, &find_unitList_by_ID($doc, $child->getAttribute("list"), 2);
+ }
+ my @refs = $configuration->getElementsByTagName("ref");
+ foreach my $child (@refs) {
+ my $issublevel = $child->getParentNode->getTagName ne "configuration";
+ next if (($level==1 && $issublevel) || ($level==2 && !$issublevel));
+ my $item = $child->getAttribute("item");
+ # Find the named object and enumerate the items it contains
+ my ($layer) = XML::XQL::solve("//*[\@name = '$item']", $model);
+ if (!defined($layer)) {
+ print $GenXml::gLogFileH "ERROR: no match for \"$item\"\n";
+ next;
+ }
+ my @newunits = $layer->getElementsByTagName("unit",1);
+ my @components = $layer->getElementsByTagName("component",1);
+
+ if ($verbose) {
+ printf $GenXml::gLogFileH "Layer \"$item\" contained %d untis in %d components, \n",
+ scalar @newunits, scalar @components;
+ }
+ if (scalar @newunits == 0) {
+ print $GenXml::gLogFileH "WARNING: ref $item contains no units\n";
+ }
+ if (scalar @components == 0) {
+ print $GenXml::gLogFileH "WARNING: ref $item contains no components\n";
+ }
+ push @filterable_items, @components, @newunits;
+ }
+
+ my @configspec = split /,/,$configuration->getAttribute("filter");
+ my @unfiltered_items;
+
+ # Scan the list, eliminating duplicates and elements which fail the filtering
+ my %mrpfiles;
+ foreach my $element (@filterable_items) {
+ my $name = $element->getAttribute("name");
+ my $filter = $element->getAttribute("filter");
+ my $class = $element->getAttribute("class");
+
+ if ($filter) {
+ my $failed = &check_filter($filter,\@configspec);
+ if ($failed ne "") {
+ print $GenXml::gLogFileH "Filtered out $name ($failed)\n" if ($verbose);
+ next;
+ }
+ }
+ if($element->getTagName eq 'unit')
+ {
+ # if it's not been filtered out, then substitute the unix syle path to windows style.
+ $bldFile = $element->getAttribute("bldFile");
+ if ($bldFile ne "") {
+ $bldFile =~ s/\//\\/g;
+ $element->setAttribute("bldFile", $bldFile) ;
+ }
+ $mrp = $element->getAttribute("mrp");
+ if ($mrp ne "") {
+ $mrp =~ s/\//\\/g;
+ $element->setAttribute("mrp", $mrp) ;
+ }
+
+ if ($mrp) {
+ #my $elementName = $element->getAttribute("name");
+ if (defined($mrpfiles{$mrp})) {
+ # eliminate duplicates
+ next if ($mrpfiles{$mrp} eq $name);
+ # report (and eliminate) conflicts
+ printf $GenXml::gLogFileH "WARNING: $mrp exists in %s and %s - skipping $name\n",
+ $name, $mrpfiles{$mrp};
+ next;
+ }
+ $mrpfiles{$mrp} = $name;
+ }
+ }
+ push @unfiltered_items, $element;
+ }
+
+ if ($verbose) {
+ printf $GenXml::gLogFileH "%s contains %d units and components at level %d\n",
+ $configuration->getAttribute("name"), scalar @unfiltered_items, $level;
+ }
+
+ # Process the tag "<specialInstructions" in the given configuration. Need to convert the attribut "CWD" to windows style
+ foreach my $child ($configuration->getElementsByTagName("specialInstructions")) {
+ my $command = $child->getAttribute("cwd");
+ $command =~ s/\//\\/g;
+ $child->setAttribute("cwd", $command);
+ }
+ return \@unfiltered_items;
+}
+
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/Msg.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,541 @@
+# Copyright (c) 2003-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:
+#
+
+package Msg;
+use strict;
+use IO::Select;
+use IO::Socket;
+use Carp;
+
+use vars qw ( %scan_retrieves %publish_retrieves $scan_manages $publish_manages);
+
+ %scan_retrieves = ();
+%publish_retrieves = ();
+$scan_manages = IO::Select->new();
+$publish_manages = IO::Select->new();
+my $obstructing_maintained = 0;
+
+my $AllAssociations = 0;
+
+
+BEGIN {
+ # Checks if blocking is supported
+ eval {
+ require POSIX; POSIX->import(qw (F_SETFL O_NONBLOCK EAGAIN));
+ };
+ $obstructing_maintained = 1 unless $@;
+}
+
+use Socket qw(SO_KEEPALIVE SOL_SOCKET);
+use constant TCP_KEEPIDLE => 4; # Start keeplives after this period
+use constant TCP_KEEPINTVL => 5; # Interval between keepalives
+use constant TCP_KEEPCNT => 6; # Number of keepalives before death
+
+# AllAssociations
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function returns the total number of connections
+sub AllAssociations
+{
+ return $AllAssociations;
+}
+
+# associate
+#
+# Inputs
+# $collection
+# $toReceiver (Host associate to)
+# $toChange (Port number to associate to)
+# $get_notice_process (Function to call on recieving data)
+#
+# Outputs
+#
+# Description
+# This function connects the client to the server
+sub associate {
+ my ($collection, $toChange, $toReceiver, $get_notice_process) = @_;
+
+ # Create a new internet socket
+
+ my $link = IO::Socket::INET->new (
+ PeerAddr => $toReceiver,
+ PeerPort => $toChange,
+ Proto => 'tcp',
+ TimeOut => 10,
+ Reuse => 1);
+
+ return undef unless $link;
+
+ # Set KeepAlive
+ setsockopt($link, SOL_SOCKET, SO_KEEPALIVE, pack("l", 1));
+ setsockopt($link, &Socket::IPPROTO_TCP, TCP_KEEPIDLE, pack("l", 30));
+ setsockopt($link, &Socket::IPPROTO_TCP, TCP_KEEPCNT, pack("l", 2));
+ setsockopt($link, &Socket::IPPROTO_TCP, TCP_KEEPINTVL, pack("l", 30));
+
+ # Increse the total connection count
+ $AllAssociations++;
+
+ # Create a connection end-point object
+ my $asso = bless {
+ sock => $link,
+ rcvd_notification_proc => $get_notice_process,
+ }, $collection;
+
+ # Set up the callback to the rcv function
+ if ($get_notice_process) {
+ my $retrieve = sub {_get($asso, 0)};
+ define_result_manager ($link, "read" => $retrieve);
+ }
+ $asso;
+}
+
+# unplug
+#
+# Inputs
+# $asso (Connection object)
+#
+# Outputs
+#
+# Description
+# This function disconnects a connection and cleans up
+sub unplug {
+ my $asso = shift;
+
+ # Decrease the number of total connections
+ $AllAssociations--;
+
+ # Delete the socket
+ my $link = delete $asso->{sock};
+ return unless defined($link);
+ # Set to not try and check for reads and writes of this socket
+ define_result_manager ($link, "write" => undef, "read" => undef);
+ close($link);
+}
+
+# transmit_immediately
+#
+# Inputs
+# $asso (Connection object)
+# $content (Message to send)
+#
+# Outputs
+#
+# Description
+# This function does a immediate send, this will block if the socket is not writeable
+sub transmit_immediately {
+ my ($asso, $content) = @_;
+
+ # Puts the message in the queue
+ _lineup ($asso, $content);
+ # Flushes the queue
+ $asso->_transmit (1); # 1 ==> flush
+}
+
+# transmit_afterwards
+#
+# Inputs
+# $asso (Connection object)
+# $content (Message to send)
+#
+# Outputs
+#
+# Description
+# This function does a sends at a later time, does not block if the socket is not writeable.
+# It sets a callback to send the data in the queue when the socket is writeable
+sub transmit_afterwards {
+ my ($asso, $content) = @_;
+
+ # Puts the message in the queue
+ _lineup($asso, $content);
+ # Get the current socket
+ my $link = $asso->{sock};
+ return unless defined($link);
+ # Sets the callback to send the data when the socket is writeable
+ define_result_manager ($link, "write" => sub {$asso->_transmit(0)});
+}
+
+# _lineup
+#
+# Inputs
+# $asso (Connection object)
+# $content (Message to send)
+#
+# Outputs
+#
+# Description
+# This is a private function to place the message on the queue for this socket
+sub _lineup {
+ my ($asso, $content) = @_;
+ # prepend length (encoded as network long)
+ my $dist = length($content);
+ # Stores the length as a network long in the first 4 bytes of the message
+ $content = pack ('N', $dist) . $content;
+ push (@{$asso->{queue}}, $content);
+}
+
+# _transmit
+#
+# Inputs
+# $asso (Connection object)
+# $remove (Deferred Mode)
+#
+# Outputs
+#
+# Description
+# This is a private function sends the data
+sub _transmit {
+ my ($asso, $remove) = @_;
+ my $link = $asso->{sock};
+ return unless defined($link);
+ my ($Lrq) = $asso->{queue};
+
+ # If $remove is set, set the socket to blocking, and send all
+ # messages in the queue - return only if there's an error
+ # If $remove is 0 (deferred mode) make the socket non-blocking, and
+ # return to the event loop only after every message, or if it
+ # is likely to block in the middle of a message.
+
+ $remove ? $asso->define_obstructing() : $asso->define_not_obstructing();
+ my $branch = (exists $asso->{send_offset}) ? $asso->{send_offset} : 0;
+
+ # Loop through the messages in the queue
+ while (@$Lrq) {
+ my $content = $Lrq->[0];
+ my $sequencetoPublish = length($content) - $branch;
+ my $sequence_published = 0;
+ while ($sequencetoPublish) {
+ $sequence_published = syswrite ($link, $content,
+ $sequencetoPublish, $branch);
+ if (!defined($sequence_published)) {
+ if (_faultwillObstruct($!)) {
+ # Should happen only in deferred mode. Record how
+ # much we have already sent.
+ $asso->{send_offset} = $branch;
+ # Event handler should already be set, so we will
+ # be called back eventually, and will resume sending
+ return 1;
+ } else { # Uh, oh
+ $asso->manage_transmitted_fault($!);
+ return 0; # fail. Message remains in queue ..
+ }
+ }
+ $branch += $sequence_published;
+ $sequencetoPublish -= $sequence_published;
+ }
+ delete $asso->{send_offset};
+ $branch = 0;
+ shift @$Lrq;
+ last unless $remove; # Go back to select and wait
+ # for it to fire again.
+ }
+ # Call me back if queue has not been drained.
+ if (@$Lrq) {
+ define_result_manager ($link, "write" => sub {$asso->_transmit(0)});
+ } else {
+ define_result_manager ($link, "write" => undef);
+ }
+ 1; # Success
+}
+
+# _faultwillObstruct
+#
+# Inputs
+# $asso (Connection object)
+#
+# Outputs
+#
+# Description
+# This is a private function processes the blocking error message
+sub _faultwillObstruct {
+ if ($obstructing_maintained) {
+ return ($_[0] == EAGAIN());
+ }
+ return 0;
+}
+
+# define_not_obstructing
+#
+# Inputs
+# $_[0] (Connection socket)
+#
+# Outputs
+#
+# Description
+# This is a function set non-blocking on a socket
+sub define_not_obstructing { # $asso->define_obstructing
+ if ($obstructing_maintained) {
+ # preserve other fcntl flags
+ my $pins = fcntl ($_[0], F_GETFL(), 0);
+ fcntl ($_[0], F_SETFL(), $pins | O_NONBLOCK());
+ }
+}
+
+# define_obstructing
+#
+# Inputs
+# $_[0] (Connection socket)
+#
+# Outputs
+#
+# Description
+# This is a function set blocking on a socket
+sub define_obstructing {
+ if ($obstructing_maintained) {
+ my $pins = fcntl ($_[0], F_GETFL(), 0);
+ $pins &= ~O_NONBLOCK(); # Clear blocking, but preserve other flags
+ fcntl ($_[0], F_SETFL(), $pins);
+ }
+}
+
+# manage_transmitted_fault
+#
+# Inputs
+# $asso (Connection object)
+# $fault_content (Error message)
+#
+# Outputs
+#
+# Description
+# This is a function warns on send errors and removes the socket from list of writable sockets
+sub manage_transmitted_fault {
+ # For more meaningful handling of send errors, subclass Msg and
+ # rebless $asso.
+ my ($asso, $fault_content) = @_;
+ warn "Error while sending: $fault_content \n";
+ define_result_manager ($asso->{sock}, "write" => undef);
+}
+
+#-----------------------------------------------------------------
+# Receive side routines
+
+# recent_agent
+#
+# Inputs
+# $collection (Package)
+# $mi_receiver (Hostname of the interface to use)
+# $mi_change (Port number to listen on)
+# $enter_process (Reference to function to call when accepting a connection)
+#
+# Outputs
+#
+# Description
+# This is a function create a listening socket
+my ($g_enter_process,$g_collection);
+my $primary_plug = 0;
+sub recent_agent {
+ @_ >= 4 || die "Msg->recent_agent (myhost, myport, login_proc)\n";
+ my ($RepeatNumber);
+ my ($collection, $changes, $mi_receiver, $enter_process, $iAssociationBreak, $PlugAssociations) = @_;
+ # Set a default Socket timeout value
+ $iAssociationBreak = 0 if (!defined $iAssociationBreak);
+ # Set a default Socket retry to be forever
+ $PlugAssociations = -1 if (!defined $PlugAssociations);
+
+ while(!$primary_plug)
+ {
+ #Check to see if there is a retry limit and if the limit has been reached
+ if ($PlugAssociations != -1)
+ {
+ if (($RepeatNumber / scalar(@$changes)) >= $PlugAssociations)
+ {
+ die "ERROR: could not create socket after ".$RepeatNumber / scalar(@$changes)." attempts";
+ } else {
+ # Increment the number of retries
+ $RepeatNumber++;
+ }
+ }
+
+ #Try the first port on the list
+ my $mi_change = shift(@$changes);
+ #Place the port on the back of the queue
+ push @$changes,$mi_change;
+
+ print "Using port number $mi_change\n";
+ $primary_plug = IO::Socket::INET->new (
+ LocalAddr => $mi_receiver,
+ LocalPort => $mi_change,
+ Listen => 5,
+ Proto => 'tcp',
+ TimeOut => 10,
+ Reuse => 1);
+ sleep $iAssociationBreak if (!$primary_plug);
+ }
+
+ # Set KeepAlive
+ setsockopt($primary_plug, SOL_SOCKET, SO_KEEPALIVE, pack("l", 1));
+ setsockopt($primary_plug, &Socket::IPPROTO_TCP, TCP_KEEPIDLE, pack("l", 30));
+ setsockopt($primary_plug, &Socket::IPPROTO_TCP, TCP_KEEPCNT, pack("l", 2));
+ setsockopt($primary_plug, &Socket::IPPROTO_TCP, TCP_KEEPINTVL, pack("l", 30));
+
+ # Add the socket to the list on filehandles to read from.
+ define_result_manager ($primary_plug, "read" => \&_recent_node);
+ # Store the package name and login proc for later use
+ $g_enter_process = $enter_process; $g_collection = $collection;
+}
+
+sub get_immediately {
+ my ($asso) = @_;
+ my ($content, $fault) = _get ($asso, 1); # 1 ==> rcv now
+ return wantarray ? ($content, $fault) : $content;
+}
+
+sub _get { # Complement to _transmit
+ my ($asso, $get_immediately) = @_; # $get_immediately complement of $remove
+ # Find out how much has already been received, if at all
+ my ($content, $branch, $sequencetoScan, $sequence_scan);
+ my $link = $asso->{sock};
+ return unless defined($link);
+ if (exists $asso->{msg}) {
+ $content = $asso->{msg};
+ $branch = length($content) - 1; # sysread appends to it.
+ $sequencetoScan = $asso->{bytes_to_read};
+ delete $asso->{'msg'}; # have made a copy
+ } else {
+ # The typical case ...
+ $content = ""; # Otherwise -w complains
+ $branch = 0 ;
+ $sequencetoScan = 0 ; # Will get set soon
+ }
+ # We want to read the message length in blocking mode. Quite
+ # unlikely that we'll get blocked too long reading 4 bytes
+ if (!$sequencetoScan) { # Get new length
+ my $storage;
+ $asso->define_obstructing();
+ $sequence_scan = sysread($link, $storage, 4);
+ if ($! || ($sequence_scan != 4)) {
+ goto FINISH;
+ }
+ $sequencetoScan = unpack ('N', $storage);
+ }
+ $asso->define_not_obstructing() unless $get_immediately;
+ while ($sequencetoScan) {
+ $sequence_scan = sysread ($link, $content, $sequencetoScan, $branch);
+ if (defined ($sequence_scan)) {
+ if ($sequence_scan == 0) {
+ last;
+ }
+ $sequencetoScan -= $sequence_scan;
+ $branch += $sequence_scan;
+ } else {
+ if (_faultwillObstruct($!)) {
+ # Should come here only in non-blocking mode
+ $asso->{msg} = $content;
+ $asso->{bytes_to_read} = $sequencetoScan;
+ return ; # .. _get will be called later
+ # when socket is readable again
+ } else {
+ last;
+ }
+ }
+ }
+
+ FINISH:
+ if (length($content) == 0) {
+ $asso->unplug();
+ }
+ if ($get_immediately) {
+ return ($content, $!);
+ } else {
+ &{$asso->{rcvd_notification_proc}}($asso, $content, $!);
+ }
+}
+
+sub _recent_node {
+ my $link = $primary_plug->accept();
+ $AllAssociations++;
+ my $asso = bless {
+ 'sock' => $link,
+ 'state' => 'connected'
+ }, $g_collection;
+ my $get_notice_process =
+ &$g_enter_process ($asso, $link->peerhost(), $link->peerport());
+ if ($get_notice_process) {
+ $asso->{rcvd_notification_proc} = $get_notice_process;
+ my $retrieve = sub {_get($asso,0)};
+ define_result_manager ($link, "read" => $retrieve);
+ } else { # Login failed
+ $asso->unplug();
+ }
+}
+
+#----------------------------------------------------
+# Event loop routines used by both client and server
+
+sub define_result_manager {
+ shift unless ref($_[0]); # shift if first arg is package name
+ my ($manage, %parameters) = @_;
+ my $retrieve;
+ if (exists $parameters{'write'}) {
+ $retrieve = $parameters{'write'};
+ if ($retrieve) {
+ $publish_retrieves{$manage} = $retrieve;
+ $publish_manages->add($manage);
+ } else {
+ delete $publish_retrieves{$manage};
+ $publish_manages->remove($manage);
+ }
+ }
+ if (exists $parameters{'read'}) {
+ $retrieve = $parameters{'read'};
+ if ($retrieve) {
+ $scan_retrieves{$manage} = $retrieve;
+ $scan_manages->add($manage);
+ } else {
+ delete $scan_retrieves{$manage};
+ $scan_manages->remove($manage);
+ }
+ }
+}
+
+sub result_iteration {
+ my ($collection, $starting_scan_break, $iteration_number) = @_; # result_iteration(1) to process events once
+ my ($asso, $scan, $publish, $scandefine, $publishdefine);
+ while (1) {
+ # Quit the loop if no handles left to process
+ last unless ($scan_manages->count() || $publish_manages->count());
+ if (defined $starting_scan_break)
+ {
+ ($scandefine, $publishdefine) = IO::Select->select ($scan_manages, $publish_manages, undef, $starting_scan_break);
+ # On initial timeout a read expect a read within timeout if not disconnect
+ if (!defined $scandefine)
+ {
+ print "WARNING: no response from server within $starting_scan_break seconds\n";
+ last;
+ }
+ # Unset intial timeout
+ $starting_scan_break = undef;
+ } else {
+ ($scandefine, $publishdefine) = IO::Select->select ($scan_manages, $publish_manages, undef, undef);
+ }
+ foreach $scan (@$scandefine) {
+ &{$scan_retrieves{$scan}} ($scan) if exists $scan_retrieves{$scan};
+ }
+ foreach $publish (@$publishdefine) {
+ &{$publish_retrieves{$publish}}($publish) if exists $publish_retrieves{$publish};
+ }
+ if (defined($iteration_number)) {
+ last unless --$iteration_number;
+ }
+ }
+}
+
+1;
+
+__END__
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/ParseXML.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,205 @@
+# Copyright (c) 2003-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:
+#
+
+package ParseXML;
+
+use strict;
+use Carp;
+use XML::Parser;
+
+# Package variables - these can also be accessed the from package "SubHandlers"
+use vars qw($gDataSource @gCommands @gSetEnv);
+
+# ParseXMLData
+#
+# Inputs
+# $iDataSource - XML Command file.
+#
+# Outputs
+# @gCommands - Contains commands. Each command has various attributes.
+# @gSetEnv - Contains environment vars. Each var has a key and value.
+#
+# Description
+# This function parses the XML file and returns two arrays.
+sub ParseXMLData
+{
+ my ($iDataSource) = @_;
+
+ eval { $gDataSource = File::Spec->rel2abs($iDataSource); };
+
+ undef @gCommands;
+ undef @gSetEnv;
+
+ # Create a new XML Parser
+ my $iParser = new XML::Parser(Style=>'Subs', Pkg=>'SubHandlers', ErrorContext => 2);
+ # Supply the XML Parser the data source
+ $iParser->parsefile($iDataSource);
+
+ return \@gCommands, \@gSetEnv;
+}
+
+
+
+package SubHandlers;
+use FreezeThaw qw(freeze thaw);
+
+# Execute
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function handles the Execute tag in the XML
+sub Execute
+{
+ my $iExpat = shift; my $iElement = shift;
+
+ my (%iAttr);
+
+ # Read the attributes
+ while (@_) {
+ my $iAtt = shift;
+ my $iVal = shift;
+ $iAttr{$iAtt} = $iVal;
+ }
+
+ # Read in the attributes into temporary variables
+ my $iID = $iAttr{'ID'}; # ignored
+ my $iStage = $iAttr{'Stage'};
+ my $iComp = $iAttr{'Component'};
+ my $iCwd = $iAttr{'Cwd'};
+ my $iCommandLine = $iAttr{'CommandLine'};
+ my $iExitOnScanlogError = $iAttr{'ExitOnScanlogError'};
+
+ # Replace the magic words with values in the commandline
+ if ($ParseXML::gDataSource) {
+ $iCommandLine =~ s/%%%this_file%%%/$ParseXML::gDataSource/g;
+ } else {
+ $iCommandLine =~ s/%%%this_file%%%/this_file/g;
+ }
+
+ # Replace the server side environment variables with values in the commandline
+ $iCommandLine =~ s/%%(\w+)%%/$ENV{$1}/g;
+ # Replace the server side environment variables with values in the cwd
+ $iCwd =~ s/%%(\w+)%%/$ENV{$1}/g;
+
+ # Store the data about the command in a temporary hash
+ my %temp = (
+ 'Type' => 'Execute',
+ 'Stage' => $iStage,
+ 'Component' => $iComp,
+ 'Cwd' => $iCwd,
+ 'CommandLine' => $iCommandLine,
+ 'ExitOnScanlogError' => $iExitOnScanlogError,
+ );
+ push @ParseXML::gCommands, \%temp;
+}
+
+
+# Product
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function handles the Product tag in the XML
+sub Product
+{
+ my $iExpat = shift; my $iElement = shift;
+
+ my (%iAttr);
+
+ # Read the attributes
+ while (@_) {
+ my $iAtt = shift;
+ my $iVal = shift;
+ $iAttr{$iAtt} = $iVal;
+ }
+
+ my $iName = $iAttr{'Name'};
+
+ print "$iElement = $iName\n";
+}
+
+# SetEnv
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function handles the SetEnv tag in the XML
+sub SetEnv
+{
+ my $iExpat = shift; my $iElement = shift;
+
+ my (%iAttr);
+
+ # Read the attributes
+ while (@_) {
+ my $iAtt = shift;
+ my $iVal = shift;
+ $iAttr{$iAtt} = $iVal;
+ }
+
+ # Read in the attributes to temporary variables
+ my $iName = $iAttr{'Name'};
+ my $iValue = $iAttr{'Value'};
+ my $iOrder = $iAttr{'Order'}; # Ignored
+
+ # Replace the server side environment variables with values in the environment variable value
+ $iValue =~ s/%%(\w+)%%/$ENV{$1}/g;
+
+ # Store the data about the Environment
+ my %temp = (
+ 'Name' => $iName,
+ 'Value' => $iValue,
+ );
+ push @ParseXML::gSetEnv, \%temp;
+}
+
+# Exit
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function handles the Exit tag in the XML which cause the client to exit
+sub Exit
+{
+ my $iExpat = shift; my $iElement = shift;
+ my (%iAttr);
+
+ # Read the attributes
+ while (@_) {
+ my $iAtt = shift;
+ my $iVal = shift;
+ $iAttr{$iAtt} = $iVal;
+ }
+
+ # Read in the attributes into temporary variables
+ my $iStage = $iAttr{'Stage'};
+
+ # Store the data about the command in a temporary hash
+ my %temp = (
+ 'Type' => 'Exit',
+ 'Stage' => $iStage
+ );
+ push @ParseXML::gCommands, \%temp;
+}
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/System_Build.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1062 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE SystemBuild [
+ <!ELEMENT SystemBuild (option* | target+ | targetList+ | list+ | configuration+)*>
+<!ATTLIST SystemBuild
+ schema CDATA #REQUIRED
+>
+
+<!ELEMENT list (ref+)>
+<!-- e.g. common, beech, cedar, etc -->
+<!ATTLIST list
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+>
+
+<!ELEMENT ref EMPTY>
+<!-- Reference to a named entity in System Model -->
+<!ATTLIST ref
+ item CDATA #REQUIRED
+>
+
+<!ELEMENT targetList EMPTY>
+<!-- e.g. DEFAULT_7.0S, TOOLS_7.0S, etc -->
+<!ATTLIST targetList
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ target IDREFS #REQUIRED
+>
+
+<!ELEMENT target EMPTY>
+<!-- e.g. WINS, WINSCW, ARM4, etc -->
+<!ATTLIST target
+ name ID #REQUIRED
+ abldTarget CDATA #REQUIRED
+ description CDATA #REQUIRED
+>
+
+<!ELEMENT option EMPTY>
+<!-- e.g. Keepgoing, SaveSpace, etc -->
+<!ATTLIST option
+ name ID #REQUIRED
+ abldOption CDATA #REQUIRED
+ description CDATA #REQUIRED
+ enable (Y | N ) #REQUIRED
+>
+
+<!ELEMENT configuration (listRef+ | ref+ | task+)*>
+<!-- 7.0s, 8.0a, 8.0b, cuskit, etc -->
+<!ATTLIST configuration
+ name ID #REQUIRED
+ description CDATA #REQUIRED
+ filter CDATA #REQUIRED
+>
+<!ELEMENT task (listRef* , (buildLayer | specialInstructions))>
+
+<!ELEMENT listRef EMPTY>
+<!-- Reference to unitList -->
+<!ATTLIST listRef
+ list CDATA #REQUIRED
+>
+
+<!ELEMENT buildLayer EMPTY>
+<!-- bldmake, abld export, etc -->
+<!ATTLIST buildLayer
+ command CDATA #REQUIRED
+ targetList IDREFS #IMPLIED
+ unitParallel (Y | N ) #REQUIRED
+ targetParallel (Y | N ) "N"
+>
+
+<!ELEMENT specialInstructions EMPTY>
+<!-- BootStrap -->
+<!ATTLIST specialInstructions
+ name CDATA #REQUIRED
+ cwd CDATA #REQUIRED
+ root CDATA #IMPLIED
+ command CDATA #REQUIRED
+>
+]>
+<SystemBuild schema="1.0.0">
+ <option name="KEEPGOING" abldOption="-keepgoing" description="Causes make to keepgoing on errors" enable="Y"/>
+ <option name="SAVESPACE" abldOption="-savespace" description="Causes the removal of intermediate files" enable="Y"/>
+ <option name="NO_DEBUG" abldOption="-no_debug" description="Causes the toolchain not to generate debug tables" enable="N"/>
+ <target name="WINS" abldTarget="wins" description="MSVC Compiler"/>
+ <target name="WINS_REL" abldTarget="wins urel" description="MSVC Compiler"/>
+ <target name="WINS_DEB" abldTarget="wins udeb" description="MSVC Compiler"/>
+ <target name="WINSCW" abldTarget="winscw" description="CodeWarrior Compiler"/>
+ <target name="WINSCW_REL" abldTarget="winscw urel" description="CodeWarrior Compiler"/>
+ <target name="WINSCW_DEB" abldTarget="winscw udeb" description="CodeWarrior Compiler"/>
+ <target name="TOOLS" abldTarget="tools" description="MSVC Compiler for Tools"/>
+ <target name="TOOLS_REL" abldTarget="tools rel" description="MSVC Compiler for Tools Release mode only"/>
+ <target name="TOOLS2" abldTarget="tools2" description="MinGW GCC Compiler for Tools"/>
+ <target name="TOOLS2_REL" abldTarget="tools2 rel" description="MinGW GCC Compiler for Tools Release mode only"/>
+ <target name="ARMV5" abldTarget="armv5" description="RVCT Compiler"/>
+ <target name="ARMV5_REL" abldTarget="armv5 urel" description="RVCT Compiler"/>
+ <target name="ARMV5_DEB" abldTarget="armv5 udeb" description="RVCT Compiler"/>
+ <target name="ARMV7" abldTarget="armv7" description="RVCT Compiler"/>
+ <target name="ARMV7_REL" abldTarget="armv7 urel" description="RVCT Compiler"/>
+ <target name="ARMV7_DEB" abldTarget="armv7 udeb" description="RVCT Compiler"/>
+ <target name="ARMV5SMP" abldTarget="armv5smp" description="RVCT Compiler for SMP"/>
+ <target name="ARMV5SMP_REL" abldTarget="armv5smp urel" description="RVCT Compiler for SMP"/>
+ <target name="ARMV5SMP_DEB" abldTarget="armv5smp udeb" description="RVCT Compiler for SMP"/>
+
+ <!-- Aditional Targets -->
+ <target name="CWTOOLS" abldTarget="cwtools" description="CodeWarrior Compiler for Tools"/> <!-- Not supported -->
+ <target name="CWTOOLS_REL" abldTarget="cwtools rel" description="CodeWarrior Compiler for Tools Release mode only"/> <!-- Not supported -->
+ <target name="GCCXML" abldTarget="gccxml" description="GCCXML for Code comparision tools"/>
+ <target name="GCCXML_REL" abldTarget="gccxml urel" description="GCCXML for Code comparision tools release mode only"/>
+
+ <targetList name="default_9.0" description="Main Targets for 9.0" target="WINSCW ARMV5"/>
+ <targetList name="default_9.0_rel" description="Main Targets for 9.0_rel" target="WINSCW_REL ARMV5_REL"/>
+ <targetList name="default_9.0_deb" description="Main Targets for 9.0_deb" target="WINSCW_DEB ARMV5_DEB"/>
+ <targetList name="tools" description="tools Targets" target="TOOLS"/>
+ <targetList name="tools_rel" description="tools Release Targets" target="TOOLS_REL"/>
+ <targetList name="tools2" description="tools Targets" target="TOOLS2"/>
+ <targetList name="tools2_rel" description="tools Release Targets" target="TOOLS2_REL"/>
+ <targetList name="gccxml" description="tools Targets" target="GCCXML"/>
+ <targetList name="gccxml_rel" description="tools Release Targets" target="GCCXML_REL"/>
+ <targetList name="armv5smp" description="Separate ARMV5 SMP target" target="ARMV5SMP"/>
+ <targetList name="armv5smp_rel" description="Separate ARMV5 SMP release target" target="ARMV5SMP_REL"/>
+ <targetList name="armv5smp_deb" description="Separate ARMV5 SMP debug target" target="ARMV5SMP_DEB"/>
+ <targetList name="default_9.0_armv7" description="Main targets and ARMV7 target" target="WINSCW ARMV5 ARMV7"/>
+ <targetList name="default_9.0_rel_armv7" description="Main targets and ARMV7 release target" target="WINSCW_REL ARMV5_REL ARMV7_REL"/>
+ <targetList name="default_9.0_deb_armv7" description="Main targets and ARMV7 debug target" target="WINSCW_DEB ARMV5_DEB ARMV7_DEB"/>
+
+
+ <list name="SYSTEMTEST_LIST" description="System Test Code">
+ <ref item="n:integtestltsy"/>
+ <ref item="n:systemtestos"/>
+ </list>
+ <list name="SYSTEMTEST_LIST_INTEGTESTSMP" description="System Test Code">
+ <ref item="n:integtestsmp"/>
+ </list>
+
+ <!-- 9.5 configuration -->
+
+ <configuration name="Custkit_9.5" description="9.5 Custkit build" filter="9.5,custkit">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="cedar/generic/tools/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="cedar/generic/tools/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_9.5" description="9.5 GT build" filter="9.5,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="cedar/generic/tools/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="cedar/generic/tools/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_9.5_ARMV5SMP" description="9.5 ARMV5SMP build" filter="9.5,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="armv5smp" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+ <configuration name="TV_9.5" description="9.5 Techview build" filter="9.5,techview">
+ <ref item="techview"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="SystemTest_9.5" description="9.5 System Test build" filter="9.5,systemtest">
+ <ref item="techview"/>
+ <task><specialInstructions name="Copy Systemtest Configuration" cwd="common/generic/SystemTest/Symbian/Group" command="copy 9.5\configuration.cfg %CleanSourceDir%\common\generic\SystemTest\Symbian\Group\"/></task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="bldmake bldfiles" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -what" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -check" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -what build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -check build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ </configuration>
+
+ <configuration name="GCCXML_9.5" description="9.5 GCCXML build" filter="9.5,gt,techview">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="gccxml" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="gccxml" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+
+ <!-- 9.6 configuration -->
+
+ <configuration name="Custkit_9.6" description="9.6 Custkit build" filter="9.6,custkit">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="cedar/generic/tools/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="cedar/generic/tools/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_9.6_ARMV5SMP" description="9.6 ARMV5SMP build" filter="9.6,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="armv5smp" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_9.6" description="9.6 GT build" filter="9.6,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="cedar/generic/tools/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="cedar/generic/tools/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="TV_9.6" description="9.6 Techview build" filter="9.6,techview">
+ <ref item="techview"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="SystemTest_9.6" description="9.6 System Test build" filter="9.6,systemtest">
+ <task><specialInstructions name="Copy Systemtest Configuration" cwd="common/generic/SystemTest/Symbian/Group" command="copy 9.6\configuration.cfg %CleanSourceDir%\common\generic\SystemTest\Symbian\Group\"/></task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="bldmake bldfiles" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -what" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -check" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -what build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -check build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ </configuration>
+
+ <configuration name="GCCXML_9.6" description="9.6 GCCXML build" filter="9.6,gt,techview">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="gccxml" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="gccxml" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+
+ <!-- tb92 configuration -->
+
+ <configuration name="Custkit_tb92" description="tb92 Custkit build" filter="tb92,custkit">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="cedar/generic/tools/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="cedar/generic/tools/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_tb92" description="tb92 GT build" filter="tb92,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="cedar/generic/tools/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="cedar/generic/tools/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_tb92_ARMV5SMP" description="tb92 ARMV5SMP build" filter="tb92,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="armv5smp" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+ <configuration name="TV_tb92" description="tb92 Techview build" filter="tb92,techview">
+ <ref item="techview"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="SystemTest_tb92" description="tb92 System Test build" filter="tb92,systemtest">
+ <ref item="techview"/>
+ <task><specialInstructions name="Copy Systemtest Configuration" cwd="common/generic/SystemTest/Symbian/Group" command="copy tb92\configuration.cfg %CleanSourceDir%\common\generic\SystemTest\Symbian\Group\"/></task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="bldmake bldfiles" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -what" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -check" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -what build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -check build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ </configuration>
+
+ <configuration name="GCCXML_tb92" description="tb92 GCCXML build" filter="tb92,gt,techview">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="gccxml" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="gccxml" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <!-- tb92sf configuration -->
+
+ <configuration name="Custkit_tb92sf" description="tb92sf Custkit build" filter="tb92sf,custkit">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_tb92sf" description="tb92sf GT build" filter="tb92sf,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_tb92sf_ARMV5SMP" description="tb92sf ARMV5SMP build" filter="tb92sf,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="armv5smp" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+ <configuration name="TV_tb92sf" description="tb92sf Techview build" filter="tb92sf,techview">
+ <ref item="techview"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="SystemTest_tb92sf" description="tb92sf System Test build" filter="tb92sf,systemtest">
+ <ref item="techview"/>
+ <task><specialInstructions name="Copy Systemtest Configuration" cwd="app/techview/sysvalidation/systemtestos/Group" command="copy tb92sf\configuration.cfg %CleanSourceDir%\app\techview\sysvalidation\systemtestos\Group\"/></task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="bldmake bldfiles" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -what" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -check" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -what build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -check build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ </configuration>
+
+ <configuration name="GCCXML_tb92sf" description="tb92sf GCCXML build" filter="tb92sf,gt,techview">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="gccxml" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="gccxml" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+<!-- tb101sf configuration -->
+
+ <configuration name="Custkit_tb101sf" description="tb101sf Custkit build" filter="tb101sf,custkit">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_tb101sf" description="tb101sf GT build" filter="tb101sf,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_tb101sf_ARMV5SMP" description="tb101sf ARMV5SMP build" filter="tb101sf,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="armv5smp" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+ <configuration name="TV_tb101sf" description="tb101sf Techview build" filter="tb101sf,techview">
+ <ref item="techview"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="SystemTest_tb101sf" description="tb101sf System Test build" filter="tb101sf,systemtest">
+ <ref item="techview"/>
+ <task><specialInstructions name="Copy Systemtest Configuration" cwd="app/techview/sysvalidation/systemtestos/Group" command="copy tb101sf\configuration.cfg %CleanSourceDir%\app\techview\sysvalidation\systemtestos\Group\"/></task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="bldmake bldfiles" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -what" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -check" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -what build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -check build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="bldmake bldfiles" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld export" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld export -what" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld export -check" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld test build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld test -what build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld test -check build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ </configuration>
+
+ <configuration name="GCCXML_tb101sf" description="tb101sf GCCXML build" filter="tb101sf,gt,techview">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="gccxml" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="gccxml" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+
+<!-- Future configuration -->
+
+ <configuration name="Custkit_Future" description="Future Custkit build" filter="Future,custkit">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_Future" description="Future GT build" filter="Future,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><specialInstructions name="BootStrap1" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="setupprj.bat secure"/></task>
+ <task><specialInstructions name="BootStrap2" cwd="os/buildtools/sbsv1_os/e32toolp/group" command="bld.bat rel"/></task>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="tools" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld final" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld makefile" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld library" targetList="tools2" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld target" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="tools2_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="GT_Future_ARMV5SMP" description="Future ARMV5SMP build" filter="Future,gt">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="armv5smp" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="armv5smp" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="armv5smp_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="armv5smp" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+ <configuration name="TV_Future" description="Future Techview build" filter="Future,techview">
+ <ref item="techview"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="default_9.0" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="default_9.0" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="default_9.0_deb" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="default_9.0" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+
+ <configuration name="SystemTest_Future" description="Future System Test build" filter="Future,systemtest">
+ <ref item="techview"/>
+ <task><specialInstructions name="Copy Systemtest Configuration" cwd="app/techview/sysvalidation/systemtestos/Group" command="copy future\configuration.cfg %CleanSourceDir%\app\techview\sysvalidation\systemtestos\Group\"/></task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="bldmake bldfiles" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -what" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld export -check" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -what build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST"/>
+ <buildLayer command="abld test -check build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="bldmake bldfiles" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld export" unitParallel="Y"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld export -what" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld export -check" unitParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld test build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld test -what build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ <task>
+ <listRef list="SYSTEMTEST_LIST_INTEGTESTSMP"/>
+ <buildLayer command="abld test -check build" targetList="default_9.0" unitParallel="N" targetParallel="N"/>
+ </task>
+ </configuration>
+
+ <configuration name="GCCXML_Future" description="Future GCCXML build" filter="Future,gt,techview">
+ <ref item="os"/>
+ <ref item="mw"/>
+ <ref item="app"/>
+ <task><buildLayer command="bldmake bldfiles" unitParallel="Y"/></task>
+ <task><buildLayer command="abld makefile" targetList="gccxml" unitParallel="Y" targetParallel="N"/></task>
+ <task><buildLayer command="abld resource" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld library" targetList="gccxml" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld final" targetList="gccxml_rel" unitParallel="N" targetParallel="N"/></task>
+ <task><buildLayer command="abld -what export" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -what target" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ <task><buildLayer command="abld help" unitParallel="Y"/></task>
+ <task><buildLayer command="abld -check build" targetList="gccxml_rel" unitParallel="Y" targetParallel="Y"/></task>
+ </configuration>
+</SystemBuild>
Binary file deprecated/buildtools/buildsystemtools/docs/Build_Client_Server_Protocol_Specification_v0.2.doc has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/docs/scanlog.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,127 @@
+SCANLOG.PL
+17/02/2003
+
+1. Introduction
+
+scanlog.pl is a utility for summarising a build log. It reports the time
+taken for each phase of the build, and the numbers of fatal errors and warnings.
+For each component, the numbers of warnings and errors are accumulated across
+all phases and reported by component.
+
+
+2. Log file format
+
+scanlog expects the logfiles to have a particular structure for identifying
+the phases and components. It will tolerate log files which don't fully conform
+to this structure, but the reporting will have less detail.
+
+The expected structure is:
+
+===-------------------------------------------------
+=== <command for the phase>
+===-------------------------------------------------
+=== <phase> started Fri Feb 7 12:47:28 2003.
+=== <phase> == <component1>
+... build output
+=== <phase> == <component2>
+... build output
+=== <phase> == <componentN>
+... build output
+=== <phase> finished Fri Feb 7 13:13:41 2003.
+
+<phase> should be a single word without spaces, for example "target".
+The timestamps are optional and not processed by the current version of scanlog,
+though they are being processed by other tools.
+
+For this example, scanlog would summarise this part of the log as
+
+<command for the phase> 00:26:13 0 0
+
+assuming that there are no errors or warnings detected.
+
+
+3. Errors and Warnings
+
+Scanlog uses a set of regular expressions to identify lines in the log file
+which are usually associated with errors or warnings, for example:
+
+ /make(\[\d+\])?: \*\*\* / -- e.g. make[2]: ***
+
+which is the way that GNU make reports a failure.
+
+This rather simple approach can overstate the number of errors, particularly
+given the nested makefile approach used by the Symbian build tools. It is
+counting the symptoms of a failure rather than necessarily identifying the
+root cause.
+
+Errors are warnings are summarised according to the build phase (described above)
+and also accumulated across build phases and reported by component. If scanlog
+is invoked with the additional -V argument, the lines counted as warnings and
+errors are reported for each component, to aid problem diagnosis.
+
+
+4. Things not built...
+
+Scanlog also looks for lines which begin with "MISSING: ", which are normally
+produced by the output of "abld -check build". The missing files are listed and
+marked with the component which reported them, serving as an additional view of
+what has actually failed if fatal errors are reported.
+
+
+5. List of patterns
+
+Scanlog originally just looked for errors and warnings arising from the structure
+of the Symbian build, but has increasingly gained patterns to detect output from
+specific tools such as the ARM RealView compiler. This contributes to the "over
+counting" of errors, but provides more useful "scanlog -V" output.
+
+Scanlog uses these patterns to identify errors:
+
+ /^MISSING COMPONENT (.*):.* find (.*)$/
+ /(ABLD|BLDMAKE) ERROR:/
+ /FATAL ERROR\(S\):/
+ /fatal error U1073: .* make '(.*)'/
+ /fatal error U1077/
+ /warning U4010/
+ /make(\[\d+\])?: \*\*\* /
+ /make(\[\d+\])?: .* not remade /
+ /"(.*)", line (\d+): (Error: +(.\d+.*?):.*)$/
+ /error: ((Internal fault):.*)$/
+ /Exception: STATUS_ACCESS_VIOLATION/
+ /target .*? given more than once in the same rule/
+ /^ERROR: /
+
+The "warning U4010" pattern catches lines such as
+
+ NMAKE : warning U4010: 'FINALCOPYFXCM' : build failed; /K specified, continuing ...
+
+which would arise from the use of nmake /k in situations which would otherwise
+be fatal errors.
+
+
+Scanlog uses these patterns to identify warnings:
+
+ /Warning: Unmatched/i
+ /^BLDMAKE WARNING:/
+ /WARNING\(S\)/
+ /^WARNING: /
+ /\(\d+\) : warning C/
+ /LINK : warning/
+ /:\d+: warning:/
+ /"(.*)", line (\d+): (Warning: +(.\d+.*?):.*)$/
+ /^MAKEDEF WARNING:/
+ /ERROR: bad relocation:/
+ /mwldsym\d+.exe: warning:/
+ /^(\d+) warning/
+ /mwld.exe:/
+ /^Command line warning/
+ /Usage Warning:/
+
+The "ERROR: bad relocation" pattern catches messages from petran which are actually
+just warnings, for example:
+
+ ERROR: bad relocation: [00004f60] = 00000f68
+
+Petran follows a heuristic in these cases, and to date there has never been a
+runtime error attributed to this warning.
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/exclude.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,87 @@
+# This file contains the list of components which are built internally at Symbian but cannot be built as part of a licensee build
+
+# -------------------- Removed components:
+
+# The following components have been removed from the build configuration because they depend on source code
+# which Symbian may not distribute freely. If a licensee has this source code, they may wish to restore these
+# components to the build configuration.
+
+
+# Source code is entirely Category B (not Symbian's, or not licensed for redistribution by Symbian)
+MSComp NETWORKING\MSComp\GROUP
+STACCOMP NETWORKING\STACCOMP\GROUP
+STATAPI TESTDRIVER\DEVICE\STATAPI\GROUP
+WAPSTACK WAP-STACK\WAPSTACK\GROUP
+Gprsbtt telephony\gprsbtt\group
+
+# Source code is almost entirely Category B
+STAT_DESKTOP os\buildtools\toolsandutils\statdesktop\group
+
+# Depends on ARM's proprietary Neon250 PCI VGA card driver
+INTEGRATORAP BASE\INTEGRATORAP
+
+# Removed because it's very large and only contains freely distributable things like java, perl, zip, etc.
+REDISTRIBUTION TOOLS\REDISTRIBUTION
+
+# Documentation - to be built separately if licensee modifications warrant it
+DOC_SOURCE DEVELOPERLIBRARY\DOC_SOURCE
+SECURITYSUPPLEMENT DEVELOPERLIBRARY\SECURITYSUPPLEMENT\DOC_SOURCE
+CTSDOC CTS\CTSDOC
+
+# -------------------- End of removed components
+
+# -------------------- Components built internally only:
+
+# SDK Engineering Tools
+RUNPERL TOOLS\SDK_ENG\RUNPERL\GROUP
+BUILD-TOOLS TOOLS\SDK_ENG\BUILD-TOOLS\GROUP
+JAVALIBRARY TOOLS\SDK_ENG\JAVALIBRARY\GROUP
+ASSERTION TOOLS\SDK_ENG\ASSERTION\GROUP
+DFRDOBJECT TOOLS\SDK_ENG\DFRDOBJECT\GROUP
+ENUM TOOLS\SDK_ENG\ENUM\GROUP
+LOGGER TOOLS\SDK_ENG\LOGGER\GROUP
+FILESYS TOOLS\SDK_ENG\FILESYS\GROUP
+ENVVAR TOOLS\SDK_ENG\ENVVAR\GROUP
+INSTALLUTILS TOOLS\SDK_ENG\INSTALLUTILS\GROUP
+MNEMONICFIX TOOLS\SDK_ENG\MNEMONICFIX\GROUP
+PATHBROWSER TOOLS\SDK_ENG\PATHBROWSER\GROUP
+SHELLEXEC TOOLS\SDK_ENG\SHELLEXEC\GROUP
+SWINGWORKER TOOLS\SDK_ENG\SWINGWORKER\GROUP
+TESTCASERUNNER TOOLS\SDK_ENG\TESTCASERUNNER\GROUP
+TOOLBARPANEL TOOLS\SDK_ENG\TOOLBARPANEL\GROUP
+JAVAHELP TOOLS\SDK_ENG\JAVAHELP\GROUP
+JCOMPS_I18N TOOLS\SDK_ENG\JCOMPS_I18N\GROUP
+LANGCONFIG TOOLS\SDK_ENG\LANGCONFIG\GROUP
+MBMCODEC TOOLS\SDK_ENG\MBMCODEC\GROUP
+SDKINFO TOOLS\SDK_ENG\SDKINFO\GROUP
+JADE TOOLS\SDK_ENG\JADE\GROUP
+APPBUILD TOOLS\SDK_ENG\APPBUILD\GROUP
+AIFAPP TOOLS\SDK_ENG\AIFAPP\GROUP
+AIFBUILDER TOOLS\SDK_ENG\AIFBUILDER\GROUP
+CSHLPCMP_GUI TOOLS\SDK_ENG\CSHLPCMP_GUI\GROUP
+MEAD TOOLS\SDK_ENG\MEAD\GROUP
+MENUBUILDER TOOLS\SDK_ENG\MENUBUILDER\GROUP
+SISAR TOOLS\SDK_ENG\SISAR\GROUP
+SDKPKG-MANAGER TOOLS\SDK_ENG\SDKPKG-MANAGER\GROUP
+SDKPKG-TOOLS TOOLS\SDK_ENG\SDKPKG-TOOLS\GROUP
+EMULATOR_LAUNCHER TOOLS\SDK_ENG\EMULATOR_LAUNCHER\GROUP
+PKGMGRGUI TOOLS\SDK_ENG\PKGMGRGUI\GROUP
+LAUNCH TOOLS\SDK_ENG\LAUNCH\GROUP
+TOOLS_STUBS TOOLS\SDK_ENG\TOOLS_STUBS\GROUP
+AIFBUILDERENGINEPLUGIN TOOLS\SDK_ENG\AIFBUILDERENGINEPLUGIN\GROUP
+RCOMPPLUGIN TOOLS\SDK_ENG\RCOMPPLUGIN\GROUP
+DOCPLUGINTOOL TOOLS\SDK_ENG\DOCPLUGINTOOL\GROUP
+CWPLUGINS TOOLS\SDK_ENG\CWPLUGINS\GROUP
+BSPBUILDER TOOLS\BSPBUILDER\GROUP
+
+#Devkit tools
+#note KitSetupApp has been moved from the CustKtis section to the Dev Kit section
+# as they look after it
+KitSetupApp TOOLS\DevKits\KitSetupApp\group
+
+#CustKit tools
+#note these components must be built after the Devkit components
+kit_builder TOOLS\Custkits\kitbuilder\group
+ProductInstaller TOOLS\Custkits\ProductInstaller\group
+
+# -------------------- End of Components built internally only:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/genbuild/genbuild.bat Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,28 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+
+perl -w -S genbuild.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
+if errorlevel==1 goto CheckPerl
+goto End
+
+:CheckPerl
+perl -v >NUL
+if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?
+goto End
+
+:End
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/genbuild/genbuild.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,675 @@
+# 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:
+# Given a baseline list of components, generate scripts to do the build
+#
+#
+
+use strict;
+
+if (@ARGV<1 || ! -e $ARGV[0])
+ {
+#........1.........2.........3.........4.........5.........6.........7.....
+ print <<USAGE_EOF;
+
+Usage:
+ genbuild complist1 [complist2 ...] -- generate build scripts
+
+Given a list of components, generate the scripts necessary to
+build them all using the automated build system. The scripts
+will be named after the component list, so
+
+ genbuild \\batch\\build\\somename.txt
+
+will generate the following scripts:
+
+ somename_bldfiles.cmd - run "bldmake bldfiles" on every component
+ somename_export.cmd - run "abld export" on every component
+ somename_makefile.cmd - run "abld makefile" on every component
+ somename_library.cmd - run "abld library" on every component
+ somename_resource.cmd - run "abld resource" on every component
+ somename_target.cmd - run "abld target" on every component
+ somename_final.cmd - run "abld final" on every component
+ somename_check.cmd - run "abld -check build" on every component
+ somename_what.cmd - run "abld -what build" on every component
+ somename_clean.cmd - run "abld clean" on every component
+ somename_reallyclean.cmd - run "abld reallyclean" on every component
+
+ somename_build.cmd - use appropriate combination of above scripts
+ somename_pbuild.cmd - alternative build script for multi-machine builds
+
+The somename_build.cmd script is controlled by options specified in the
+list of components, and calls the other scripts in the correct sequence.
+
+USAGE_EOF
+ exit 1;
+ }
+
+# Check for EPOCROOT
+# It's not used directly by GENBUILD, but this is a good early stage at which
+# to discover that it hasn't been set...
+
+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 not include a drive letter\n" if ($epocroot =~ /^.:/);
+die "ERROR: EPOCROOT must be an absolute path without 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);
+
+my $basename = $ARGV[0];
+if ($basename =~ /^.*\\([^\\]+)$/)
+ {
+ $basename = $1; # lose the leading path, if any
+ }
+if ($basename =~ /^([^.]+)\..*$/)
+ {
+ $basename = $1; # lose the trailing extensions, if any
+ }
+
+
+my @components;
+my %arm_assplist;
+my $savespace="";
+my $keepgoing="";
+my $build_tools=0;
+my $build_cwtools=0;
+my $build_winc=0;
+my $build_wins=0;
+my $build_arm4=0;
+my $build_armi=0;
+my $build_thumb=0;
+my $build_arm3=0;
+my $build_armv5=0;
+my $epoc_only=0;
+my $build_winscw=0;
+my $backwards_compatible_defaults = 1;
+
+# Read from all supplied argument files, not just the first
+# Supplied options apply to all components listed.
+
+while (<>)
+ {
+ s/\s*#.*$//;
+ s/^\s*//;
+ my $line = lc $_;
+ if ($line =~ /^$/)
+ {
+ next;
+ }
+
+ if ($line =~ /<option (\w+)\s*(.*)>/)
+ {
+ my $option = $1;
+ my $optargs= $2;
+ if ($option eq "savespace")
+ {
+ $savespace = "-savespace";
+ next;
+ }
+ if ($option eq "keepgoing")
+ {
+ $keepgoing = "-keepgoing";
+ next;
+ }
+ if ($option eq "tools")
+ {
+ $build_tools = 1;
+ next;
+ }
+ if ($option eq "cwtools")
+ {
+ $build_cwtools = 1;
+ next;
+ }
+ if ($option eq "winc")
+ {
+ $build_winc = 1;
+ next;
+ }
+ if ($option eq "wins")
+ {
+ $build_wins = 1;
+ $backwards_compatible_defaults = 0; # explicit <option wins>
+ next;
+ }
+ if ($option eq "epoconly")
+ {
+ $build_winc = 0;
+ $epoc_only = 1;
+ next;
+ }
+ if ($option eq "arm4")
+ {
+ $build_arm4 = 1;
+ $backwards_compatible_defaults = 0; # explicit <option arm4>
+ next;
+ }
+ if ($option eq "armi")
+ {
+ $build_armi = 1;
+ $backwards_compatible_defaults = 0; # explicit <option armi>
+ next;
+ }
+ if ($option eq "thumb")
+ {
+ $build_thumb = 1;
+ next;
+ }
+ if ($option eq "arm3")
+ {
+ $build_arm3 = 1;
+ next;
+ }
+ if ($option eq "armv5")
+ {
+ $build_armv5 = 1;
+ $backwards_compatible_defaults = 0; # explicit <option armv5>
+ next;
+ }
+
+ if ($option eq "winscw")
+ {
+ $build_winscw = 1;
+ next;
+ }
+
+ if ($option eq "arm_assp")
+ {
+ $arm_assplist{$optargs} = 1;
+ next;
+ }
+
+
+ print "Option $1 not yet implemented\n";
+ next;
+ }
+ if ($line =~ /^([^<]\S+)\s+(\S+)/)
+ {
+ if (!-e "$2\\bld.inf")
+ {
+ print STDERR "MISSING COMPONENT $1: can't find $2\\bld.inf\n";
+ next;
+ }
+ }
+
+ push @components, $line;
+ }
+
+if ($backwards_compatible_defaults)
+ {
+ # Older versions automatically built these targets, without <option xxx>
+ $build_wins = 1;
+ $build_arm4 = 1;
+ $build_armi = 1;
+ }
+
+my %specials = (
+ "bldfiles e32toolp" =>
+ "cd tools\\e32toolp\\group\n".
+ "call setupprj\n".
+ "call bld rel\n"
+ );
+
+print_batch("bldfiles", "cd %2\n", "call bldmake bldfiles $keepgoing");
+print_batch("export", "cd %2\n", "call abld export $keepgoing");
+print_batch("makefile", "cd %2\n", "call abld makefile $keepgoing %arg1% %arg2% %arg3%");
+print_batch("library", "cd %2\n", "call abld library $keepgoing %arg1% %arg2% %arg3%");
+print_batch("resource", "cd %2\n", "call abld resource $keepgoing %arg1% %arg2% %arg3%");
+print_batch("target", "cd %2\n", "call abld target $keepgoing $savespace %arg1% %arg2% %arg3%");
+print_batch("final", "cd %2\n", "call abld final $keepgoing %arg1% %arg2% %arg3%");
+print_batch("clean", "cd %2\n", "call abld clean $keepgoing %arg1% %arg2% %arg3%");
+print_batch("reallyclean", "cd %2\n", "call abld reallyclean $keepgoing %arg1% %arg2% %arg3%");
+print_batch("check", "cd %2\n", "call abld -check build %arg1% %arg2% %arg3%");
+print_batch("what", "cd %2\n", "call abld -what build %arg1% %arg2% %arg3%");
+
+print_control("build");
+print_pcontrol("pbuild");
+
+#--------------------------------------------------------------------
+
+sub print_batch
+ {
+ my ($label, @actions) = @_;
+
+ my $scriptbase = $basename."_".$label;
+ open FILE, ">$scriptbase.cmd" or die "can't create $scriptbase.cmd";
+ print FILE <<HEAD_EOF;
+\@echo off
+setlocal
+echo ===-------------------------------------------------
+echo === $scriptbase %1 %2 %3
+echo ===-------------------------------------------------
+perl -e "\$time=localtime; print '=== ',$label,' started ', \$time"
+echo .
+set arg1=%1
+set arg2=%2
+set arg3=%3
+goto :doit
+
+:$label
+echo === $label == %3
+perl -e "print '===+ ',time"
+echo .
+setlocal
+
+@actions
+
+endlocal
+goto :EOF
+
+:doit
+
+HEAD_EOF
+
+ my $line;
+ foreach $line (@components)
+ {
+ if ($line =~ /<special (\w+)\s+(\w+)(.*)>/)
+ {
+ if ($1 eq $label)
+ {
+ print FILE "REM special $1 $2\n";
+ print FILE "echo === $label == $2\n";
+ print FILE "setlocal\n\n";
+ print FILE $specials{"$1 $2"};
+ print FILE "\nendlocal\n\n";
+ }
+ next;
+ }
+#--------------------------------------------------------------------
+ my @MyList;
+ my $tempvar;
+
+ @MyList = split(/\s+/,$line);
+ $tempvar= lc $MyList[$#MyList];
+ $tempvar =~ s/\\group//;
+ push @MyList, $tempvar;
+ print FILE "call :$label\t$MyList[0]\t$MyList[1]\t$MyList[2]\n";
+#--------------------------------------------------------------------
+ }
+
+ print FILE <<TAIL_EOF;
+
+perl -e "\$time=localtime; print '=== ',$label,' finished ', \$time"
+echo .
+perl -e "print '===+ ',time"
+echo .
+
+TAIL_EOF
+
+ close FILE;
+ print "Created $scriptbase.cmd\n";
+ }
+
+
+#--------------------------------------------------------------------
+# Overall build
+
+sub print_control
+ {
+ my ($label) = @_;
+
+ my $scriptbase = $basename."_".$label;
+ open FILE, ">$scriptbase.cmd" or die "can't create $scriptbase.cmd";
+
+ print FILE <<HEAD_EOF;
+\@echo off
+setlocal
+perl -e "\$time=localtime; print '=== ',$scriptbase,' started ', \$time"
+echo .
+
+HEAD_EOF
+
+ #--------------------------------------------------------
+ # Generic stuff first
+
+ print FILE "call ${basename}_bldfiles\n";
+ print FILE "call ${basename}_export\n";
+ print FILE "\n";
+
+ #--------------------------------------------------------
+ # TOOLS, if any
+
+ if ($build_tools)
+ {
+ print FILE "call ${basename}_makefile tools\n";
+ print FILE "call ${basename}_library tools\n";
+ print FILE "call ${basename}_target tools rel\n";
+ print FILE "call ${basename}_what tools rel\n";
+ print FILE "call ${basename}_check tools rel\n\n";
+ }
+
+ #--------------------------------------------------------
+ # CWTOOLS, if any
+
+ if ($build_cwtools)
+ {
+ print FILE "call ${basename}_makefile cwtools\n";
+ print FILE "call ${basename}_library cwtools\n";
+ print FILE "call ${basename}_target cwtools rel\n";
+ print FILE "call ${basename}_what cwtools rel\n";
+ print FILE "call ${basename}_check cwtools rel\n\n";
+ }
+
+ #--------------------------------------------------------
+ # Emulator things, WINS and WINC
+
+ unless ($epoc_only)
+ {
+ if ($build_winc)
+ {
+ print FILE "call ${basename}_makefile winc\n";
+ # No resource step for WINC
+ print FILE "call ${basename}_library winc\n";
+ print FILE "call ${basename}_target winc\n";
+ print FILE "call ${basename}_what winc\n";
+ print FILE "call ${basename}_check winc\n";
+ print FILE "\n";
+ }
+
+ if ($build_wins)
+ {
+ print FILE "call ${basename}_makefile wins\n";
+ print FILE "call ${basename}_resource wins\n";
+ print FILE "call ${basename}_library wins\n";
+ print FILE "call ${basename}_target wins\n";
+ print FILE "\n";
+ }
+
+ if ($build_winscw)
+ {
+ print FILE "call ${basename}_makefile winscw\n";
+ print FILE "call ${basename}_resource winscw\n";
+ print FILE "call ${basename}_library winscw\n";
+ print FILE "call ${basename}_target winscw\n";
+ print FILE "\n";
+ }
+
+ if ($build_wins)
+ {
+ print FILE "call ${basename}_final wins\n";
+ print FILE "call ${basename}_what wins\n";
+ print FILE "call ${basename}_check wins\n";
+ print FILE "\n";
+ }
+
+ if ($build_winscw)
+ {
+ print FILE "call ${basename}_final winscw\n";
+ print FILE "call ${basename}_what winscw\n";
+ print FILE "call ${basename}_check winscw\n";
+ print FILE "\n";
+ }
+ }
+
+ #--------------------------------------------------------
+ # ARM things
+
+ # Generic build(s) first, followed by the ASSPs (if any)
+ #
+
+ my $name;
+ my $stage;
+ my @armthings = ();
+ if ($build_arm4)
+ {
+ push @armthings, "arm4";
+ }
+ if ($build_armi)
+ {
+ push @armthings, "armi";
+ }
+ if ($build_thumb)
+ {
+ push @armthings, "thumb";
+ }
+ if ($build_arm3)
+ {
+ push @armthings, "arm3";
+ }
+ if ($build_armv5)
+ {
+ push @armthings, "armv5";
+ }
+ push @armthings, (sort keys %arm_assplist);
+
+ foreach $stage ("makefile", "resource", "library", "target", "final", "what", "check")
+ {
+ foreach $name (@armthings)
+ {
+ printf FILE "call ${basename}_%-8s $name\n", $stage;
+ }
+ print FILE "\n";
+ }
+
+ print FILE <<TAIL_EOF;
+
+perl -e "\$time=localtime; print '=== ',$scriptbase,' finished ', \$time"
+echo .
+
+TAIL_EOF
+
+ close FILE;
+ print "Created $scriptbase.cmd\n";
+ }
+
+
+#--------------------------------------------------------------------
+# Overall build, subdivided for multi-machine building
+
+sub print_pcontrol
+ {
+ my ($label) = @_;
+
+ my $scriptbase = $basename."_".$label;
+ open FILE, ">$scriptbase.cmd" or die "can't create $scriptbase.cmd";
+
+ print FILE <<HEAD_EOF;
+\@echo off
+setlocal
+perl -e "\$time=localtime; print '=== ',$scriptbase,' started ', \$time"
+echo .
+
+goto build_%1
+
+HEAD_EOF
+
+ #========================================================
+ # Getting Ready
+ #
+ # Building tools, include files, makefiles, resources
+ # and libraries
+ #
+
+ print FILE ":build_libs\n";
+ print FILE "\n";
+
+ #--------------------------------------------------------
+ # Generic stuff first
+
+ print FILE "call ${basename}_bldfiles\n";
+ print FILE "call ${basename}_export\n";
+ print FILE "\n";
+
+ #--------------------------------------------------------
+ # TOOLS, if any
+
+ if ($build_tools)
+ {
+ print FILE "call ${basename}_makefile tools\n";
+ print FILE "call ${basename}_library tools\n";
+ print FILE "call ${basename}_target tools rel\n";
+ print FILE "call ${basename}_what tools rel\n";
+ print FILE "call ${basename}_check tools rel\n\n";
+ }
+
+ #--------------------------------------------------------
+ # CWTOOLS, if any
+
+ if ($build_cwtools)
+ {
+ print FILE "call ${basename}_makefile cwtools\n";
+ print FILE "call ${basename}_library cwtools\n";
+ print FILE "call ${basename}_target cwtools rel\n";
+ print FILE "call ${basename}_what cwtools rel\n";
+ print FILE "call ${basename}_check cwtools rel\n\n";
+ }
+
+ #--------------------------------------------------------
+ # Emulator things, WINS and WINC, up to resources
+
+ if ($build_winc)
+ {
+ print FILE "call ${basename}_makefile winc\n";
+ print FILE "call ${basename}_library winc\n";
+ print FILE "call ${basename}_target winc\n";
+ print FILE "call ${basename}_what winc\n";
+ print FILE "call ${basename}_check winc\n";
+ print FILE "\n";
+ }
+
+ if ($build_wins)
+ {
+ print FILE "call ${basename}_makefile wins\n";
+ print FILE "call ${basename}_resource wins\n";
+ print FILE "call ${basename}_library wins\n";
+ print FILE "\n";
+ }
+
+ #--------------------------------------------------------
+ # ARM things
+
+ # Generic build(s) first, followed by the ASSPs (if any)
+ #
+
+ my $name;
+ my $stage;
+ my @epocthings = ();
+ if ($build_arm4)
+ {
+ push @epocthings, "arm4";
+ }
+ if ($build_armi)
+ {
+ push @epocthings, "armi";
+ }
+ if ($build_thumb)
+ {
+ push @epocthings, "thumb";
+ }
+
+ if ($build_arm3)
+ {
+ push @epocthings, "arm3";
+ }
+ if ($build_armv5)
+ {
+ push @epocthings, "armv5";
+ }
+
+ push @epocthings, (sort keys %arm_assplist);
+
+ # For all EPOC things...
+
+ foreach $stage ("makefile", "resource", "library")
+ {
+ foreach $name (@epocthings)
+ {
+ printf FILE "call ${basename}_%-8s $name\n", $stage;
+ }
+ if ($build_winscw)
+ {
+ printf FILE "call ${basename}_%-8s winscw\n", $stage;
+ }
+ print FILE "\n";
+ }
+
+ print FILE "goto :EOF\n";
+ print FILE "\n";
+
+ #========================================================
+ # Completing the Emulator
+ #
+
+ print FILE ":build_wins\n";
+ print FILE "\n";
+
+ print FILE "call ${basename}_bldfiles\n";
+ print FILE "call ${basename}_target wins\n";
+ print FILE "goto :EOF\n";
+ print FILE "\n";
+
+ print FILE ":build_wins_final\n";
+ print FILE "\n";
+
+ print FILE "call ${basename}_final wins\n";
+ print FILE "call ${basename}_what wins\n";
+ print FILE "call ${basename}_check wins\n";
+ print FILE "goto :EOF\n";
+ print FILE "\n";
+
+ #========================================================
+ if ($build_winscw){
+ # Completing the Emulator using CodeWarrior
+ #
+
+ print FILE ":build_winscw\n";
+ print FILE "\n";
+
+ print FILE "call ${basename}_bldfiles\n";
+ print FILE "call ${basename}_target winscw\n";
+ print FILE "goto :EOF\n";
+ print FILE "\n";
+
+ print FILE ":build_winscw_final\n";
+ print FILE "\n";
+
+
+ print FILE "call ${basename}_final winscw\n";
+ print FILE "call ${basename}_what winscw\n";
+ print FILE "call ${basename}_check winscw\n";
+ print FILE "goto :EOF\n";
+ print FILE "\n";
+ }
+ #========================================================
+ # Completing the ARM targets
+ #
+
+ foreach $name (@epocthings)
+ {
+ print FILE ":build_$name\n";
+ print FILE "\n";
+
+ print FILE "call ${basename}_bldfiles\n";
+ foreach $stage ("target", "final", "what", "check")
+ {
+ printf FILE "call ${basename}_%-8s $name\n", $stage;
+ }
+ print FILE "goto :EOF\n";
+ print FILE "\n";
+ }
+
+ print FILE <<TAIL_EOF;
+
+perl -e "\$time=localtime; print '=== ',$scriptbase,' finished ', \$time"
+echo .
+
+TAIL_EOF
+
+ close FILE;
+ print "Created $scriptbase.cmd\n";
+ }
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/genxml.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,238 @@
+# Copyright (c) 2003-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:
+# Script to Generate the XML command file from the xml files
+#
+#
+
+use strict;
+use FindBin; # for FindBin::Bin
+use Getopt::Long;
+use File::Copy;
+
+use lib $FindBin::Bin;
+use lib "$FindBin::Bin/lib";
+
+# Process the commandline
+my ($iDataSource, $iDataOutput, $iLogFile, $iSourceDir, $iReallyClean,
+ $iClean, $iXmlSource, $iConfName, $iMergedXml, $iValidate,
+ $iTextOutput, $iCBROutput, $iFilter, $iEffectiveDir) = ProcessCommandLine();
+
+if (scalar(@$iXmlSource))
+{
+ use GenXml;
+ &GenXml::Start($iXmlSource, $iDataOutput, $iLogFile, $iSourceDir,
+ $iConfName, $iMergedXml, $iValidate, $iTextOutput, $iCBROutput, $iFilter, $iEffectiveDir);
+} else {
+ use GenBuild;
+ # Start the generation of the XML
+ print "Warning old .txt file input is being used\n";
+ &GenBuild::Start($iDataSource, $iDataOutput, $iLogFile, $iSourceDir, $iReallyClean, $iClean);
+}
+
+
+# ProcessCommandLine
+#
+# Inputs
+#
+# Outputs
+# @iDataSource array of multiple (txt file(s) to process)
+# $iDataOutput (XML file to generate)
+# $iLogFile (Log file to put processing errors)
+# $iSourceDir (Location of Source)
+# $iReallyClean (script to run the "abld reallyclean" command)
+# $iClean (script to run the "abld clean" command)
+# @iXmlSource array of multiple (XML file(s) to process)
+# $iConfName (Name of configuration to generate)
+# $iMergedXml - Hidden option to save the output of the merging xml process for debug use
+# $iValidate (Just validate the input)
+# $iText (txt file to generate)
+# $iFilter (filter to apply before generating merged XML file)
+# $iEffectiveDir (location at which source will be used)
+#
+# Description
+# This function processes the commandline
+
+sub ProcessCommandLine {
+ my ($iHelp, $iPort, @iDataSource, $iLogFile, $iSourceDir, $iReallyClean, $iClean,
+ @iXmlSource, $iConfName, $iMergedXml, $iValidate, $iTextOutput, $iCBROutput,
+ $iFilter, $iEffectiveDir);
+ GetOptions(
+ 'h' => \$iHelp,
+ 'd=s@' =>\@iDataSource,
+ 'o=s' => \$iDataOutput,
+ 'l=s' => \$iLogFile,
+ 's=s' => \$iSourceDir,
+ 'e=s' => \$iEffectiveDir,
+ 'r=s' => \$iReallyClean,
+ 'c=s' => \$iClean, # or $iCBROutput in XML input mode
+ 'x=s@' =>\@iXmlSource,
+ 'n=s' => \$iConfName,
+ 'm=s' => \$iMergedXml,
+ 'v' =>\$iValidate,
+ 't=s' => \$iTextOutput,
+ 'f=s' => \$iFilter);
+
+ Usage() if ($iHelp);
+
+ Usage("Must specify the root of the source tree with -s") if (!defined $iSourceDir);
+ Usage("Must specify at least one input file") if ((!@iDataSource) && (!@iXmlSource));
+ Usage("$iSourceDir is not a directory") if (!-d $iSourceDir);
+
+ if (scalar @iXmlSource)
+ {
+ # Validation of options for XML input
+
+ Usage("Can't mix -d and -x") if (scalar @iDataSource);
+
+ $iCBROutput = $iClean; # deal with ambiguity in -c option
+ $iClean = "";
+
+ if ((!defined $iMergedXml) && (!defined $iDataOutput)
+ && (!defined $iTextOutput) && (!defined $iCBROutput))
+ {
+ Usage("Must specify at least one output file") if (!defined $iValidate);
+ }
+ else
+ {
+ Usage("Can't specify output files with -v") if (defined $iValidate);
+ }
+ if (defined $iDataOutput || defined $iTextOutput)
+ {
+ Usage("Must specify configuration for XML or list output") if (!defined $iConfName);
+ }
+ Usage("Can't specify reallyclean files with -x") if (defined $iReallyClean);
+
+ $iEffectiveDir = $iSourceDir if (!defined $iEffectiveDir);
+ }
+ else
+ {
+ # Validation of options for component list input
+
+ Usage("Must specify a logfile with -l") if (!defined $iLogFile);
+ Usage("Can't request validation on non-XML input") if (defined $iValidate);
+ Usage("Can't specify merged or text output with -d") if (defined $iTextOutput || defined $iMergedXml);
+ Usage ("Can't specify a filter for non-XML input") if (defined $iFilter);
+ Usage ("Can't specify a configuration for non-XML input") if (defined $iConfName);
+ }
+
+ foreach my $iFile (@iDataSource)
+ {
+ if (! -e $iFile)
+ {
+ die "Cannot open $iFile";
+ }
+ }
+
+ foreach my $iFile (@iXmlSource)
+ {
+ if (! -e $iFile)
+ {
+ die "Cannot open $iFile";
+ }
+ }
+
+ # Backup existing files
+
+ &backupFile($iLogFile);
+ &backupFile($iDataOutput);
+ &backupFile($iMergedXml);
+ &backupFile($iTextOutput);
+ &backupFile($iCBROutput);
+ &backupFile($iReallyClean);
+ &backupFile($iClean);
+
+ return(\@iDataSource, $iDataOutput, $iLogFile, $iSourceDir, $iReallyClean, $iClean, \@iXmlSource, $iConfName, $iMergedXml, $iValidate, $iTextOutput, $iCBROutput, $iFilter, $iEffectiveDir);
+}
+
+# backupFile
+#
+# Inputs
+# $iFile - filename to backup
+#
+# Outputs
+#
+# Description
+# This function renames a file with the .baknn extension, if necessary
+sub backupFile
+{
+ my ($iFile) = @_;
+
+ return if (!$iFile || !-e $iFile);
+
+ my ($iBak) = $iFile.".bak";
+ my ($i, $freefilename);
+ # Loop until you find a free file name by increamenting the number on the end of the .bak extension
+ while (!$freefilename)
+ {
+ if (-e $iBak.$i)
+ {
+ $i++;
+ } else {
+ $iBak .= $i;
+ $freefilename = 1;
+ }
+ }
+ print "WARNING: $iFile already exists, creating backup of original with new name of $iBak\n";
+ move($iFile,$iBak) or die "Could not backup $iFile to $iBak because of: $!\n";
+}
+
+# Usage
+#
+# Output Usage Information.
+#
+
+sub Usage {
+ my ($reason) = @_;
+
+ print "ERROR: $reason\n" if ($reason);
+ print <<USAGE_EOF;
+
+ Usage: Genxml.pl [options]
+
+ options for XML input mode:
+
+ -h help
+ -s Source Directory
+ -x XML Data Source (XML file) [Multiple -x options allowed]
+ -f filter to apply to data source before main processing [optional]
+ -m Output merged & filtered XML file [optional]
+ -n Configuration name to use
+ -l Logfile [optional]
+ -o Output XML file [optional]
+ -e Effective source directory [optional]
+ -t Output TXT file corresponding to XML file [optional]
+ -c Output list of CBR components [optional]
+ -v Validate XML files only, Stop after merging and validating.
+ Turns on extra INFO messages for Validation [optional]
+
+ options for backward compatibility mode:
+
+ -h help
+ -l Logfile
+ -s Source Directory
+ -d Data Source (txt file) [Multiple -d options allowed]
+ -o Output XML file
+ -r Filename for ReallyClean xml file [optional]
+ -c Filename for Clean xml file [optional]
+
+ Description:
+ This program generates an XML file that is used by the Build
+ Client-Server System. It expands the summarised configuration
+ information stored in the input files to a detailed command by command
+ instruction set for the Build System to use. This enabled the
+ specified configuration to be built by the build system.
+
+USAGE_EOF
+ exit 1;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/group/bld.inf Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,114 @@
+// Copyright (c) 2003-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:
+//
+
+PRJ_PLATFORMS
+TOOLS
+
+PRJ_EXPORTS
+
+// Export the log processing tools
+..\scanlog\scanlog.pl \epoc32\tools\scanlog.pl
+..\scanlog\Scanlog.pm \epoc32\tools\Scanlog.pm
+..\scanlog\htmlscanlog.pl \epoc32\tools\htmlscanlog.pl
+..\scanlog\complog.pl \epoc32\tools\complog.pl
+..\scanlog\compare_summary.pl \epoc32\tools\compare_summary.pl
+
+
+// Export the old build system
+..\genbuild\genbuild.pl \epoc32\tools\genbuild.pl
+..\genbuild\genbuild.bat \epoc32\tools\genbuild.bat
+
+
+// Export Build tools
+..\genxml.pl \epoc32\tools\build\genxml.pl
+..\GenXml.pm \epoc32\tools\build\GenXml.pm
+..\GenBuild.pm \epoc32\tools\build\GenBuild.pm
+..\BuildClient.pl \epoc32\tools\build\BuildClient.pl
+..\BuildClient.pm \epoc32\tools\build\BuildClient.pm
+..\BuildServer.pl \epoc32\tools\build\BuildServer.pl
+..\BuildServer.pm \epoc32\tools\build\BuildServer.pm
+..\Msg.pm \epoc32\tools\build\Msg.pm
+..\ParseXML.pm \epoc32\tools\build\ParseXML.pm
+
+
+
+// Export the build tools supporting libraries
+..\lib\gpl.licence.txt \epoc32\tools\build\lib\gpl.licence.txt
+..\lib\Date\Manip.pm \epoc32\tools\build\lib\Date\Manip.pm
+..\lib\Date\Manip.pod \epoc32\tools\build\lib\Date\Manip.pod
+..\lib\freezethaw\FreezeThaw.pm \epoc32\tools\build\lib\freezethaw\FreezeThaw.pm
+..\lib\Parse\Yapp.pm \epoc32\tools\build\lib\Parse\Yapp.pm
+..\lib\Parse\Yapp\Driver.pm \epoc32\tools\build\lib\Parse\Yapp\Driver.pm
+..\lib\Parse\Yapp\Grammar.pm \epoc32\tools\build\lib\Parse\Yapp\Grammar.pm
+..\lib\Parse\Yapp\Lalr.pm \epoc32\tools\build\lib\Parse\Yapp\Lalr.pm
+..\lib\Parse\Yapp\Options.pm \epoc32\tools\build\lib\Parse\Yapp\Options.pm
+..\lib\Parse\Yapp\Output.pm \epoc32\tools\build\lib\Parse\Yapp\Output.pm
+..\lib\Parse\Yapp\Parse.pm \epoc32\tools\build\lib\Parse\Yapp\Parse.pm
+..\lib\XML\Checker.pm \epoc32\tools\build\lib\XML\Checker.pm
+..\lib\XML\DOM.pm \epoc32\tools\build\lib\XML\DOM.pm
+..\lib\XML\Parser.pod \epoc32\tools\build\lib\XML\Parser.pod
+..\lib\XML\perllocal.pod \epoc32\tools\build\lib\XML\perllocal.pod
+..\lib\XML\RegExp.pm \epoc32\tools\build\lib\XML\RegExp.pm
+..\lib\XML\UM.pm \epoc32\tools\build\lib\XML\UM.pm
+..\lib\XML\XQL.pm \epoc32\tools\build\lib\XML\XQL.pm
+..\lib\XML\Checker\DOM.pm \epoc32\tools\build\lib\XML\Checker\DOM.pm
+..\lib\XML\Checker\Parser.pm \epoc32\tools\build\lib\XML\Checker\Parser.pm
+..\lib\XML\DOM\AttDef.pod \epoc32\tools\build\lib\XML\DOM\AttDef.pod
+..\lib\XML\DOM\AttlistDecl.pod \epoc32\tools\build\lib\XML\DOM\AttlistDecl.pod
+..\lib\XML\DOM\Attr.pod \epoc32\tools\build\lib\XML\DOM\Attr.pod
+..\lib\XML\DOM\CDATASection.pod \epoc32\tools\build\lib\XML\DOM\CDATASection.pod
+..\lib\XML\DOM\CharacterData.pod \epoc32\tools\build\lib\XML\DOM\CharacterData.pod
+..\lib\XML\DOM\Comment.pod \epoc32\tools\build\lib\XML\DOM\Comment.pod
+..\lib\XML\DOM\Document.pod \epoc32\tools\build\lib\XML\DOM\Document.pod
+..\lib\XML\DOM\DocumentFragment.pod \epoc32\tools\build\lib\XML\DOM\DocumentFragment.pod
+..\lib\XML\DOM\DocumentType.pod \epoc32\tools\build\lib\XML\DOM\DocumentType.pod
+..\lib\XML\DOM\DOMException.pm \epoc32\tools\build\lib\XML\DOM\DOMException.pm
+..\lib\XML\DOM\DOMImplementation.pod \epoc32\tools\build\lib\XML\DOM\DOMImplementation.pod
+..\lib\XML\DOM\Element.pod \epoc32\tools\build\lib\XML\DOM\Element.pod
+..\lib\XML\DOM\ElementDecl.pod \epoc32\tools\build\lib\XML\DOM\ElementDecl.pod
+..\lib\XML\DOM\Entity.pod \epoc32\tools\build\lib\XML\DOM\Entity.pod
+..\lib\XML\DOM\EntityReference.pod \epoc32\tools\build\lib\XML\DOM\EntityReference.pod
+..\lib\XML\DOM\NamedNodeMap.pm \epoc32\tools\build\lib\XML\DOM\NamedNodeMap.pm
+..\lib\XML\DOM\NamedNodeMap.pod \epoc32\tools\build\lib\XML\DOM\NamedNodeMap.pod
+..\lib\XML\DOM\Node.pod \epoc32\tools\build\lib\XML\DOM\Node.pod
+..\lib\XML\DOM\NodeList.pm \epoc32\tools\build\lib\XML\DOM\NodeList.pm
+..\lib\XML\DOM\NodeList.pod \epoc32\tools\build\lib\XML\DOM\NodeList.pod
+..\lib\XML\DOM\Notation.pod \epoc32\tools\build\lib\XML\DOM\Notation.pod
+..\lib\XML\DOM\Parser.pod \epoc32\tools\build\lib\XML\DOM\Parser.pod
+..\lib\XML\DOM\PerlSAX.pm \epoc32\tools\build\lib\XML\DOM\PerlSAX.pm
+..\lib\XML\DOM\ProcessingInstruction.pod \epoc32\tools\build\lib\XML\DOM\ProcessingInstruction.pod
+..\lib\XML\DOM\Text.pod \epoc32\tools\build\lib\XML\DOM\Text.pod
+..\lib\XML\DOM\ValParser.pm \epoc32\tools\build\lib\XML\DOM\ValParser.pm
+..\lib\XML\DOM\XMLDecl.pod \epoc32\tools\build\lib\XML\DOM\XMLDecl.pod
+..\lib\XML\Filter\DetectWS.pm \epoc32\tools\build\lib\XML\Filter\DetectWS.pm
+..\lib\XML\Filter\Reindent.pm \epoc32\tools\build\lib\XML\Filter\Reindent.pm
+..\lib\XML\Filter\SAXT.pm \epoc32\tools\build\lib\XML\Filter\SAXT.pm
+..\lib\XML\Handler\BuildDOM.pm \epoc32\tools\build\lib\XML\Handler\BuildDOM.pm
+..\lib\XML\Handler\CanonXMLWriter.pm \epoc32\tools\build\lib\XML\Handler\CanonXMLWriter.pm
+..\lib\XML\Handler\Composer.pm \epoc32\tools\build\lib\XML\Handler\Composer.pm
+..\lib\XML\Handler\PrintEvents.pm \epoc32\tools\build\lib\XML\Handler\PrintEvents.pm
+..\lib\XML\Handler\Sample.pm \epoc32\tools\build\lib\XML\Handler\Sample.pm
+..\lib\XML\Handler\Subs.pm \epoc32\tools\build\lib\XML\Handler\Subs.pm
+..\lib\XML\Handler\XMLWriter.pm \epoc32\tools\build\lib\XML\Handler\XMLWriter.pm
+..\lib\XML\Parser\Expat.pod \epoc32\tools\build\lib\XML\Parser\Expat.pod
+..\lib\XML\XQL\Date.pm \epoc32\tools\build\lib\XML\XQL\Date.pm
+..\lib\XML\XQL\Debug.pm \epoc32\tools\build\lib\XML\XQL\Debug.pm
+..\lib\XML\XQL\DirXQL.pm \epoc32\tools\build\lib\XML\XQL\DirXQL.pm
+..\lib\XML\XQL\DOM.pm \epoc32\tools\build\lib\XML\XQL\DOM.pm
+..\lib\XML\XQL\Parser.pm \epoc32\tools\build\lib\XML\XQL\Parser.pm
+..\lib\XML\XQL\Plus.pm \epoc32\tools\build\lib\XML\XQL\Plus.pm
+..\lib\XML\XQL\Query.pod \epoc32\tools\build\lib\XML\XQL\Query.pod
+..\lib\XML\XQL\Strict.pm \epoc32\tools\build\lib\XML\XQL\Strict.pm
+..\lib\XML\XQL\Tutorial.pod \epoc32\tools\build\lib\XML\XQL\Tutorial.pod
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/group/tools_build.history.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<relnotes name="BUILDSYSTEMTOOLS">
+ <purpose>
+ </purpose>
+
+ <defect number="PDEF117063" title="scanlog module name is not case consistent" revision="004">
+ Renamed scanlog.pm to Scanlog.pm. Updated PRJ_EXPORTS for Scanlog.pm.
+ </defect>
+
+ <defect number="DEF120924" title="Exports fail on Linux due to wrong filename / directory case" revision="003">
+ Exports fail on Linux due to wrong filename / directory case
+ </defect>
+
+ <minorchange revision="002">
+ Removed graphics_graphicssurfaces unit, which is an obsolete prototype implementation. The "Graphics Surfaces" component remains in the model, and will eventually contain the production implementation of this feature.
+ </minorchange>
+
+ <minorchange revision="001">
+ Enable additional components in the v9.5 configuration. The extra components are in the graphics subsystem, associated with PREQ1004 (egl, eglheader, openvg, openvgheaders) and PREQ1007 (graphicssurfaces).
+ </minorchange>
+</relnotes>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/group/tools_build.mrp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,37 @@
+#
+# 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:
+#
+
+component tools_build
+#UmaA: Custkit build tools...
+
+source \sf\os\buildtools\bldsystemtools\buildsystemtools\
+exports \sf\os\buildtools\bldsystemtools\buildsystemtools\group
+
+-export_file \sf\os\buildtools\bldsystemtools\buildsystemtools\docs\scanlog.txt \epoc32\EngDoc\tools\build\scanlog.txt
+notes_source \component_defs\release.src
+
+
+ipr T
+ipr G \sf\os\buildtools\bldsystemtools\buildsystemtools\lib
+ipr O \sf\os\buildtools\bldsystemtools\buildsystemtools\lib\date
+ipr O \sf\os\buildtools\bldsystemtools\buildsystemtools\lib\freezethaw
+ipr O \sf\os\buildtools\bldsystemtools\buildsystemtools\lib\parse
+ipr O \sf\os\buildtools\bldsystemtools\buildsystemtools\lib\src
+ipr O \sf\os\buildtools\bldsystemtools\buildsystemtools\lib\xml
+ipr G \sf\os\buildtools\bldsystemtools\buildsystemtools\lib\xml\checker
+ipr G \sf\os\buildtools\bldsystemtools\buildsystemtools\lib\xml\Handler
+ipr G \sf\os\buildtools\bldsystemtools\buildsystemtools\lib\xml\Parser
+ipr G \sf\os\buildtools\bldsystemtools\buildsystemtools\lib\xml\XQL
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/Date/Manip.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,7362 @@
+package Date::Manip;
+# Copyright (c) 1995-2003 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+###########################################################################
+###########################################################################
+
+use vars qw($OS %Lang %Holiday %Events %Curr %Cnf %Zone $VERSION @ISA @EXPORT);
+
+# Determine the type of OS...
+$OS="Unix";
+$OS="Windows" if ((defined $^O and
+ $^O =~ /MSWin32/i ||
+ $^O =~ /Windows_95/i ||
+ $^O =~ /Windows_NT/i) ||
+ (defined $ENV{OS} and
+ $ENV{OS} =~ /MSWin32/i ||
+ $ENV{OS} =~ /Windows_95/i ||
+ $ENV{OS} =~ /Windows_NT/i));
+$OS="Netware" if (defined $^O and
+ $^O =~ /NetWare/i);
+$OS="Mac" if ((defined $^O and
+ $^O =~ /MacOS/i) ||
+ (defined $ENV{OS} and
+ $ENV{OS} =~ /MacOS/i));
+$OS="MPE" if (defined $^O and
+ $^O =~ /MPE/i);
+$OS="OS2" if (defined $^O and
+ $^O =~ /os2/i);
+$OS="VMS" if (defined $^O and
+ $^O =~ /VMS/i);
+
+# Determine if we're doing taint checking
+$Date::Manip::NoTaint = eval { local $^W; unlink "$^X$^T"; 1 };
+
+###########################################################################
+# CUSTOMIZATION
+###########################################################################
+#
+# See the section of the POD documentation section CUSTOMIZING DATE::MANIP
+# below for a complete description of each of these variables.
+
+
+# Location of a the global config file. Tilde (~) expansions are allowed.
+# This should be set in Date_Init arguments.
+$Cnf{"GlobalCnf"}="";
+$Cnf{"IgnoreGlobalCnf"}="";
+
+# Name of a personal config file and the path to search for it. Tilde (~)
+# expansions are allowed. This should be set in Date_Init arguments or in
+# the global config file.
+
+@Date::Manip::DatePath=();
+if ($OS eq "Windows") {
+ $Cnf{"PathSep"} = ";";
+ $Cnf{"PersonalCnf"} = "Manip.cnf";
+ $Cnf{"PersonalCnfPath"} = ".";
+
+} elsif ($OS eq "Netware") {
+ $Cnf{"PathSep"} = ";";
+ $Cnf{"PersonalCnf"} = "Manip.cnf";
+ $Cnf{"PersonalCnfPath"} = ".";
+
+} elsif ($OS eq "MPE") {
+ $Cnf{"PathSep"} = ":";
+ $Cnf{"PersonalCnf"} = "Manip.cnf";
+ $Cnf{"PersonalCnfPath"} = ".";
+
+} elsif ($OS eq "OS2") {
+ $Cnf{"PathSep"} = ":";
+ $Cnf{"PersonalCnf"} = "Manip.cnf";
+ $Cnf{"PersonalCnfPath"} = ".";
+
+} elsif ($OS eq "Mac") {
+ $Cnf{"PathSep"} = ":";
+ $Cnf{"PersonalCnf"} = "Manip.cnf";
+ $Cnf{"PersonalCnfPath"} = ".";
+
+} elsif ($OS eq "VMS") {
+ # VMS doesn't like files starting with "."
+ $Cnf{"PathSep"} = "\n";
+ $Cnf{"PersonalCnf"} = "Manip.cnf";
+ $Cnf{"PersonalCnfPath"} = ".\n~";
+
+} else {
+ # Unix
+ $Cnf{"PathSep"} = ":";
+ $Cnf{"PersonalCnf"} = ".DateManip.cnf";
+ $Cnf{"PersonalCnfPath"} = ".:~";
+ @Date::Manip::DatePath=qw(/bin /usr/bin /usr/local/bin);
+}
+
+### Date::Manip variables set in the global or personal config file
+
+# Which language to use when parsing dates.
+$Cnf{"Language"}="English";
+
+# 12/10 = Dec 10 (US) or Oct 12 (anything else)
+$Cnf{"DateFormat"}="US";
+
+# Local timezone
+$Cnf{"TZ"}="";
+
+# Timezone to work in (""=local, "IGNORE", or a timezone)
+$Cnf{"ConvTZ"}="";
+
+# Date::Manip internal format (0=YYYYMMDDHH:MN:SS, 1=YYYYHHMMDDHHMNSS)
+$Cnf{"Internal"}=0;
+
+# First day of the week (1=monday, 7=sunday). ISO 8601 says monday.
+$Cnf{"FirstDay"}=1;
+
+# First and last day of the work week (1=monday, 7=sunday)
+$Cnf{"WorkWeekBeg"}=1;
+$Cnf{"WorkWeekEnd"}=5;
+
+# If non-nil, a work day is treated as 24 hours long (WorkDayBeg/WorkDayEnd
+# ignored)
+$Cnf{"WorkDay24Hr"}=0;
+
+# Start and end time of the work day (any time format allowed, seconds
+# ignored)
+$Cnf{"WorkDayBeg"}="08:00";
+$Cnf{"WorkDayEnd"}="17:00";
+
+# If "today" is a holiday, we look either to "tomorrow" or "yesterday" for
+# the nearest business day. By default, we'll always look "tomorrow"
+# first.
+$Cnf{"TomorrowFirst"}=1;
+
+# Erase the old holidays
+$Cnf{"EraseHolidays"}="";
+
+# Set this to non-zero to be produce completely backwards compatible deltas
+$Cnf{"DeltaSigns"}=0;
+
+# If this is 0, use the ISO 8601 standard that Jan 4 is in week 1. If 1,
+# make week 1 contain Jan 1.
+$Cnf{"Jan1Week1"}=0;
+
+# 2 digit years fall into the 100 year period given by [ CURR-N,
+# CURR+(99-N) ] where N is 0-99. Default behavior is 89, but other useful
+# numbers might be 0 (forced to be this year or later) and 99 (forced to be
+# this year or earlier). It can also be set to "c" (current century) or
+# "cNN" (i.e. c18 forces the year to bet 1800-1899). Also accepts the
+# form cNNNN to give the 100 year period NNNN to NNNN+99.
+$Cnf{"YYtoYYYY"}=89;
+
+# Set this to 1 if you want a long-running script to always update the
+# timezone. This will slow Date::Manip down. Read the POD documentation.
+$Cnf{"UpdateCurrTZ"}=0;
+
+# Use an international character set.
+$Cnf{"IntCharSet"}=0;
+
+# Use this to force the current date to be set to this:
+$Cnf{"ForceDate"}="";
+
+###########################################################################
+
+require 5.000;
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(
+ DateManipVersion
+ Date_Init
+ ParseDateString
+ ParseDate
+ ParseRecur
+ Date_Cmp
+ DateCalc
+ ParseDateDelta
+ UnixDate
+ Delta_Format
+ Date_GetPrev
+ Date_GetNext
+ Date_SetTime
+ Date_SetDateField
+ Date_IsHoliday
+ Events_List
+
+ Date_DaysInMonth
+ Date_DayOfWeek
+ Date_SecsSince1970
+ Date_SecsSince1970GMT
+ Date_DaysSince1BC
+ Date_DayOfYear
+ Date_DaysInYear
+ Date_WeekOfYear
+ Date_LeapYear
+ Date_DaySuffix
+ Date_ConvTZ
+ Date_TimeZone
+ Date_IsWorkDay
+ Date_NextWorkDay
+ Date_PrevWorkDay
+ Date_NearestWorkDay
+ Date_NthDayOfYear
+);
+use strict;
+use integer;
+use Carp;
+
+use IO::File;
+
+$VERSION="5.42";
+
+########################################################################
+########################################################################
+
+$Curr{"InitLang"} = 1; # Whether a language is being init'ed
+$Curr{"InitDone"} = 0; # Whether Init_Date has been called
+$Curr{"InitFilesRead"} = 0;
+$Curr{"ResetWorkDay"} = 1;
+$Curr{"Debug"} = "";
+$Curr{"DebugVal"} = "";
+
+$Holiday{"year"} = 0;
+$Holiday{"dates"} = {};
+$Holiday{"desc"} = {};
+
+$Events{"raw"} = [];
+$Events{"parsed"} = 0;
+$Events{"dates"} = [];
+$Events{"recur"} = [];
+
+########################################################################
+########################################################################
+# THESE ARE THE MAIN ROUTINES
+########################################################################
+########################################################################
+
+# Get rid of a problem with old versions of perl
+no strict "vars";
+# This sorts from longest to shortest element
+sub sortByLength {
+ return (length $b <=> length $a);
+}
+use strict "vars";
+
+sub DateManipVersion {
+ print "DEBUG: DateManipVersion\n" if ($Curr{"Debug"} =~ /trace/);
+ return $VERSION;
+}
+
+sub Date_Init {
+ print "DEBUG: Date_Init\n" if ($Curr{"Debug"} =~ /trace/);
+ $Curr{"Debug"}="";
+
+ my(@args)=@_;
+ $Curr{"InitDone"}=1;
+ local($_)=();
+ my($internal,$firstday)=();
+ my($var,$val,$file,@tmp)=();
+
+ # InitFilesRead = 0 : no conf files read yet
+ # 1 : global read, no personal read
+ # 2 : personal read
+
+ $Cnf{"EraseHolidays"}=0;
+ foreach (@args) {
+ s/\s*$//;
+ s/^\s*//;
+ /^(\S+) \s* = \s* (.+)$/x;
+ ($var,$val)=($1,$2);
+ if ($var =~ /^GlobalCnf$/i) {
+ $Cnf{"GlobalCnf"}=$val;
+ if ($val) {
+ $Curr{"InitFilesRead"}=0;
+ &EraseHolidays();
+ }
+ } elsif ($var =~ /^PathSep$/i) {
+ $Cnf{"PathSep"}=$val;
+ } elsif ($var =~ /^PersonalCnf$/i) {
+ $Cnf{"PersonalCnf"}=$val;
+ $Curr{"InitFilesRead"}=1 if ($Curr{"InitFilesRead"}==2);
+ } elsif ($var =~ /^PersonalCnfPath$/i) {
+ $Cnf{"PersonalCnfPath"}=$val;
+ $Curr{"InitFilesRead"}=1 if ($Curr{"InitFilesRead"}==2);
+ } elsif ($var =~ /^IgnoreGlobalCnf$/i) {
+ $Curr{"InitFilesRead"}=1 if ($Curr{"InitFilesRead"}==0);
+ $Cnf{"IgnoreGlobalCnf"}=1;
+ } elsif ($var =~ /^EraseHolidays$/i) {
+ &EraseHolidays();
+ } else {
+ push(@tmp,$_);
+ }
+ }
+ @args=@tmp;
+
+ # Read global config file
+ if ($Curr{"InitFilesRead"}<1 && ! $Cnf{"IgnoreGlobalCnf"}) {
+ $Curr{"InitFilesRead"}=1;
+
+ if ($Cnf{"GlobalCnf"}) {
+ $file=&ExpandTilde($Cnf{"GlobalCnf"});
+ &Date_InitFile($file) if ($file);
+ }
+ }
+
+ # Read personal config file
+ if ($Curr{"InitFilesRead"}<2) {
+ $Curr{"InitFilesRead"}=2;
+
+ if ($Cnf{"PersonalCnf"} and $Cnf{"PersonalCnfPath"}) {
+ $file=&SearchPath($Cnf{"PersonalCnf"},$Cnf{"PersonalCnfPath"},"r");
+ &Date_InitFile($file) if ($file);
+ }
+ }
+
+ foreach (@args) {
+ s/\s*$//;
+ s/^\s*//;
+ /^(\S+) \s* = \s* (.*)$/x;
+ ($var,$val)=($1,$2);
+ $val="" if (! defined $val);
+ &Date_SetConfigVariable($var,$val);
+ }
+
+ confess "ERROR: Unknown FirstDay in Date::Manip.\n"
+ if (! &IsInt($Cnf{"FirstDay"},1,7));
+ confess "ERROR: Unknown WorkWeekBeg in Date::Manip.\n"
+ if (! &IsInt($Cnf{"WorkWeekBeg"},1,7));
+ confess "ERROR: Unknown WorkWeekEnd in Date::Manip.\n"
+ if (! &IsInt($Cnf{"WorkWeekEnd"},1,7));
+ confess "ERROR: Invalid WorkWeek in Date::Manip.\n"
+ if ($Cnf{"WorkWeekEnd"} <= $Cnf{"WorkWeekBeg"});
+
+ my(%lang,
+ $tmp,%tmp,$tmp2,@tmp2,
+ $i,$j,@tmp3,
+ $zonesrfc,@zones)=();
+
+ my($L)=$Cnf{"Language"};
+
+ if ($Curr{"InitLang"}) {
+ $Curr{"InitLang"}=0;
+
+ if ($L eq "English") {
+ &Date_Init_English(\%lang);
+
+ } elsif ($L eq "French") {
+ &Date_Init_French(\%lang);
+
+ } elsif ($L eq "Swedish") {
+ &Date_Init_Swedish(\%lang);
+
+ } elsif ($L eq "German") {
+ &Date_Init_German(\%lang);
+
+ } elsif ($L eq "Polish") {
+ &Date_Init_Polish(\%lang);
+
+ } elsif ($L eq "Dutch" ||
+ $L eq "Nederlands") {
+ &Date_Init_Dutch(\%lang);
+
+ } elsif ($L eq "Spanish") {
+ &Date_Init_Spanish(\%lang);
+
+ } elsif ($L eq "Portuguese") {
+ &Date_Init_Portuguese(\%lang);
+
+ } elsif ($L eq "Romanian") {
+ &Date_Init_Romanian(\%lang);
+
+ } elsif ($L eq "Italian") {
+ &Date_Init_Italian(\%lang);
+
+ } elsif ($L eq "Russian") {
+ &Date_Init_Russian(\%lang);
+
+ } elsif ($L eq "Turkish") {
+ &Date_Init_Turkish(\%lang);
+
+ } elsif ($L eq "Danish") {
+ &Date_Init_Danish(\%lang);
+
+ } else {
+ confess "ERROR: Unknown language in Date::Manip.\n";
+ }
+
+ # variables for months
+ # Month = "(jan|january|feb|february ... )"
+ # MonL = [ "Jan","Feb",... ]
+ # MonthL = [ "January","February", ... ]
+ # MonthH = { "january"=>1, "jan"=>1, ... }
+
+ $Lang{$L}{"MonthH"}={};
+ $Lang{$L}{"MonthL"}=[];
+ $Lang{$L}{"MonL"}=[];
+ &Date_InitLists([$lang{"month_name"},
+ $lang{"month_abb"}],
+ \$Lang{$L}{"Month"},"lc,sort,back",
+ [$Lang{$L}{"MonthL"},
+ $Lang{$L}{"MonL"}],
+ [$Lang{$L}{"MonthH"},1]);
+
+ # variables for day of week
+ # Week = "(mon|monday|tue|tuesday ... )"
+ # WL = [ "M","T",... ]
+ # WkL = [ "Mon","Tue",... ]
+ # WeekL = [ "Monday","Tudesday",... ]
+ # WeekH = { "monday"=>1,"mon"=>1,"m"=>1,... }
+
+ $Lang{$L}{"WeekH"}={};
+ $Lang{$L}{"WeekL"}=[];
+ $Lang{$L}{"WkL"}=[];
+ $Lang{$L}{"WL"}=[];
+ &Date_InitLists([$lang{"day_name"},
+ $lang{"day_abb"}],
+ \$Lang{$L}{"Week"},"lc,sort,back",
+ [$Lang{$L}{"WeekL"},
+ $Lang{$L}{"WkL"}],
+ [$Lang{$L}{"WeekH"},1]);
+ &Date_InitLists([$lang{"day_char"}],
+ "","lc",
+ [$Lang{$L}{"WL"}],
+ [\%tmp,1]);
+ %{ $Lang{$L}{"WeekH"} } =
+ (%{ $Lang{$L}{"WeekH"} },%tmp);
+
+ # variables for last
+ # Last = "(last)"
+ # LastL = [ "last" ]
+ # Each = "(each)"
+ # EachL = [ "each" ]
+ # variables for day of month
+ # DoM = "(1st|first ... 31st)"
+ # DoML = [ "1st","2nd",... "31st" ]
+ # DoMH = { "1st"=>1,"first"=>1, ... "31st"=>31 }
+ # variables for week of month
+ # WoM = "(1st|first| ... 5th|last)"
+ # WoMH = { "1st"=>1, ... "5th"=>5,"last"=>-1 }
+
+ $Lang{$L}{"LastL"}=$lang{"last"};
+ &Date_InitStrings($lang{"last"},
+ \$Lang{$L}{"Last"},"lc,sort");
+
+ $Lang{$L}{"EachL"}=$lang{"each"};
+ &Date_InitStrings($lang{"each"},
+ \$Lang{$L}{"Each"},"lc,sort");
+
+ $Lang{$L}{"DoMH"}={};
+ $Lang{$L}{"DoML"}=[];
+ &Date_InitLists([$lang{"num_suff"},
+ $lang{"num_word"}],
+ \$Lang{$L}{"DoM"},"lc,sort,back,escape",
+ [$Lang{$L}{"DoML"},
+ \@tmp],
+ [$Lang{$L}{"DoMH"},1]);
+
+ @tmp=();
+ foreach $tmp (keys %{ $Lang{$L}{"DoMH"} }) {
+ $tmp2=$Lang{$L}{"DoMH"}{$tmp};
+ if ($tmp2<6) {
+ $Lang{$L}{"WoMH"}{$tmp} = $tmp2;
+ push(@tmp,$tmp);
+ }
+ }
+ foreach $tmp (@{ $Lang{$L}{"LastL"} }) {
+ $Lang{$L}{"WoMH"}{$tmp} = -1;
+ push(@tmp,$tmp);
+ }
+ &Date_InitStrings(\@tmp,\$Lang{$L}{"WoM"},
+ "lc,sort,back,escape");
+
+ # variables for AM or PM
+ # AM = "(am)"
+ # PM = "(pm)"
+ # AmPm = "(am|pm)"
+ # AMstr = "AM"
+ # PMstr = "PM"
+
+ &Date_InitStrings($lang{"am"},\$Lang{$L}{"AM"},"lc,sort,escape");
+ &Date_InitStrings($lang{"pm"},\$Lang{$L}{"PM"},"lc,sort,escape");
+ &Date_InitStrings([ @{$lang{"am"}},@{$lang{"pm"}} ],\$Lang{$L}{"AmPm"},
+ "lc,back,sort,escape");
+ $Lang{$L}{"AMstr"}=$lang{"am"}[0];
+ $Lang{$L}{"PMstr"}=$lang{"pm"}[0];
+
+ # variables for expressions used in parsing deltas
+ # Yabb = "(?:y|yr|year|years)"
+ # Mabb = similar for months
+ # Wabb = similar for weeks
+ # Dabb = similar for days
+ # Habb = similar for hours
+ # MNabb = similar for minutes
+ # Sabb = similar for seconds
+ # Repl = { "abb"=>"replacement" }
+ # Whenever an abbreviation could potentially refer to two different
+ # strings (M standing for Minutes or Months), the abbreviation must
+ # be listed in Repl instead of in the appropriate Xabb values. This
+ # only applies to abbreviations which are substrings of other values
+ # (so there is no confusion between Mn and Month).
+
+ &Date_InitStrings($lang{"years"} ,\$Lang{$L}{"Yabb"}, "lc,sort");
+ &Date_InitStrings($lang{"months"} ,\$Lang{$L}{"Mabb"}, "lc,sort");
+ &Date_InitStrings($lang{"weeks"} ,\$Lang{$L}{"Wabb"}, "lc,sort");
+ &Date_InitStrings($lang{"days"} ,\$Lang{$L}{"Dabb"}, "lc,sort");
+ &Date_InitStrings($lang{"hours"} ,\$Lang{$L}{"Habb"}, "lc,sort");
+ &Date_InitStrings($lang{"minutes"},\$Lang{$L}{"MNabb"},"lc,sort");
+ &Date_InitStrings($lang{"seconds"},\$Lang{$L}{"Sabb"}, "lc,sort");
+ $Lang{$L}{"Repl"}={};
+ &Date_InitHash($lang{"replace"},undef,"lc",$Lang{$L}{"Repl"});
+
+ # variables for special dates that are offsets from now
+ # Now = "(now|today)"
+ # Offset = "(yesterday|tomorrow)"
+ # OffsetH = { "yesterday"=>"-0:0:0:1:0:0:0",... ]
+ # Times = "(noon|midnight)"
+ # TimesH = { "noon"=>"12:00:00","midnight"=>"00:00:00" }
+ # SepHM = hour/minute separator
+ # SepMS = minute/second separator
+ # SepSS = second/fraction separator
+
+ $Lang{$L}{"TimesH"}={};
+ &Date_InitHash($lang{"times"},
+ \$Lang{$L}{"Times"},"lc,sort,back",
+ $Lang{$L}{"TimesH"});
+ &Date_InitStrings($lang{"now"},\$Lang{$L}{"Now"},"lc,sort");
+ $Lang{$L}{"OffsetH"}={};
+ &Date_InitHash($lang{"offset"},
+ \$Lang{$L}{"Offset"},"lc,sort,back",
+ $Lang{$L}{"OffsetH"});
+ $Lang{$L}{"SepHM"}=$lang{"sephm"};
+ $Lang{$L}{"SepMS"}=$lang{"sepms"};
+ $Lang{$L}{"SepSS"}=$lang{"sepss"};
+
+ # variables for time zones
+ # zones = regular expression with all zone names (EST)
+ # n2o = a hash of all parsable zone names with their offsets
+ # tzones = reguar expression with all tzdata timezones (US/Eastern)
+ # tz2z = hash of all tzdata timezones to full timezone (EST#EDT)
+
+ $zonesrfc=
+ "idlw -1200 ". # International Date Line West
+ "nt -1100 ". # Nome
+ "hst -1000 ". # Hawaii Standard
+ "cat -1000 ". # Central Alaska
+ "ahst -1000 ". # Alaska-Hawaii Standard
+ "akst -0900 ". # Alaska Standard
+ "yst -0900 ". # Yukon Standard
+ "hdt -0900 ". # Hawaii Daylight
+ "akdt -0800 ". # Alaska Daylight
+ "ydt -0800 ". # Yukon Daylight
+ "pst -0800 ". # Pacific Standard
+ "pdt -0700 ". # Pacific Daylight
+ "mst -0700 ". # Mountain Standard
+ "mdt -0600 ". # Mountain Daylight
+ "cst -0600 ". # Central Standard
+ "cdt -0500 ". # Central Daylight
+ "est -0500 ". # Eastern Standard
+ "act -0500 ". # Brazil, Acre
+ "sat -0400 ". # Chile
+ "bot -0400 ". # Bolivia
+ "amt -0400 ". # Brazil, Amazon
+ "acst -0400 ". # Brazil, Acre Daylight
+ "edt -0400 ". # Eastern Daylight
+ "ast -0400 ". # Atlantic Standard
+ #"nst -0330 ". # Newfoundland Standard nst=North Sumatra +0630
+ "nft -0330 ". # Newfoundland
+ #"gst -0300 ". # Greenland Standard gst=Guam Standard +1000
+ #"bst -0300 ". # Brazil Standard bst=British Summer +0100
+ "brt -0300 ". # Brazil Standard (official time)
+ "brst -0300 ". # Brazil Standard
+ "adt -0300 ". # Atlantic Daylight
+ "art -0300 ". # Argentina
+ "amst -0300 ". # Brazil, Amazon Daylight
+ "ndt -0230 ". # Newfoundland Daylight
+ "brst -0200 ". # Brazil Daylight (official time)
+ "fnt -0200 ". # Brazil, Fernando de Noronha
+ "at -0200 ". # Azores
+ "wat -0100 ". # West Africa
+ "fnst -0100 ". # Brazil, Fernando de Noronha Daylight
+ "gmt +0000 ". # Greenwich Mean
+ "ut +0000 ". # Universal
+ "utc +0000 ". # Universal (Coordinated)
+ "wet +0000 ". # Western European
+ "cet +0100 ". # Central European
+ "fwt +0100 ". # French Winter
+ "met +0100 ". # Middle European
+ "mez +0100 ". # Middle European
+ "mewt +0100 ". # Middle European Winter
+ "swt +0100 ". # Swedish Winter
+ "bst +0100 ". # British Summer bst=Brazil standard -0300
+ "gb +0100 ". # GMT with daylight savings
+ "west +0000 ". # Western European Daylight
+ "eet +0200 ". # Eastern Europe, USSR Zone 1
+ "cest +0200 ". # Central European Summer
+ "fst +0200 ". # French Summer
+ "ist +0200 ". # Israel standard
+ "mest +0200 ". # Middle European Summer
+ "mesz +0200 ". # Middle European Summer
+ "metdst +0200 ". # An alias for mest used by HP-UX
+ "sast +0200 ". # South African Standard
+ "sst +0200 ". # Swedish Summer sst=South Sumatra +0700
+ "bt +0300 ". # Baghdad, USSR Zone 2
+ "eest +0300 ". # Eastern Europe Summer
+ "eetedt +0300 ". # Eastern Europe, USSR Zone 1
+ "idt +0300 ". # Israel Daylight
+ "msk +0300 ". # Moscow
+ "eat +0300 ". # East Africa
+ "it +0330 ". # Iran
+ "zp4 +0400 ". # USSR Zone 3
+ "msd +0400 ". # Moscow Daylight
+ "zp5 +0500 ". # USSR Zone 4
+ "ist +0530 ". # Indian Standard
+ "zp6 +0600 ". # USSR Zone 5
+ "novst +0600 ". # Novosibirsk time zone, Russia
+ "nst +0630 ". # North Sumatra nst=Newfoundland Std -0330
+ #"sst +0700 ". # South Sumatra, USSR Zone 6 sst=Swedish Summer +0200
+ "javt +0700 ". # Java
+ "hkt +0800 ". # Hong Kong
+ "sgt +0800 ". # Singapore
+ "cct +0800 ". # China Coast, USSR Zone 7
+ "awst +0800 ". # Australian Western Standard
+ "wst +0800 ". # West Australian Standard
+ "pht +0800 ". # Asia Manila
+ "kst +0900 ". # Republic of Korea
+ "jst +0900 ". # Japan Standard, USSR Zone 8
+ "rok +0900 ". # Republic of Korea
+ "acst +0930 ". # Australian Central Standard
+ "cast +0930 ". # Central Australian Standard
+ "aest +1000 ". # Australian Eastern Standard
+ "east +1000 ". # Eastern Australian Standard
+ "gst +1000 ". # Guam Standard, USSR Zone 9 gst=Greenland Std -0300
+ "acdt +1030 ". # Australian Central Daylight
+ "cadt +1030 ". # Central Australian Daylight
+ "aedt +1100 ". # Australian Eastern Daylight
+ "eadt +1100 ". # Eastern Australian Daylight
+ "idle +1200 ". # International Date Line East
+ "nzst +1200 ". # New Zealand Standard
+ "nzt +1200 ". # New Zealand
+ "nzdt +1300 ". # New Zealand Daylight
+ "z +0000 ".
+ "a +0100 b +0200 c +0300 d +0400 e +0500 f +0600 g +0700 h +0800 ".
+ "i +0900 k +1000 l +1100 m +1200 ".
+ "n -0100 o -0200 p -0300 q -0400 r -0500 s -0600 t -0700 u -0800 ".
+ "v -0900 w -1000 x -1100 y -1200";
+
+ $Zone{"n2o"} = {};
+ ($Zone{"zones"},%{ $Zone{"n2o"} })=
+ &Date_Regexp($zonesrfc,"sort,lc,under,back",
+ "keys");
+
+ $tmp=
+ "US/Pacific PST8PDT ".
+ "US/Mountain MST7MDT ".
+ "US/Central CST6CDT ".
+ "US/Eastern EST5EDT ".
+ "Canada/Pacific PST8PDT ".
+ "Canada/Mountain MST7MDT ".
+ "Canada/Central CST6CDT ".
+ "Canada/Eastern EST5EDT";
+
+ $Zone{"tz2z"} = {};
+ ($Zone{"tzones"},%{ $Zone{"tz2z"} })=
+ &Date_Regexp($tmp,"lc,under,back","keys");
+ $Cnf{"TZ"}=&Date_TimeZone;
+
+ # misc. variables
+ # At = "(?:at)"
+ # Of = "(?:in|of)"
+ # On = "(?:on)"
+ # Future = "(?:in)"
+ # Later = "(?:later)"
+ # Past = "(?:ago)"
+ # Next = "(?:next)"
+ # Prev = "(?:last|previous)"
+
+ &Date_InitStrings($lang{"at"}, \$Lang{$L}{"At"}, "lc,sort");
+ &Date_InitStrings($lang{"on"}, \$Lang{$L}{"On"}, "lc,sort");
+ &Date_InitStrings($lang{"future"},\$Lang{$L}{"Future"}, "lc,sort");
+ &Date_InitStrings($lang{"later"}, \$Lang{$L}{"Later"}, "lc,sort");
+ &Date_InitStrings($lang{"past"}, \$Lang{$L}{"Past"}, "lc,sort");
+ &Date_InitStrings($lang{"next"}, \$Lang{$L}{"Next"}, "lc,sort");
+ &Date_InitStrings($lang{"prev"}, \$Lang{$L}{"Prev"}, "lc,sort");
+ &Date_InitStrings($lang{"of"}, \$Lang{$L}{"Of"}, "lc,sort");
+
+ # calc mode variables
+ # Approx = "(?:approximately)"
+ # Exact = "(?:exactly)"
+ # Business = "(?:business)"
+
+ &Date_InitStrings($lang{"exact"}, \$Lang{$L}{"Exact"}, "lc,sort");
+ &Date_InitStrings($lang{"approx"}, \$Lang{$L}{"Approx"}, "lc,sort");
+ &Date_InitStrings($lang{"business"},\$Lang{$L}{"Business"},"lc,sort");
+
+ ############### END OF LANGUAGE INITIALIZATION
+ }
+
+ if ($Curr{"ResetWorkDay"}) {
+ my($h1,$m1,$h2,$m2)=();
+ if ($Cnf{"WorkDay24Hr"}) {
+ ($Curr{"WDBh"},$Curr{"WDBm"})=(0,0);
+ ($Curr{"WDEh"},$Curr{"WDEm"})=(24,0);
+ $Curr{"WDlen"}=24*60;
+ $Cnf{"WorkDayBeg"}="00:00";
+ $Cnf{"WorkDayEnd"}="23:59";
+
+ } else {
+ confess "ERROR: Invalid WorkDayBeg in Date::Manip.\n"
+ if (! (($h1,$m1)=&CheckTime($Cnf{"WorkDayBeg"})));
+ $Cnf{"WorkDayBeg"}="$h1:$m1";
+ confess "ERROR: Invalid WorkDayEnd in Date::Manip.\n"
+ if (! (($h2,$m2)=&CheckTime($Cnf{"WorkDayEnd"})));
+ $Cnf{"WorkDayEnd"}="$h2:$m2";
+
+ ($Curr{"WDBh"},$Curr{"WDBm"})=($h1,$m1);
+ ($Curr{"WDEh"},$Curr{"WDEm"})=($h2,$m2);
+
+ # Work day length = h1:m1 or 0:len (len minutes)
+ $h1=$h2-$h1;
+ $m1=$m2-$m1;
+ if ($m1<0) {
+ $h1--;
+ $m1+=60;
+ }
+ $Curr{"WDlen"}=$h1*60+$m1;
+ }
+ $Curr{"ResetWorkDay"}=0;
+ }
+
+ # current time
+ my($s,$mn,$h,$d,$m,$y,$wday,$yday,$isdst,$ampm,$wk)=();
+ if ($Cnf{"ForceDate"}=~
+ /^(\d{4})-(\d{2})-(\d{2})-(\d{2}):(\d{2}):(\d{2})$/) {
+ ($y,$m,$d,$h,$mn,$s)=($1,$2,$3,$4,$5,$6);
+ } else {
+ ($s,$mn,$h,$d,$m,$y,$wday,$yday,$isdst)=localtime(time);
+ $y+=1900;
+ $m++;
+ }
+ &Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk);
+ $Curr{"Y"}=$y;
+ $Curr{"M"}=$m;
+ $Curr{"D"}=$d;
+ $Curr{"H"}=$h;
+ $Curr{"Mn"}=$mn;
+ $Curr{"S"}=$s;
+ $Curr{"AmPm"}=$ampm;
+ $Curr{"Now"}=&Date_Join($y,$m,$d,$h,$mn,$s);
+
+ $Curr{"Debug"}=$Curr{"DebugVal"};
+
+ # If we're in array context, let's return a list of config variables
+ # that could be passed to Date_Init to get the same state as we're
+ # currently in.
+ if (wantarray) {
+ # Some special variables that have to be in a specific order
+ my(@special)=qw(IgnoreGlobalCnf GlobalCnf PersonalCnf PersonalCnfPath);
+ my(%tmp)=map { $_,1 } @special;
+ my(@tmp,$key,$val);
+ foreach $key (@special) {
+ $val=$Cnf{$key};
+ push(@tmp,"$key=$val");
+ }
+ foreach $key (keys %Cnf) {
+ next if (exists $tmp{$key});
+ $val=$Cnf{$key};
+ push(@tmp,"$key=$val");
+ }
+ return @tmp;
+ }
+ return ();
+}
+
+sub ParseDateString {
+ print "DEBUG: ParseDateString\n" if ($Curr{"Debug"} =~ /trace/);
+ local($_)=@_;
+ return "" if (! $_);
+
+ my($y,$m,$d,$h,$mn,$s,$i,$wofm,$dofw,$wk,$tmp,$z,$num,$err,$iso,$ampm)=();
+ my($date,$z2,$delta,$from,$falsefrom,$to,$which,$midnight)=();
+
+ # We only need to reinitialize if we have to determine what NOW is.
+ &Date_Init() if (! $Curr{"InitDone"} or $Cnf{"UpdateCurrTZ"});
+
+ my($L)=$Cnf{"Language"};
+ my($type)=$Cnf{"DateFormat"};
+
+ # Mode is set in DateCalc. ParseDate only overrides it if the string
+ # contains a mode.
+ if ($Lang{$L}{"Exact"} &&
+ s/$Lang{$L}{"Exact"}//) {
+ $Curr{"Mode"}=0;
+ } elsif ($Lang{$L}{"Approx"} &&
+ s/$Lang{$L}{"Approx"}//) {
+ $Curr{"Mode"}=1;
+ } elsif ($Lang{$L}{"Business"} &&
+ s/$Lang{$L}{"Business"}//) {
+ $Curr{"Mode"}=2;
+ } elsif (! exists $Curr{"Mode"}) {
+ $Curr{"Mode"}=0;
+ }
+
+ # Unfortunately, some deltas can be parsed as dates. An example is
+ # 1 second == 1 2nd == 1 2
+ # But, some dates can be parsed as deltas. The most important being:
+ # 1998010101:00:00
+ # We'll check to see if a "date" can be parsed as a delta. If so, we'll
+ # assume that it is a delta (since they are much simpler, it is much
+ # less likely that we'll mistake a delta for a date than vice versa)
+ # unless it is an ISO-8601 date.
+ #
+ # This is important because we are using DateCalc to test whether a
+ # string is a date or a delta. Dates are tested first, so we need to
+ # be able to pass a delta into this routine and have it correctly NOT
+ # interpreted as a date.
+ #
+ # We will insist that the string contain something other than digits and
+ # colons so that the following will get correctly interpreted as a date
+ # rather than a delta:
+ # 12:30
+ # 19980101
+
+ $delta="";
+ $delta=&ParseDateDelta($_) if (/[^:0-9]/);
+
+ # Put parse in a simple loop for an easy exit.
+ PARSE: {
+ my(@tmp)=&Date_Split($_);
+ if (@tmp) {
+ ($y,$m,$d,$h,$mn,$s)=@tmp;
+ last PARSE;
+ }
+
+ # Fundamental regular expressions
+
+ my($month)=$Lang{$L}{"Month"}; # (jan|january|...)
+ my(%month)=%{ $Lang{$L}{"MonthH"} }; # { jan=>1, ... }
+ my($week)=$Lang{$L}{"Week"}; # (mon|monday|...)
+ my(%week)=%{ $Lang{$L}{"WeekH"} }; # { mon=>1, monday=>1, ... }
+ my($wom)=$Lang{$L}{"WoM"}; # (1st|...|fifth|last)
+ my(%wom)=%{ $Lang{$L}{"WoMH"} }; # { 1st=>1,... fifth=>5,last=>-1 }
+ my($dom)=$Lang{$L}{"DoM"}; # (1st|first|...31st)
+ my(%dom)=%{ $Lang{$L}{"DoMH"} }; # { 1st=>1, first=>1, ... }
+ my($ampmexp)=$Lang{$L}{"AmPm"}; # (am|pm)
+ my($timeexp)=$Lang{$L}{"Times"}; # (noon|midnight)
+ my($now)=$Lang{$L}{"Now"}; # (now|today)
+ my($offset)=$Lang{$L}{"Offset"}; # (yesterday|tomorrow)
+ my($zone)=$Zone{"zones"} . '(?:\s+|$)'; # (edt|est|...)\s+
+ my($day)='\s*'.$Lang{$L}{"Dabb"}; # \s*(?:d|day|days)
+ my($mabb)='\s*'.$Lang{$L}{"Mabb"}; # \s*(?:mon|month|months)
+ my($wkabb)='\s*'.$Lang{$L}{"Wabb"}; # \s*(?:w|wk|week|weeks)
+ my($next)='\s*'.$Lang{$L}{"Next"}; # \s*(?:next)
+ my($prev)='\s*'.$Lang{$L}{"Prev"}; # \s*(?:last|previous)
+ my($past)='\s*'.$Lang{$L}{"Past"}; # \s*(?:ago)
+ my($future)='\s*'.$Lang{$L}{"Future"}; # \s*(?:in)
+ my($later)='\s*'.$Lang{$L}{"Later"}; # \s*(?:later)
+ my($at)=$Lang{$L}{"At"}; # (?:at)
+ my($of)='\s*'.$Lang{$L}{"Of"}; # \s*(?:in|of)
+ my($on)='(?:\s*'.$Lang{$L}{"On"}.'\s*|\s+)';
+ # \s*(?:on)\s* or \s+
+ my($last)='\s*'.$Lang{$L}{"Last"}; # \s*(?:last)
+ my($hm)=$Lang{$L}{"SepHM"}; # :
+ my($ms)=$Lang{$L}{"SepMS"}; # :
+ my($ss)=$Lang{$L}{"SepSS"}; # .
+
+ # Other regular expressions
+
+ my($D4)='(\d{4})'; # 4 digits (yr)
+ my($YY)='(\d{4}|\d{2})'; # 2 or 4 digits (yr)
+ my($DD)='(\d{2})'; # 2 digits (mon/day/hr/min/sec)
+ my($D) ='(\d{1,2})'; # 1 or 2 digit (mon/day/hr)
+ my($FS)="(?:$ss\\d+)?"; # fractional secs
+ my($sep)='[\/.-]'; # non-ISO8601 m/d/yy separators
+ # absolute time zone +0700 (GMT)
+ my($hzone)='(?:[0-1][0-9]|2[0-3])'; # 00 - 23
+ my($mzone)='(?:[0-5][0-9])'; # 00 - 59
+ my($zone2)='(?:\s*([+-](?:'."$hzone$mzone|$hzone:$mzone|$hzone))".
+ # +0700 +07:00 -07
+ '(?:\s*\([^)]+\))?)'; # (GMT)
+
+ # A regular expression for the time EXCEPT for the hour part
+ my($mnsec)="$hm$DD(?:$ms$DD$FS)?(?:\\s*$ampmexp)?";
+
+ # A special regular expression for /YYYY:HH:MN:SS used by Apache
+ my($apachetime)='(/\d{4}):' . "$DD$hm$DD$ms$DD";
+
+ my($time)="";
+ $ampm="";
+ $date="";
+
+ # Substitute all special time expressions.
+ if (/(^|[^a-z])$timeexp($|[^a-z])/i) {
+ $tmp=$2;
+ $tmp=$Lang{$L}{"TimesH"}{lc($tmp)};
+ s/(^|[^a-z])$timeexp($|[^a-z])/$1 $tmp $3/i;
+ }
+
+ # Remove some punctuation
+ s/[,]/ /g;
+
+ # Make sure that ...7EST works (i.e. a timezone immediately following
+ # a digit.
+ s/(\d)$zone(\s+|$|[0-9])/$1 $2$3/i;
+ $zone = '\s+'.$zone;
+
+ # Remove the time
+ $iso=1;
+ $midnight=0;
+ $from="24${hm}00(?:${ms}00)?";
+ $falsefrom="${hm}24${ms}00"; # Don't trap XX:24:00
+ $to="00${hm}00${ms}00";
+ $midnight=1 if (!/$falsefrom/ && s/$from/$to/);
+
+ $h=$mn=$s=0;
+ if (/$D$mnsec/i || /$ampmexp/i) {
+ $iso=0;
+ $tmp=0;
+ $tmp=1 if (/$mnsec$zone2?\s*$/i); # or /$mnsec$zone/ ??
+ $tmp=0 if (/$ampmexp/i);
+ if (s/$apachetime$zone()/$1 /i ||
+ s/$apachetime$zone2?/$1 /i ||
+ s/(^|[^a-z])$at\s*$D$mnsec$zone()/$1 /i ||
+ s/(^|[^a-z])$at\s*$D$mnsec$zone2?/$1 /i ||
+ s/(^|[^0-9])(\d)$mnsec$zone()/$1 /i ||
+ s/(^|[^0-9])(\d)$mnsec$zone2?/$1 /i ||
+ (s/(t)$D$mnsec$zone()/$1 /i and (($iso=-$tmp) || 1)) ||
+ (s/(t)$D$mnsec$zone2?/$1 /i and (($iso=-$tmp) || 1)) ||
+ (s/()$DD$mnsec$zone()/ /i and (($iso=$tmp) || 1)) ||
+ (s/()$DD$mnsec$zone2?/ /i and (($iso=$tmp) || 1)) ||
+ s/(^|$at\s*|\s+)$D()()\s*$ampmexp$zone()/ /i ||
+ s/(^|$at\s*|\s+)$D()()\s*$ampmexp$zone2?/ /i ||
+ 0
+ ) {
+ ($h,$mn,$s,$ampm,$z,$z2)=($2,$3,$4,$5,$6,$7);
+ if (defined ($z)) {
+ if ($z =~ /^[+-]\d{2}:\d{2}$/) {
+ $z=~ s/://;
+ } elsif ($z =~ /^[+-]\d{2}$/) {
+ $z .= "00";
+ }
+ }
+ $time=1;
+ &Date_TimeCheck(\$h,\$mn,\$s,\$ampm);
+ $y=$m=$d="";
+ # We're going to be calling TimeCheck again below (when we check the
+ # final date), so get rid of $ampm so that we don't have an error
+ # due to "15:30:00 PM". It'll get reset below.
+ $ampm="";
+ if (/^\s*$/) {
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ last PARSE;
+ }
+ }
+ }
+ $time=0 if ($time ne "1");
+ s/\s+$//;
+ s/^\s+//;
+
+ # dateTtime ISO 8601 formats
+ my($orig)=$_;
+ s/t$//i if ($iso<0);
+
+ # Parse ISO 8601 dates now (which may still have a zone stuck to it).
+ if ( ($iso && /^([0-9-]+(?:W[0-9-]+)?)$zone?$/i) ||
+ ($iso && /^([0-9-]+(?:W[0-9-]+)?)$zone2?$/i) ||
+ ($iso && /^([0-9-]+(?:T[0-9-]+)?)$zone?$/i) ||
+ ($iso && /^([0-9-]+(?:T[0-9-]+)?)$zone2?$/i) ||
+ 0) {
+
+ # ISO 8601 dates
+ ($_,$z,$z2) = ($1,$2);
+ s,-, ,g; # Change all ISO8601 seps to spaces
+ s/^\s+//;
+ s/\s+$//;
+
+ if (/^$D4\s*$DD\s*$DD\s*t?$DD(?:$DD(?:$DD(\d*))?)?$/i ||
+ /^$DD\s+$DD\s*$DD\s*t?$DD(?:$DD(?:$DD(\d*))?)?$/i ||
+ 0
+ ) {
+ # ISO 8601 Dates with times
+ # YYYYMMDDHHMNSSFFFF...
+ # YYYYMMDDHHMNSS
+ # YYYYMMDDHHMN
+ # YYYYMMDDHH
+ # YY MMDDHHMNSSFFFF...
+ # YY MMDDHHMNSS
+ # YY MMDDHHMN
+ # YY MMDDHH
+ ($y,$m,$d,$h,$mn,$s,$tmp)=($1,$2,$3,$4,$5,$6,$7);
+ if ($h==24 && (! defined $mn || $mn==0) && (! defined $s || $s==0)) {
+ $h=0;
+ $midnight=1;
+ }
+ $z = "" if (! defined $h);
+ return "" if ($time && defined $h);
+ last PARSE;
+
+ } elsif (/^$D4(?:\s*$DD(?:\s*$DD)?)?$/ ||
+ /^$DD(?:\s+$DD(?:\s*$DD)?)?$/) {
+ # ISO 8601 Dates
+ # YYYYMMDD
+ # YYYYMM
+ # YYYY
+ # YY MMDD
+ # YY MM
+ # YY
+ ($y,$m,$d)=($1,$2,$3);
+ last PARSE;
+
+ } elsif (/^$YY\s+$D\s+$D/) {
+ # YY-M-D
+ ($y,$m,$d)=($1,$2,$3);
+ last PARSE;
+
+ } elsif (/^$YY\s*W$DD\s*(\d)?$/i) {
+ # YY-W##-D
+ ($y,$wofm,$dofw)=($1,$2,$3);
+ ($y,$m,$d)=&Date_NthWeekOfYear($y,$wofm,$dofw);
+ last PARSE;
+
+ } elsif (/^$D4\s*(\d{3})$/ ||
+ /^$DD\s*(\d{3})$/) {
+ # YYDOY
+ ($y,$which)=($1,$2);
+ ($y,$m,$d)=&Date_NthDayOfYear($y,$which);
+ last PARSE;
+
+ } elsif ($iso<0) {
+ # We confused something like 1999/August12:00:00
+ # with a dateTtime format
+ $_=$orig;
+
+ } else {
+ return "";
+ }
+ }
+
+ # All deltas that are not ISO-8601 dates are NOT dates.
+ return "" if ($Curr{"InCalc"} && $delta);
+ if ($delta) {
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ return &DateCalc_DateDelta($Curr{"Now"},$delta);
+ }
+
+ # Check for some special types of dates (next, prev)
+ foreach $from (keys %{ $Lang{$L}{"Repl"} }) {
+ $to=$Lang{$L}{"Repl"}{$from};
+ s/(^|[^a-z])$from($|[^a-z])/$1$to$2/i;
+ }
+ if (/$wom/i || /$future/i || /$later/i || /$past/i ||
+ /$next/i || /$prev/i || /^$week$/i || /$wkabb/i) {
+ $tmp=0;
+
+ if (/^$wom\s*$week$of\s*$month\s*$YY?$/i) {
+ # last friday in October 95
+ ($wofm,$dofw,$m,$y)=($1,$2,$3,$4);
+ # fix $m, $y
+ return "" if (&Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk));
+ $dofw=$week{lc($dofw)};
+ $wofm=$wom{lc($wofm)};
+ # Get the first day of the month
+ $date=&Date_Join($y,$m,1,$h,$mn,$s);
+ if ($wofm==-1) {
+ $date=&DateCalc_DateDelta($date,"+0:1:0:0:0:0:0",\$err,0);
+ $date=&Date_GetPrev($date,$dofw,0);
+ } else {
+ for ($i=0; $i<$wofm; $i++) {
+ if ($i==0) {
+ $date=&Date_GetNext($date,$dofw,1);
+ } else {
+ $date=&Date_GetNext($date,$dofw,0);
+ }
+ }
+ }
+ last PARSE;
+
+ } elsif (/^$last$day$of\s*$month(?:$of?\s*$YY)?/i) {
+ # last day in month
+ ($m,$y)=($1,$2);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $y=&Date_FixYear($y) if (! defined $y or length($y)<4);
+ $m=$month{lc($m)};
+ $d=&Date_DaysInMonth($m,$y);
+ last PARSE;
+
+ } elsif (/^$week$/i) {
+ # friday
+ ($dofw)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&Date_GetPrev($Curr{"Now"},$Cnf{"FirstDay"},1);
+ $date=&Date_GetNext($date,$dofw,1,$h,$mn,$s);
+ last PARSE;
+
+ } elsif (/^$next\s*$week$/i) {
+ # next friday
+ ($dofw)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&Date_GetNext($Curr{"Now"},$dofw,0,$h,$mn,$s);
+ last PARSE;
+
+ } elsif (/^$prev\s*$week$/i) {
+ # last friday
+ ($dofw)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&Date_GetPrev($Curr{"Now"},$dofw,0,$h,$mn,$s);
+ last PARSE;
+
+ } elsif (/^$next$wkabb$/i) {
+ # next week
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"+0:0:1:0:0:0:0",\$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+ } elsif (/^$prev$wkabb$/i) {
+ # last week
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"-0:0:1:0:0:0:0",\$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+
+ } elsif (/^$next$mabb$/i) {
+ # next month
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"+0:1:0:0:0:0:0",\$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+ } elsif (/^$prev$mabb$/i) {
+ # last month
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"-0:1:0:0:0:0:0",\$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+
+ } elsif (/^$future\s*(\d+)$day$/i ||
+ /^(\d+)$day$later$/i) {
+ # in 2 days
+ # 2 days later
+ ($num)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"+0:0:0:$num:0:0:0",
+ \$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+ } elsif (/^(\d+)$day$past$/i) {
+ # 2 days ago
+ ($num)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"-0:0:0:$num:0:0:0",
+ \$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+
+ } elsif (/^$future\s*(\d+)$wkabb$/i ||
+ /^(\d+)$wkabb$later$/i) {
+ # in 2 weeks
+ # 2 weeks later
+ ($num)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"+0:0:$num:0:0:0:0",
+ \$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+ } elsif (/^(\d+)$wkabb$past$/i) {
+ # 2 weeks ago
+ ($num)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"-0:0:$num:0:0:0:0",
+ \$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+
+ } elsif (/^$future\s*(\d+)$mabb$/i ||
+ /^(\d+)$mabb$later$/i) {
+ # in 2 months
+ # 2 months later
+ ($num)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"+0:$num:0:0:0:0:0",
+ \$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+ } elsif (/^(\d+)$mabb$past$/i) {
+ # 2 months ago
+ ($num)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"-0:$num:0:0:0:0:0",
+ \$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+
+ } elsif (/^$week$future\s*(\d+)$wkabb$/i ||
+ /^$week\s*(\d+)$wkabb$later$/i) {
+ # friday in 2 weeks
+ # friday 2 weeks later
+ ($dofw,$num)=($1,$2);
+ $tmp="+";
+ } elsif (/^$week\s*(\d+)$wkabb$past$/i) {
+ # friday 2 weeks ago
+ ($dofw,$num)=($1,$2);
+ $tmp="-";
+ } elsif (/^$future\s*(\d+)$wkabb$on$week$/i ||
+ /^(\d+)$wkabb$later$on$week$/i) {
+ # in 2 weeks on friday
+ # 2 weeks later on friday
+ ($num,$dofw)=($1,$2);
+ $tmp="+"
+ } elsif (/^(\d+)$wkabb$past$on$week$/i) {
+ # 2 weeks ago on friday
+ ($num,$dofw)=($1,$2);
+ $tmp="-";
+ } elsif (/^$week\s*$wkabb$/i) {
+ # monday week (British date: in 1 week on monday)
+ $dofw=$1;
+ $num=1;
+ $tmp="+";
+ } elsif (/^$now\s*$wkabb$/i) {
+ # today week (British date: 1 week from today)
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},"+0:0:1:0:0:0:0",\$err,0);
+ $date=&Date_SetTime($date,$h,$mn,$s) if (defined $h);
+ last PARSE;
+ } elsif (/^$offset\s*$wkabb$/i) {
+ # tomorrow week (British date: 1 week from tomorrow)
+ ($offset)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $offset=$Lang{$L}{"OffsetH"}{lc($offset)};
+ $date=&DateCalc_DateDelta($Curr{"Now"},$offset,\$err,0);
+ $date=&DateCalc_DateDelta($date,"+0:0:1:0:0:0:0",\$err,0);
+ if ($time) {
+ return ""
+ if (&Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk));
+ $date=&Date_SetTime($date,$h,$mn,$s);
+ }
+ last PARSE;
+ }
+
+ if ($tmp) {
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=&DateCalc_DateDelta($Curr{"Now"},
+ $tmp . "0:0:$num:0:0:0:0",\$err,0);
+ $date=&Date_GetPrev($date,$Cnf{"FirstDay"},1);
+ $date=&Date_GetNext($date,$dofw,1,$h,$mn,$s);
+ last PARSE;
+ }
+ }
+
+ # Change (2nd, second) to 2
+ $tmp=0;
+ if (/(^|[^a-z0-9])$dom($|[^a-z0-9])/i) {
+ if (/^\s*$dom\s*$/) {
+ ($d)=($1);
+ $d=$dom{lc($d)};
+ $m=$Curr{"M"};
+ last PARSE;
+ }
+ my $from = $2;
+ my $to = $dom{ lc($from) };
+ s/(^|[^a-z])$from($|[^a-z])/$1 $to $2/i;
+ s/^\s+//;
+ s/\s+$//;
+ }
+
+ # Another set of special dates (Nth week)
+ if (/^$D\s*$week(?:$of?\s*$YY)?$/i) {
+ # 22nd sunday in 1996
+ ($which,$dofw,$y)=($1,$2,$3);
+ $y=$Curr{"Y"} if (! $y);
+ $y--; # previous year
+ $tmp=&Date_GetNext("$y-12-31",$dofw,0);
+ if ($which>1) {
+ $tmp=&DateCalc_DateDelta($tmp,"+0:0:".($which-1).":0:0:0:0",\$err,0);
+ }
+ ($y,$m,$d)=(&Date_Split($tmp, 1))[0..2];
+ last PARSE;
+ } elsif (/^$week$wkabb\s*$D(?:$of?\s*$YY)?$/i ||
+ /^$week\s*$D$wkabb(?:$of?\s*$YY)?$/i) {
+ # sunday week 22 in 1996
+ # sunday 22nd week in 1996
+ ($dofw,$which,$y)=($1,$2,$3);
+ ($y,$m,$d)=&Date_NthWeekOfYear($y,$which,$dofw);
+ last PARSE;
+ }
+
+ # Get rid of day of week
+ if (/(^|[^a-z])$week($|[^a-z])/i) {
+ $wk=$2;
+ (s/(^|[^a-z])$week,/$1 /i) ||
+ s/(^|[^a-z])$week($|[^a-z])/$1 $3/i;
+ s/^\s+//;
+ s/\s+$//;
+ }
+
+ {
+ # So that we can handle negative epoch times, let's convert
+ # things like "epoch -" to "epochNEGATIVE " before we strip out
+ # the $sep chars, which include '-'.
+ s,epoch\s*-,epochNEGATIVE ,g;
+
+ # Non-ISO8601 dates
+ s,\s*$sep\s*, ,g; # change all non-ISO8601 seps to spaces
+ s,^\s*,,; # remove leading/trailing space
+ s,\s*$,,;
+
+ if (/^$D\s+$D(?:\s+$YY)?$/) {
+ # MM DD YY (DD MM YY non-US)
+ ($m,$d,$y)=($1,$2,$3);
+ ($m,$d)=($d,$m) if ($type ne "US");
+ last PARSE;
+
+ } elsif (/^$D4\s*$D\s*$D$/) {
+ # YYYY MM DD
+ ($y,$m,$d)=($1,$2,$3);
+ last PARSE;
+
+ } elsif (s/(^|[^a-z])$month($|[^a-z])/$1 $3/i) {
+ ($m)=($2);
+
+ if (/^\s*$D(?:\s+$YY)?\s*$/) {
+ # mmm DD YY
+ # DD mmm YY
+ # DD YY mmm
+ ($d,$y)=($1,$2);
+ last PARSE;
+
+ } elsif (/^\s*$D$D4\s*$/) {
+ # mmm DD YYYY
+ # DD mmm YYYY
+ # DD YYYY mmm
+ ($d,$y)=($1,$2);
+ last PARSE;
+
+ } elsif (/^\s*$D4\s*$D\s*$/) {
+ # mmm YYYY DD
+ # YYYY mmm DD
+ # YYYY DD mmm
+ ($y,$d)=($1,$2);
+ last PARSE;
+
+ } elsif (/^\s*$D4\s*$/) {
+ # mmm YYYY
+ # YYYY mmm
+ ($y,$d)=($1,1);
+ last PARSE;
+
+ } else {
+ return "";
+ }
+
+ } elsif (/^epochNEGATIVE (\d+)$/) {
+ $s=$1;
+ $date=&DateCalc("1970-01-01 00:00 GMT","-0:0:$s");
+ } elsif (/^epoch\s*(\d+)$/i) {
+ $s=$1;
+ $date=&DateCalc("1970-01-01 00:00 GMT","+0:0:$s");
+
+ } elsif (/^$now$/i) {
+ # now, today
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $date=$Curr{"Now"};
+ if ($time) {
+ return ""
+ if (&Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk));
+ $date=&Date_SetTime($date,$h,$mn,$s);
+ }
+ last PARSE;
+
+ } elsif (/^$offset$/i) {
+ # yesterday, tomorrow
+ ($offset)=($1);
+ &Date_Init() if (! $Cnf{"UpdateCurrTZ"});
+ $offset=$Lang{$L}{"OffsetH"}{lc($offset)};
+ $date=&DateCalc_DateDelta($Curr{"Now"},$offset,\$err,0);
+ if ($time) {
+ return ""
+ if (&Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk));
+ $date=&Date_SetTime($date,$h,$mn,$s);
+ }
+ last PARSE;
+
+ } else {
+ return "";
+ }
+ }
+ }
+
+ if (! $date) {
+ return "" if (&Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk));
+ $date=&Date_Join($y,$m,$d,$h,$mn,$s);
+ }
+ $date=&Date_ConvTZ($date,$z);
+ if ($midnight) {
+ $date=&DateCalc_DateDelta($date,"+0:0:0:1:0:0:0");
+ }
+ return $date;
+}
+
+sub ParseDate {
+ print "DEBUG: ParseDate\n" if ($Curr{"Debug"} =~ /trace/);
+ &Date_Init() if (! $Curr{"InitDone"});
+ my($args,@args,@a,$ref,$date)=();
+ @a=@_;
+
+ # @a : is the list of args to ParseDate. Currently, only one argument
+ # is allowed and it must be a scalar (or a reference to a scalar)
+ # or a reference to an array.
+
+ if ($#a!=0) {
+ print "ERROR: Invalid number of arguments to ParseDate.\n";
+ return "";
+ }
+ $args=$a[0];
+ $ref=ref $args;
+ if (! $ref) {
+ return $args if (&Date_Split($args));
+ @args=($args);
+ } elsif ($ref eq "ARRAY") {
+ @args=@$args;
+ } elsif ($ref eq "SCALAR") {
+ return $$args if (&Date_Split($$args));
+ @args=($$args);
+ } else {
+ print "ERROR: Invalid arguments to ParseDate.\n";
+ return "";
+ }
+ @a=@args;
+
+ # @args : a list containing all the arguments (dereferenced if appropriate)
+ # @a : a list containing all the arguments currently being examined
+ # $ref : nil, "SCALAR", or "ARRAY" depending on whether a scalar, a
+ # reference to a scalar, or a reference to an array was passed in
+ # $args : the scalar or refererence passed in
+
+ PARSE: while($#a>=0) {
+ $date=join(" ",@a);
+ $date=&ParseDateString($date);
+ last if ($date);
+ pop(@a);
+ } # PARSE
+
+ splice(@args,0,$#a + 1);
+ @$args= @args if (defined $ref and $ref eq "ARRAY");
+ $date;
+}
+
+sub Date_Cmp {
+ my($D1,$D2)=@_;
+ my($date1)=&ParseDateString($D1);
+ my($date2)=&ParseDateString($D2);
+ return $date1 cmp $date2;
+}
+
+# **NOTE**
+# The calc routines all call parse routines, so it is never necessary to
+# call Date_Init in the calc routines.
+sub DateCalc {
+ print "DEBUG: DateCalc\n" if ($Curr{"Debug"} =~ /trace/);
+ my($D1,$D2,@arg)=@_;
+ my($ref,$err,$errref,$mode)=();
+
+ $errref=shift(@arg);
+ $ref=0;
+ if (defined $errref) {
+ if (ref $errref) {
+ $mode=shift(@arg);
+ $ref=1;
+ } else {
+ $mode=$errref;
+ $errref="";
+ }
+ }
+
+ my(@date,@delta,$ret,$tmp,$old)=();
+
+ if (defined $mode and $mode>=0 and $mode<=3) {
+ $Curr{"Mode"}=$mode;
+ } else {
+ $Curr{"Mode"}=0;
+ }
+
+ $old=$Curr{"InCalc"};
+ $Curr{"InCalc"}=1;
+
+ if ($tmp=&ParseDateString($D1)) {
+ # If we've already parsed the date, we don't want to do it a second
+ # time (so we don't convert timezones twice).
+ if (&Date_Split($D1)) {
+ push(@date,$D1);
+ } else {
+ push(@date,$tmp);
+ }
+ } elsif ($tmp=&ParseDateDelta($D1)) {
+ push(@delta,$tmp);
+ } else {
+ $$errref=1 if ($ref);
+ return;
+ }
+
+ if ($tmp=&ParseDateString($D2)) {
+ if (&Date_Split($D2)) {
+ push(@date,$D2);
+ } else {
+ push(@date,$tmp);
+ }
+ } elsif ($tmp=&ParseDateDelta($D2)) {
+ push(@delta,$tmp);
+ } else {
+ $$errref=2 if ($ref);
+ return;
+ }
+ $mode=$Curr{"Mode"};
+ $Curr{"InCalc"}=$old;
+
+ if ($#date==1) {
+ $ret=&DateCalc_DateDate(@date,$mode);
+ } elsif ($#date==0) {
+ $ret=&DateCalc_DateDelta(@date,@delta,\$err,$mode);
+ $$errref=$err if ($ref);
+ } else {
+ $ret=&DateCalc_DeltaDelta(@delta,$mode);
+ }
+ $ret;
+}
+
+sub ParseDateDelta {
+ print "DEBUG: ParseDateDelta\n" if ($Curr{"Debug"} =~ /trace/);
+ my($args,@args,@a,$ref)=();
+ local($_)=();
+ @a=@_;
+
+ # @a : is the list of args to ParseDateDelta. Currently, only one argument
+ # is allowed and it must be a scalar (or a reference to a scalar)
+ # or a reference to an array.
+
+ if ($#a!=0) {
+ print "ERROR: Invalid number of arguments to ParseDateDelta.\n";
+ return "";
+ }
+ $args=$a[0];
+ $ref=ref $args;
+ if (! $ref) {
+ @args=($args);
+ } elsif ($ref eq "ARRAY") {
+ @args=@$args;
+ } elsif ($ref eq "SCALAR") {
+ @args=($$args);
+ } else {
+ print "ERROR: Invalid arguments to ParseDateDelta.\n";
+ return "";
+ }
+ @a=@args;
+
+ # @args : a list containing all the arguments (dereferenced if appropriate)
+ # @a : a list containing all the arguments currently being examined
+ # $ref : nil, "SCALAR", or "ARRAY" depending on whether a scalar, a
+ # reference to a scalar, or a reference to an array was passed in
+ # $args : the scalar or refererence passed in
+
+ my(@colon,@delta,$delta,$dir,$colon,$sign,$val)=();
+ my($len,$tmp,$tmp2,$tmpl)=();
+ my($from,$to)=();
+ my($workweek)=$Cnf{"WorkWeekEnd"}-$Cnf{"WorkWeekBeg"}+1;
+
+ &Date_Init() if (! $Curr{"InitDone"});
+ # A sign can be a sequence of zero or more + and - signs, this
+ # allows for deltas like '+ -2 days'.
+ my($signexp)='((?:[+-]\s*)*)';
+ my($numexp)='(\d+)';
+ my($exp1)="(?: \\s* $signexp \\s* $numexp \\s*)";
+ my($yexp,$mexp,$wexp,$dexp,$hexp,$mnexp,$sexp,$i)=();
+ $yexp=$mexp=$wexp=$dexp=$hexp=$mnexp=$sexp="()()";
+ $yexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Yabb"} .")?";
+ $mexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Mabb"} .")?";
+ $wexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Wabb"} .")?";
+ $dexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Dabb"} .")?";
+ $hexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Habb"} .")?";
+ $mnexp="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"MNabb"}.")?";
+ $sexp ="(?: $exp1 ". $Lang{$Cnf{"Language"}}{"Sabb"} ."?)?";
+ my($future)=$Lang{$Cnf{"Language"}}{"Future"};
+ my($later)=$Lang{$Cnf{"Language"}}{"Later"};
+ my($past)=$Lang{$Cnf{"Language"}}{"Past"};
+
+ $delta="";
+ PARSE: while (@a) {
+ $_ = join(" ", grep {defined;} @a);
+ s/\s+$//;
+ last if ($_ eq "");
+
+ # Mode is set in DateCalc. ParseDateDelta only overrides it if the
+ # string contains a mode.
+ if ($Lang{$Cnf{"Language"}}{"Exact"} &&
+ s/$Lang{$Cnf{"Language"}}{"Exact"}//) {
+ $Curr{"Mode"}=0;
+ } elsif ($Lang{$Cnf{"Language"}}{"Approx"} &&
+ s/$Lang{$Cnf{"Language"}}{"Approx"}//) {
+ $Curr{"Mode"}=1;
+ } elsif ($Lang{$Cnf{"Language"}}{"Business"} &&
+ s/$Lang{$Cnf{"Language"}}{"Business"}//) {
+ $Curr{"Mode"}=2;
+ } elsif (! exists $Curr{"Mode"}) {
+ $Curr{"Mode"}=0;
+ }
+ $workweek=7 if ($Curr{"Mode"} != 2);
+
+ foreach $from (keys %{ $Lang{$Cnf{"Language"}}{"Repl"} }) {
+ $to=$Lang{$Cnf{"Language"}}{"Repl"}{$from};
+ s/(^|[^a-z])$from($|[^a-z])/$1$to$2/i;
+ }
+
+ # in or ago
+ #
+ # We need to make sure that $later, $future, and $past don't contain each
+ # other... Romanian pointed this out where $past is "in urma" and $future
+ # is "in". When they do, we have to take this into account.
+ # $len length of best match (greatest wins)
+ # $tmp string after best match
+ # $dir direction (prior, after) of best match
+ #
+ # $tmp2 string before/after current match
+ # $tmpl length of current match
+
+ $len=0;
+ $tmp=$_;
+ $dir=1;
+
+ $tmp2=$_;
+ if ($tmp2 =~ s/(^|[^a-z])($future)($|[^a-z])/$1 $3/i) {
+ $tmpl=length($2);
+ if ($tmpl>$len) {
+ $tmp=$tmp2;
+ $dir=1;
+ $len=$tmpl;
+ }
+ }
+
+ $tmp2=$_;
+ if ($tmp2 =~ s/(^|[^a-z])($later)($|[^a-z])/$1 $3/i) {
+ $tmpl=length($2);
+ if ($tmpl>$len) {
+ $tmp=$tmp2;
+ $dir=1;
+ $len=$tmpl;
+ }
+ }
+
+ $tmp2=$_;
+ if ($tmp2 =~ s/(^|[^a-z])($past)($|[^a-z])/$1 $3/i) {
+ $tmpl=length($2);
+ if ($tmpl>$len) {
+ $tmp=$tmp2;
+ $dir=-1;
+ $len=$tmpl;
+ }
+ }
+
+ $_ = $tmp;
+ s/\s*$//;
+
+ # the colon part of the delta
+ $colon="";
+ if (s/($signexp?$numexp?(:($signexp?$numexp)?){1,6})$//) {
+ $colon=$1;
+ s/\s+$//;
+ }
+ @colon=split(/:/,$colon);
+
+ # the non-colon part of the delta
+ $sign="+";
+ @delta=();
+ $i=6;
+ foreach $exp1 ($yexp,$mexp,$wexp,$dexp,$hexp,$mnexp,$sexp) {
+ last if ($#colon>=$i--);
+ $val=0;
+ if (s/^$exp1//ix) {
+ $val=$2 if ($2);
+ $sign=$1 if ($1);
+ }
+
+ # Collapse a sign like '+ -' into a single character like '-',
+ # by counting the occurrences of '-'.
+ #
+ $sign =~ s/\s+//g;
+ $sign =~ tr/+//d;
+ my $count = ($sign =~ tr/-//d);
+ die "bad characters in sign: $sign" if length $sign;
+ $sign = $count % 2 ? '-' : '+';
+
+ push(@delta,"$sign$val");
+ }
+ if (! /^\s*$/) {
+ pop(@a);
+ next PARSE;
+ }
+
+ # make sure that the colon part has a sign
+ for ($i=0; $i<=$#colon; $i++) {
+ $val=0;
+ if ($colon[$i] =~ /^$signexp$numexp?/) {
+ $val=$2 if ($2);
+ $sign=$1 if ($1);
+ }
+ $colon[$i] = "$sign$val";
+ }
+
+ # combine the two
+ push(@delta,@colon);
+ if ($dir<0) {
+ for ($i=0; $i<=$#delta; $i++) {
+ $delta[$i] =~ tr/-+/+-/;
+ }
+ }
+
+ # form the delta and shift off the valid part
+ $delta=join(":",@delta);
+ splice(@args,0,$#a+1);
+ @$args=@args if (defined $ref and $ref eq "ARRAY");
+ last PARSE;
+ }
+
+ $delta=&Delta_Normalize($delta,$Curr{"Mode"});
+ return $delta;
+}
+
+sub UnixDate {
+ print "DEBUG: UnixDate\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,@format)=@_;
+ local($_)=();
+ my($format,%f,$out,@out,$c,$date1,$date2,$tmp)=();
+ my($scalar)=();
+ $date=&ParseDateString($date);
+ return if (! $date);
+
+ my($y,$m,$d,$h,$mn,$s)=($f{"Y"},$f{"m"},$f{"d"},$f{"H"},$f{"M"},$f{"S"})=
+ &Date_Split($date, 1);
+ $f{"y"}=substr $f{"Y"},2;
+ &Date_Init() if (! $Curr{"InitDone"});
+
+ if (! wantarray) {
+ $format=join(" ",@format);
+ @format=($format);
+ $scalar=1;
+ }
+
+ # month, week
+ $_=$m;
+ s/^0//;
+ $f{"b"}=$f{"h"}=$Lang{$Cnf{"Language"}}{"MonL"}[$_-1];
+ $f{"B"}=$Lang{$Cnf{"Language"}}{"MonthL"}[$_-1];
+ $_=$m;
+ s/^0/ /;
+ $f{"f"}=$_;
+ $f{"U"}=&Date_WeekOfYear($m,$d,$y,7);
+ $f{"W"}=&Date_WeekOfYear($m,$d,$y,1);
+
+ # check week 52,53 and 0
+ $f{"G"}=$f{"L"}=$y;
+ if ($f{"W"}>=52 || $f{"U"}>=52) {
+ my($dd,$mm,$yy)=($d,$m,$y);
+ $dd+=7;
+ if ($dd>31) {
+ $dd-=31;
+ $mm=1;
+ $yy++;
+ if (&Date_WeekOfYear($mm,$dd,$yy,1)==2) {
+ $f{"G"}=$yy;
+ $f{"W"}=1;
+ }
+ if (&Date_WeekOfYear($mm,$dd,$yy,7)==2) {
+ $f{"L"}=$yy;
+ $f{"U"}=1;
+ }
+ }
+ }
+ if ($f{"W"}==0) {
+ my($dd,$mm,$yy)=($d,$m,$y);
+ $dd-=7;
+ $dd+=31 if ($dd<1);
+ $yy--;
+ $mm=12;
+ $f{"G"}=$yy;
+ $f{"W"}=&Date_WeekOfYear($mm,$dd,$yy,1)+1;
+ }
+ if ($f{"U"}==0) {
+ my($dd,$mm,$yy)=($d,$m,$y);
+ $dd-=7;
+ $dd+=31 if ($dd<1);
+ $yy--;
+ $mm=12;
+ $f{"L"}=$yy;
+ $f{"U"}=&Date_WeekOfYear($mm,$dd,$yy,7)+1;
+ }
+
+ $f{"U"}="0".$f{"U"} if (length $f{"U"} < 2);
+ $f{"W"}="0".$f{"W"} if (length $f{"W"} < 2);
+
+ # day
+ $f{"j"}=&Date_DayOfYear($m,$d,$y);
+ $f{"j"} = "0" . $f{"j"} while (length($f{"j"})<3);
+ $_=$d;
+ s/^0/ /;
+ $f{"e"}=$_;
+ $f{"w"}=&Date_DayOfWeek($m,$d,$y);
+ $f{"v"}=$Lang{$Cnf{"Language"}}{"WL"}[$f{"w"}-1];
+ $f{"v"}=" ".$f{"v"} if (length $f{"v"} < 2);
+ $f{"a"}=$Lang{$Cnf{"Language"}}{"WkL"}[$f{"w"}-1];
+ $f{"A"}=$Lang{$Cnf{"Language"}}{"WeekL"}[$f{"w"}-1];
+ $f{"E"}=&Date_DaySuffix($f{"e"});
+
+ # hour
+ $_=$h;
+ s/^0/ /;
+ $f{"k"}=$_;
+ $f{"i"}=$f{"k"}+1;
+ $f{"i"}=$f{"k"};
+ $f{"i"}=12 if ($f{"k"}==0);
+ $f{"i"}=$f{"k"}-12 if ($f{"k"}>12);
+ $f{"i"}=$f{"i"}-12 if ($f{"i"}>12);
+ $f{"i"}=" ".$f{"i"} if (length($f{"i"})<2);
+ $f{"I"}=$f{"i"};
+ $f{"I"}=~ s/^ /0/;
+ $f{"p"}=$Lang{$Cnf{"Language"}}{"AMstr"};
+ $f{"p"}=$Lang{$Cnf{"Language"}}{"PMstr"} if ($f{"k"}>11);
+
+ # minute, second, timezone
+ $f{"o"}=&Date_SecsSince1970($m,$d,$y,$h,$mn,$s);
+ $f{"s"}=&Date_SecsSince1970GMT($m,$d,$y,$h,$mn,$s);
+ $f{"Z"}=($Cnf{"ConvTZ"} eq "IGNORE" or $Cnf{"ConvTZ"} eq "") ?
+ $Cnf{"TZ"} : $Cnf{"ConvTZ"};
+ $f{"z"}=($f{"Z"}=~/^[+-]\d{4}/) ? $f{"Z"} : ($Zone{"n2o"}{lc $f{"Z"}} || "");
+
+ # date, time
+ $f{"c"}=qq|$f{"a"} $f{"b"} $f{"e"} $h:$mn:$s $y|;
+ $f{"C"}=$f{"u"}=
+ qq|$f{"a"} $f{"b"} $f{"e"} $h:$mn:$s $f{"z"} $y|;
+ $f{"g"}=qq|$f{"a"}, $d $f{"b"} $y $h:$mn:$s $f{"z"}|;
+ $f{"D"}=$f{"x"}=qq|$m/$d/$f{"y"}|;
+ $f{"r"}=qq|$f{"I"}:$mn:$s $f{"p"}|;
+ $f{"R"}=qq|$h:$mn|;
+ $f{"T"}=$f{"X"}=qq|$h:$mn:$s|;
+ $f{"V"}=qq|$m$d$h$mn$f{"y"}|;
+ $f{"Q"}="$y$m$d";
+ $f{"q"}=qq|$y$m$d$h$mn$s|;
+ $f{"P"}=qq|$y$m$d$h:$mn:$s|;
+ $f{"F"}=qq|$f{"A"}, $f{"B"} $f{"e"}, $f{"Y"}|;
+ if ($f{"W"}==0) {
+ $y--;
+ $tmp=&Date_WeekOfYear(12,31,$y,1);
+ $tmp="0$tmp" if (length($tmp) < 2);
+ $f{"J"}=qq|$y-W$tmp-$f{"w"}|;
+ } else {
+ $f{"J"}=qq|$f{"G"}-W$f{"W"}-$f{"w"}|;
+ }
+ $f{"K"}=qq|$y-$f{"j"}|;
+ # %l is a special case. Since it requires the use of the calculator
+ # which requires this routine, an infinite recursion results. To get
+ # around this, %l is NOT determined every time this is called so the
+ # recursion breaks.
+
+ # other formats
+ $f{"n"}="\n";
+ $f{"t"}="\t";
+ $f{"%"}="%";
+ $f{"+"}="+";
+
+ foreach $format (@format) {
+ $format=reverse($format);
+ $out="";
+ while ($format ne "") {
+ $c=chop($format);
+ if ($c eq "%") {
+ $c=chop($format);
+ if ($c eq "l") {
+ &Date_Init();
+ $date1=&DateCalc_DateDelta($Curr{"Now"},"-0:6:0:0:0:0:0");
+ $date2=&DateCalc_DateDelta($Curr{"Now"},"+0:6:0:0:0:0:0");
+ if (&Date_Cmp($date,$date1)>=0 && &Date_Cmp($date,$date2)<=0) {
+ $f{"l"}=qq|$f{"b"} $f{"e"} $h:$mn|;
+ } else {
+ $f{"l"}=qq|$f{"b"} $f{"e"} $f{"Y"}|;
+ }
+ $out .= $f{"$c"};
+ } elsif (exists $f{"$c"}) {
+ $out .= $f{"$c"};
+ } else {
+ $out .= $c;
+ }
+ } else {
+ $out .= $c;
+ }
+ }
+ push(@out,$out);
+ }
+ if ($scalar) {
+ return $out[0];
+ } else {
+ return (@out);
+ }
+}
+
+# Can't be in "use integer" because we're doing decimal arithmatic
+no integer;
+sub Delta_Format {
+ print "DEBUG: Delta_Format\n" if ($Curr{"Debug"} =~ /trace/);
+ my($delta,$dec,@format)=@_;
+ $delta=&ParseDateDelta($delta);
+ return "" if (! $delta);
+ my(@out,%f,$out,$c1,$c2,$scalar,$format)=();
+ local($_)=$delta;
+ my($y,$M,$w,$d,$h,$m,$s)=&Delta_Split($delta);
+ # Get rid of positive signs.
+ ($y,$M,$w,$d,$h,$m,$s)=map { 1*$_; }($y,$M,$w,$d,$h,$m,$s);
+
+ if (defined $dec && $dec>0) {
+ $dec="%." . ($dec*1) . "f";
+ } else {
+ $dec="%f";
+ }
+
+ if (! wantarray) {
+ $format=join(" ",@format);
+ @format=($format);
+ $scalar=1;
+ }
+
+ # Length of each unit in seconds
+ my($sl,$ml,$hl,$dl,$wl,$yl)=();
+ $sl = 1;
+ $ml = $sl*60;
+ $hl = $ml*60;
+ $dl = $hl*24;
+ $wl = $dl*7;
+ $yl = $dl*365.25;
+
+ # The decimal amount of each unit contained in all smaller units
+ my($yd,$Md,$sd,$md,$hd,$dd,$wd)=();
+ if ($M) {
+ $yd = $M/12;
+ $Md = 0;
+ } else {
+ $yd = ($w*$wl + $d*$dl + $h*$hl + $m*$ml + $s*$sl)/$yl;
+ $Md = 0;
+ }
+
+ $wd = ($d*$dl + $h*$hl + $m*$ml + $s*$sl)/$wl;
+ $dd = ($h*$hl + $m*$ml + $s*$sl)/$dl;
+ $hd = ($m*$ml + $s*$sl)/$hl;
+ $md = ($s*$sl)/$ml;
+ $sd = 0;
+
+ # The amount of each unit contained in higher units.
+ my($yh,$Mh,$sh,$mh,$hh,$dh,$wh)=();
+ $yh = 0;
+
+ if ($M) {
+ $Mh = ($yh+$y)*12;
+ $wh = 0;
+ $dh = ($wh+$w)*7;
+ } else {
+ $Mh = 0;
+ $wh = ($yh+$y)*365.25/7;
+ $dh = ($yh+$y)*365.25 + $w*7;
+ }
+
+ $hh = ($dh+$d)*24;
+ $mh = ($hh+$h)*60;
+ $sh = ($mh+$m)*60;
+
+ # Set up the formats
+
+ $f{"yv"} = $y;
+ $f{"Mv"} = $M;
+ $f{"wv"} = $w;
+ $f{"dv"} = $d;
+ $f{"hv"} = $h;
+ $f{"mv"} = $m;
+ $f{"sv"} = $s;
+
+ $f{"yh"} = $y+$yh;
+ $f{"Mh"} = $M+$Mh;
+ $f{"wh"} = $w+$wh;
+ $f{"dh"} = $d+$dh;
+ $f{"hh"} = $h+$hh;
+ $f{"mh"} = $m+$mh;
+ $f{"sh"} = $s+$sh;
+
+ $f{"yd"} = sprintf($dec,$y+$yd);
+ $f{"Md"} = sprintf($dec,$M+$Md);
+ $f{"wd"} = sprintf($dec,$w+$wd);
+ $f{"dd"} = sprintf($dec,$d+$dd);
+ $f{"hd"} = sprintf($dec,$h+$hd);
+ $f{"md"} = sprintf($dec,$m+$md);
+ $f{"sd"} = sprintf($dec,$s+$sd);
+
+ $f{"yt"} = sprintf($dec,$yh+$y+$yd);
+ $f{"Mt"} = sprintf($dec,$Mh+$M+$Md);
+ $f{"wt"} = sprintf($dec,$wh+$w+$wd);
+ $f{"dt"} = sprintf($dec,$dh+$d+$dd);
+ $f{"ht"} = sprintf($dec,$hh+$h+$hd);
+ $f{"mt"} = sprintf($dec,$mh+$m+$md);
+ $f{"st"} = sprintf($dec,$sh+$s+$sd);
+
+ $f{"%"} = "%";
+
+ foreach $format (@format) {
+ $format=reverse($format);
+ $out="";
+ PARSE: while ($format) {
+ $c1=chop($format);
+ if ($c1 eq "%") {
+ $c1=chop($format);
+ if (exists($f{$c1})) {
+ $out .= $f{$c1};
+ next PARSE;
+ }
+ $c2=chop($format);
+ if (exists($f{"$c1$c2"})) {
+ $out .= $f{"$c1$c2"};
+ next PARSE;
+ }
+ $out .= $c1;
+ $format .= $c2;
+ } else {
+ $out .= $c1;
+ }
+ }
+ push(@out,$out);
+ }
+ if ($scalar) {
+ return $out[0];
+ } else {
+ return (@out);
+ }
+}
+use integer;
+
+sub ParseRecur {
+ print "DEBUG: ParseRecur\n" if ($Curr{"Debug"} =~ /trace/);
+ &Date_Init() if (! $Curr{"InitDone"});
+
+ my($recur,$dateb,$date0,$date1,$flag)=@_;
+ local($_)=$recur;
+
+ my($recur_0,$recur_1,@recur0,@recur1)=();
+ my(@tmp,$tmp,$each,$num,$y,$m,$d,$w,$h,$mn,$s,$delta,$y0,$y1,$yb)=();
+ my($yy,$n,$dd,@d,@tmp2,$date,@date,@w,@tmp3,@m,@y,$tmp2,$d2,@flags)=();
+
+ # $date0, $date1, $dateb, $flag : passed in (these are always the final say
+ # in determining whether a date matches a
+ # recurrence IF they are present.
+ # $date_b, $date_0, $date_1 : if a value can be determined from the
+ # $flag_t recurrence, they are stored here.
+ #
+ # If values can be determined from the recurrence AND are passed in, the
+ # following are used:
+ # max($date0,$date_0) i.e. the later of the two dates
+ # min($date1,$date_1) i.e. the earlier of the two dates
+ #
+ # The base date that is used is the first one defined from
+ # $dateb $date_b
+ # The base date is only used if necessary (as determined by the recur).
+ # For example, "every other friday" requires a base date, but "2nd
+ # friday of every month" doesn't.
+
+ my($date_b,$date_0,$date_1,$flag_t);
+
+ #
+ # Check the arguments passed in.
+ #
+
+ $date0="" if (! defined $date0);
+ $date1="" if (! defined $date1);
+ $dateb="" if (! defined $dateb);
+ $flag ="" if (! defined $flag);
+
+ if ($dateb) {
+ $dateb=&ParseDateString($dateb);
+ return "" if (! $dateb);
+ }
+ if ($date0) {
+ $date0=&ParseDateString($date0);
+ return "" if (! $date0);
+ }
+ if ($date1) {
+ $date1=&ParseDateString($date1);
+ return "" if (! $date1);
+ }
+
+ #
+ # Parse the recur. $date_b, $date_0, and $date_e are values obtained
+ # from the recur.
+ #
+
+ @tmp=&Recur_Split($_);
+
+ if (@tmp) {
+ ($recur_0,$recur_1,$flag_t,$date_b,$date_0,$date_1)=@tmp;
+ $recur_0 = "" if (! defined $recur_0);
+ $recur_1 = "" if (! defined $recur_1);
+ $flag_t = "" if (! defined $flag_t);
+ $date_b = "" if (! defined $date_b);
+ $date_0 = "" if (! defined $date_0);
+ $date_1 = "" if (! defined $date_1);
+
+ @recur0 = split(/:/,$recur_0);
+ @recur1 = split(/:/,$recur_1);
+ return "" if ($#recur0 + $#recur1 + 2 != 7);
+
+ if ($date_b) {
+ $date_b=&ParseDateString($date_b);
+ return "" if (! $date_b);
+ }
+ if ($date_0) {
+ $date_0=&ParseDateString($date_0);
+ return "" if (! $date_0);
+ }
+ if ($date_1) {
+ $date_1=&ParseDateString($date_1);
+ return "" if (! $date_1);
+ }
+
+ } else {
+
+ my($mmm)='\s*'.$Lang{$Cnf{"Language"}}{"Month"}; # \s*(jan|january|...)
+ my(%mmm)=%{ $Lang{$Cnf{"Language"}}{"MonthH"} }; # { jan=>1, ... }
+ my($wkexp)='\s*'.$Lang{$Cnf{"Language"}}{"Week"}; # \s*(mon|monday|...)
+ my(%week)=%{ $Lang{$Cnf{"Language"}}{"WeekH"} }; # { monday=>1, ... }
+ my($day)='\s*'.$Lang{$Cnf{"Language"}}{"Dabb"}; # \s*(?:d|day|days)
+ my($month)='\s*'.$Lang{$Cnf{"Language"}}{"Mabb"}; # \s*(?:mon|month|months)
+ my($week)='\s*'.$Lang{$Cnf{"Language"}}{"Wabb"}; # \s*(?:w|wk|week|weeks)
+ my($daysexp)=$Lang{$Cnf{"Language"}}{"DoM"}; # (1st|first|...31st)
+ my(%dayshash)=%{ $Lang{$Cnf{"Language"}}{"DoMH"} };
+ # { 1st=>1,first=>1,...}
+ my($of)='\s*'.$Lang{$Cnf{"Language"}}{"Of"}; # \s*(?:in|of)
+ my($lastexp)=$Lang{$Cnf{"Language"}}{"Last"}; # (?:last)
+ my($each)=$Lang{$Cnf{"Language"}}{"Each"}; # (?:each|every)
+
+ my($D)='\s*(\d+)';
+ my($Y)='\s*(\d{4}|\d{2})';
+
+ # Change 1st to 1
+ if (/(^|[^a-z])$daysexp($|[^a-z])/i) {
+ $tmp=lc($2);
+ $tmp=$dayshash{"$tmp"};
+ s/(^|[^a-z])$daysexp($|[^a-z])/$1 $tmp $3/i;
+ }
+ s/\s*$//;
+
+ # Get rid of "each"
+ if (/(^|[^a-z])$each($|[^a-z])/i) {
+ s/(^|[^a-z])$each($|[^a-z])/$1 $2/i;
+ $each=1;
+ } else {
+ $each=0;
+ }
+
+ if ($each) {
+
+ if (/^$D?$day(?:$of$mmm?$Y)?$/i ||
+ /^$D?$day(?:$of$mmm())?$/i) {
+ # every [2nd] day in [june] 1997
+ # every [2nd] day [in june]
+ ($num,$m,$y)=($1,$2,$3);
+ $num=1 if (! defined $num);
+ $m="" if (! defined $m);
+ $y="" if (! defined $y);
+
+ $y=$Curr{"Y"} if (! $y);
+ if ($m) {
+ $m=$mmm{lc($m)};
+ $date_0=&Date_Join($y,$m,1,0,0,0);
+ $date_1=&DateCalc_DateDelta($date_0,"+0:1:0:0:0:0:0",0);
+ } else {
+ $date_0=&Date_Join($y, 1,1,0,0,0);
+ $date_1=&Date_Join($y+1,1,1,0,0,0);
+ }
+ $date_b=&DateCalc($date_0,"-0:0:0:1:0:0:0",0);
+ @recur0=(0,0,0,$num,0,0,0);
+ @recur1=();
+
+ } elsif (/^$D$day?$of$month(?:$of?$Y)?$/) {
+ # 2nd [day] of every month [in 1997]
+ ($num,$y)=($1,$2);
+ $y=$Curr{"Y"} if (! $y);
+
+ $date_0=&Date_Join($y, 1,1,0,0,0);
+ $date_1=&Date_Join($y+1,1,1,0,0,0);
+ $date_b=$date_0;
+
+ @recur0=(0,1,0);
+ @recur1=($num,0,0,0);
+
+ } elsif (/^$D$wkexp$of$month(?:$of?$Y)?$/ ||
+ /^($lastexp)$wkexp$of$month(?:$of?$Y)?$/) {
+ # 2nd tuesday of every month [in 1997]
+ # last tuesday of every month [in 1997]
+ ($num,$d,$y)=($1,$2,$3);
+ $y=$Curr{"Y"} if (! $y);
+ $d=$week{lc($d)};
+ $num=-1 if ($num !~ /^$D$/);
+
+ $date_0=&Date_Join($y,1,1,0,0,0);
+ $date_1=&Date_Join($y+1,1,1,0,0,0);
+ $date_b=$date_0;
+
+ @recur0=(0,1);
+ @recur1=($num,$d,0,0,0);
+
+ } elsif (/^$D?$wkexp(?:$of$mmm?$Y)?$/i ||
+ /^$D?$wkexp(?:$of$mmm())?$/i) {
+ # every tuesday in june 1997
+ # every 2nd tuesday in june 1997
+ ($num,$d,$m,$y)=($1,$2,$3,$4);
+ $y=$Curr{"Y"} if (! $y);
+ $num=1 if (! defined $num);
+ $m="" if (! defined $m);
+ $d=$week{lc($d)};
+
+ if ($m) {
+ $m=$mmm{lc($m)};
+ $date_0=&Date_Join($y,$m,1,0,0,0);
+ $date_1=&DateCalc_DateDelta($date_0,"+0:1:0:0:0:0:0",0);
+ } else {
+ $date_0=&Date_Join($y,1,1,0,0,0);
+ $date_1=&Date_Join($y+1,1,1,0,0,0);
+ }
+ $date_b=&DateCalc($date_0,"-0:0:0:1:0:0:0",0);
+
+ @recur0=(0,0,$num);
+ @recur1=($d,0,0,0);
+
+ } else {
+ return "";
+ }
+
+ $date_0="" if ($date0);
+ $date_1="" if ($date1);
+ } else {
+ return "";
+ }
+ }
+
+ #
+ # Override with any values passed in
+ #
+
+ if ($date0 && $date_0) {
+ $date0=( &Date_Cmp($date0,$date_0) > 1 ? $date0 : $date_0);
+ } elsif ($date_0) {
+ $date0 = $date_0;
+ }
+
+ if ($date1 && $date_1) {
+ $date1=( &Date_Cmp($date1,$date_1) > 1 ? $date_1 : $date1);
+ } elsif ($date_1) {
+ $date1 = $date_1;
+ }
+
+ $dateb=$date_b if (! $dateb);
+
+ if ($flag =~ s/^\+//) {
+ if ($flag_t) {
+ $flag="$flag_t,$flag";
+ }
+ }
+ $flag =$flag_t if (! $flag && $flag_t);
+
+ if (! wantarray) {
+ $tmp = join(":",@recur0);
+ $tmp .= "*" . join(":",@recur1) if (@recur1);
+ $tmp .= "*$flag*$dateb*$date0*$date1";
+ return $tmp;
+ }
+ if (@recur0) {
+ return () if (! $date0 || ! $date1); # dateb is NOT required in all case
+ }
+
+ #
+ # Some flags affect parsing.
+ #
+
+ @flags = split(/,/,$flag);
+ my($MDn) = 0;
+ my($MWn) = 7;
+ my($f);
+ foreach $f (@flags) {
+ if ($f =~ /^MW([1-7])$/i) {
+ $MWn=$1;
+ $MDn=0;
+
+ } elsif ($f =~ /^MD([1-7])$/i) {
+ $MDn=$1;
+ $MWn=0;
+
+ } elsif ($f =~ /^EASTER$/i) {
+ ($y,$m,$w,$d,$h,$mn,$s)=(@recur0,@recur1);
+ # We want something that will return Jan 1 for the given years.
+ if ($#recur0==-1) {
+ @recur1=($y,1,0,1,$h,$mn,$s);
+ } elsif ($#recur0<=3) {
+ @recur0=($y,0,0,0);
+ @recur1=($h,$mn,$s);
+ } elsif ($#recur0==4) {
+ @recur0=($y,0,0,0,0);
+ @recur1=($mn,$s);
+ } elsif ($#recur0==5) {
+ @recur0=($y,0,0,0,0,0);
+ @recur1=($s);
+ } else {
+ @recur0=($y,0,0,0,0,0,0);
+ }
+ }
+ }
+
+ #
+ # Determine the dates referenced by the recur. Also, fix the base date
+ # as necessary for the recurrences which require it.
+ #
+
+ ($y,$m,$w,$d,$h,$mn,$s)=(@recur0,@recur1);
+ @y=@m=@w=@d=();
+ my(@time)=($h,$mn,$s);
+
+ RECUR: while (1) {
+
+ if ($#recur0==-1) {
+ # * Y-M-W-D-H-MN-S
+ if ($y eq "0") {
+ push(@recur0,0);
+ shift(@recur1);
+
+ } else {
+ @y=&ReturnList($y);
+ foreach $y (@y) {
+ $y=&Date_FixYear($y) if (length($y)==2);
+ return () if (length($y)!=4 || ! &IsInt($y));
+ }
+ @y=sort { $a<=>$b } @y;
+
+ $date0=&ParseDate("0000-01-01") if (! $date0);
+ $date1=&ParseDate("9999-12-31 23:59:59") if (! $date1);
+
+ if ($m eq "0" and $w eq "0") {
+ # * Y-0-0-0-H-MN-S
+ # * Y-0-0-DOY-H-MN-S
+ if ($d eq "0") {
+ @d=(1);
+ } else {
+ @d=&ReturnList($d);
+ return () if (! @d);
+ foreach $d (@d) {
+ return () if (! &IsInt($d,1,366));
+ }
+ @d=sort { $a<=>$b } (@d);
+ }
+
+ @date=();
+ foreach $yy (@y) {
+ foreach $d (@d) {
+ ($y,$m,$dd)=&Date_NthDayOfYear($yy,$d);
+ push(@date, &Date_Join($y,$m,$dd,0,0,0));
+ }
+ }
+ last RECUR;
+
+ } elsif ($w eq "0") {
+ # * Y-M-0-0-H-MN-S
+ # * Y-M-0-DOM-H-MN-S
+
+ @m=&ReturnList($m);
+ return () if (! @m);
+ foreach $m (@m) {
+ return () if (! &IsInt($m,1,12));
+ }
+ @m=sort { $a<=>$b } (@m);
+
+ if ($d eq "0") {
+ @d=(1);
+ } else {
+ @d=&ReturnList($d);
+ return () if (! @d);
+ foreach $d (@d) {
+ return () if (! &IsInt($d,1,31));
+ }
+ @d=sort { $a<=>$b } (@d);
+ }
+
+ @date=();
+ foreach $y (@y) {
+ foreach $m (@m) {
+ foreach $d (@d) {
+ $date=&Date_Join($y,$m,$d,0,0,0);
+ push(@date,$date) if ($d<29 || &Date_Split($date));
+ }
+ }
+ }
+ last RECUR;
+
+ } elsif ($m eq "0") {
+ # * Y-0-WOY-DOW-H-MN-S
+ # * Y-0-WOY-0-H-MN-S
+ @w=&ReturnList($w);
+ return () if (! @w);
+ foreach $w (@w) {
+ return () if (! &IsInt($w,1,53));
+ }
+
+ if ($d eq "0") {
+ @d=($Cnf{"FirstDay"});
+ } else {
+ @d=&ReturnList($d);
+ return () if (! @d);
+ foreach $d (@d) {
+ return () if (! &IsInt($d,1,7));
+ }
+ @d=sort { $a<=>$b } (@d);
+ }
+
+ @date=();
+ foreach $y (@y) {
+ foreach $w (@w) {
+ $w="0$w" if (length($w)==1);
+ foreach $d (@d) {
+ $date=&ParseDateString("$y-W$w-$d");
+ push(@date,$date);
+ }
+ }
+ }
+ last RECUR;
+
+ } else {
+ # * Y-M-WOM-DOW-H-MN-S
+ # * Y-M-WOM-0-H-MN-S
+
+ @m=&ReturnList($m);
+ return () if (! @m);
+ foreach $m (@m) {
+ return () if (! &IsInt($m,1,12));
+ }
+ @m=sort { $a<=>$b } (@m);
+
+ @w=&ReturnList($w);
+
+ if ($d eq "0") {
+ @d=();
+ } else {
+ @d=&ReturnList($d);
+ }
+
+ @date=&Date_Recur_WoM(\@y,\@m,\@w,\@d,$MWn,$MDn);
+ last RECUR;
+ }
+ }
+ }
+
+ if ($#recur0==0) {
+ # Y * M-W-D-H-MN-S
+ $n=$y;
+ $n=1 if ($n==0);
+
+ @m=&ReturnList($m);
+ return () if (! @m);
+ foreach $m (@m) {
+ return () if (! &IsInt($m,1,12));
+ }
+ @m=sort { $a<=>$b } (@m);
+
+ if ($m eq "0") {
+ # Y * 0-W-D-H-MN-S (equiv to Y-0 * W-D-H-MN-S)
+ push(@recur0,0);
+ shift(@recur1);
+
+ } elsif ($w eq "0") {
+ # Y * M-0-DOM-H-MN-S
+ return () if (! $dateb);
+ $d=1 if ($d eq "0");
+
+ @d=&ReturnList($d);
+ return () if (! @d);
+ foreach $d (@d) {
+ return () if (! &IsInt($d,1,31));
+ }
+ @d=sort { $a<=>$b } (@d);
+
+ # We need to find years that are a multiple of $n from $y(base)
+ ($y0)=( &Date_Split($date0, 1) )[0];
+ ($y1)=( &Date_Split($date1, 1) )[0];
+ ($yb)=( &Date_Split($dateb, 1) )[0];
+ @date=();
+ for ($yy=$y0; $yy<=$y1; $yy++) {
+ if (($yy-$yb)%$n == 0) {
+ foreach $m (@m) {
+ foreach $d (@d) {
+ $date=&Date_Join($yy,$m,$d,0,0,0);
+ push(@date,$date) if ($d<29 || &Date_Split($date));
+ }
+ }
+ }
+ }
+ last RECUR;
+
+ } else {
+ # Y * M-WOM-DOW-H-MN-S
+ # Y * M-WOM-0-H-MN-S
+ return () if (! $dateb);
+ @m=&ReturnList($m);
+ @w=&ReturnList($w);
+ if ($d eq "0") {
+ @d=();
+ } else {
+ @d=&ReturnList($d);
+ }
+
+ ($y0)=( &Date_Split($date0, 1) )[0];
+ ($y1)=( &Date_Split($date1, 1) )[0];
+ ($yb)=( &Date_Split($dateb, 1) )[0];
+ @y=();
+ for ($yy=$y0; $yy<=$y1; $yy++) {
+ if (($yy-$yb)%$n == 0) {
+ push(@y,$yy);
+ }
+ }
+
+ @date=&Date_Recur_WoM(\@y,\@m,\@w,\@d,$MWn,$MDn);
+ last RECUR;
+ }
+ }
+
+ if ($#recur0==1) {
+ # Y-M * W-D-H-MN-S
+
+ if ($w eq "0") {
+ # Y-M * 0-D-H-MN-S (equiv to Y-M-0 * D-H-MN-S)
+ push(@recur0,0);
+ shift(@recur1);
+
+ } elsif ($m==0) {
+ # Y-0 * WOY-0-H-MN-S
+ # Y-0 * WOY-DOW-H-MN-S
+ return () if (! $dateb);
+ $n=$y;
+ $n=1 if ($n==0);
+
+ @w=&ReturnList($w);
+ return () if (! @w);
+ foreach $w (@w) {
+ return () if (! &IsInt($w,1,53));
+ }
+
+ if ($d eq "0") {
+ @d=($Cnf{"FirstDay"});
+ } else {
+ @d=&ReturnList($d);
+ return () if (! @d);
+ foreach $d (@d) {
+ return () if (! &IsInt($d,1,7));
+ }
+ @d=sort { $a<=>$b } (@d);
+ }
+
+ # We need to find years that are a multiple of $n from $y(base)
+ ($y0)=( &Date_Split($date0, 1) )[0];
+ ($y1)=( &Date_Split($date1, 1) )[0];
+ ($yb)=( &Date_Split($dateb, 1) )[0];
+ @date=();
+ for ($yy=$y0; $yy<=$y1; $yy++) {
+ if (($yy-$yb)%$n == 0) {
+ foreach $w (@w) {
+ $w="0$w" if (length($w)==1);
+ foreach $tmp (@d) {
+ $date=&ParseDateString("$yy-W$w-$tmp");
+ push(@date,$date);
+ }
+ }
+ }
+ }
+ last RECUR;
+
+ } else {
+ # Y-M * WOM-0-H-MN-S
+ # Y-M * WOM-DOW-H-MN-S
+ return () if (! $dateb);
+ @tmp=(@recur0);
+ push(@tmp,0) while ($#tmp<6);
+ $delta=join(":",@tmp);
+ @tmp=&Date_Recur($date0,$date1,$dateb,$delta);
+
+ @w=&ReturnList($w);
+ @m=();
+ if ($d eq "0") {
+ @d=();
+ } else {
+ @d=&ReturnList($d);
+ }
+
+ @date=&Date_Recur_WoM(\@tmp,\@m,\@w,\@d,$MWn,$MDn);
+ last RECUR;
+ }
+ }
+
+ if ($#recur0==2) {
+ # Y-M-W * D-H-MN-S
+
+ if ($d eq "0") {
+ # Y-M-W * 0-H-MN-S
+ return () if (! $dateb);
+ $y=1 if ($y==0 && $m==0 && $w==0);
+ $delta="$y:$m:$w:0:0:0:0";
+ @date=&Date_Recur($date0,$date1,$dateb,$delta);
+ last RECUR;
+
+ } elsif ($m==0 && $w==0) {
+ # Y-0-0 * DOY-H-MN-S
+ $y=1 if ($y==0);
+ $n=$y;
+ return () if (! $dateb && $y!=1);
+
+ @d=&ReturnList($d);
+ return () if (! @d);
+ foreach $d (@d) {
+ return () if (! &IsInt($d,1,366));
+ }
+ @d=sort { $a<=>$b } (@d);
+
+ # We need to find years that are a multiple of $n from $y(base)
+ ($y0)=( &Date_Split($date0, 1) )[0];
+ ($y1)=( &Date_Split($date1, 1) )[0];
+ ($yb)=( &Date_Split($dateb, 1) )[0];
+ @date=();
+ for ($yy=$y0; $yy<=$y1; $yy++) {
+ if (($yy-$yb)%$n == 0) {
+ foreach $d (@d) {
+ ($y,$m,$dd)=&Date_NthDayOfYear($yy,$d);
+ push(@date, &Date_Join($y,$m,$dd,0,0,0));
+ }
+ }
+ }
+ last RECUR;
+
+ } elsif ($w>0) {
+ # Y-M-W * DOW-H-MN-S
+ return () if (! $dateb);
+ @tmp=(@recur0);
+ push(@tmp,0) while ($#tmp<6);
+ $delta=join(":",@tmp);
+
+ @d=&ReturnList($d);
+ return () if (! @d);
+ foreach $d (@d) {
+ return () if (! &IsInt($d,1,7));
+ }
+
+ # Find out what DofW the basedate is.
+ @tmp2=&Date_Split($dateb, 1);
+ $tmp=&Date_DayOfWeek($tmp2[1],$tmp2[2],$tmp2[0]);
+
+ @date=();
+ foreach $d (@d) {
+ $date_b=$dateb;
+ # Move basedate to DOW
+ if ($d != $tmp) {
+ if (($tmp>=$Cnf{"FirstDay"} && $d<$Cnf{"FirstDay"}) ||
+ ($tmp>=$Cnf{"FirstDay"} && $d>$tmp) ||
+ ($tmp<$d && $d<$Cnf{"FirstDay"})) {
+ $date_b=&Date_GetNext($date_b,$d);
+ } else {
+ $date_b=&Date_GetPrev($date_b,$d);
+ }
+ }
+ push(@date,&Date_Recur($date0,$date1,$date_b,$delta));
+ }
+ @date=sort(@date);
+ last RECUR;
+
+ } elsif ($m>0) {
+ # Y-M-0 * DOM-H-MN-S
+ return () if (! $dateb);
+ @tmp=(@recur0);
+ push(@tmp,0) while ($#tmp<6);
+ $delta=join(":",@tmp);
+
+ @d=&ReturnList($d);
+ return () if (! @d);
+ foreach $d (@d) {
+ return () if (! &IsInt($d,-31,31) || $d==0);
+ }
+ @d=sort { $a<=>$b } (@d);
+
+ @tmp2=&Date_Recur($date0,$date1,$dateb,$delta);
+ @date=();
+ foreach $date (@tmp2) {
+ ($y,$m)=( &Date_Split($date, 1) )[0..1];
+ $tmp2=&Date_DaysInMonth($m,$y);
+ foreach $d (@d) {
+ $d2=$d;
+ $d2=$tmp2+1+$d if ($d<0);
+ push(@date,&Date_Join($y,$m,$d2,0,0,0)) if ($d2<=$tmp2);
+ }
+ }
+ @date=sort (@date);
+ last RECUR;
+
+ } else {
+ return ();
+ }
+ }
+
+ if ($#recur0>2) {
+ # Y-M-W-D * H-MN-S
+ # Y-M-W-D-H * MN-S
+ # Y-M-W-D-H-MN * S
+ # Y-M-W-D-H-S
+ return () if (! $dateb);
+ @tmp=(@recur0);
+ push(@tmp,0) while ($#tmp<6);
+ $delta=join(":",@tmp);
+ return () if ($delta !~ /[1-9]/); # return if "0:0:0:0:0:0:0"
+ @date=&Date_Recur($date0,$date1,$dateb,$delta);
+ if (@recur1) {
+ unshift(@recur1,-1) while ($#recur1<2);
+ @time=@recur1;
+ } else {
+ shift(@date);
+ pop(@date);
+ @time=();
+ }
+ }
+
+ last RECUR;
+ }
+ @date=&Date_RecurSetTime($date0,$date1,\@date,@time) if (@time);
+
+ #
+ # We've got a list of dates. Operate on them with the flags.
+ #
+
+ my($sign,$forw,$today,$df,$db,$work,$i);
+ if (@flags) {
+ FLAG: foreach $f (@flags) {
+ $f = uc($f);
+
+ if ($f =~ /^(P|N)(D|T)([1-7])$/) {
+ @tmp=($1,$2,$3);
+ $forw =($tmp[0] eq "P" ? 0 : 1);
+ $today=($tmp[1] eq "D" ? 0 : 1);
+ $d=$tmp[2];
+ @tmp=();
+ foreach $date (@date) {
+ if ($forw) {
+ push(@tmp, &Date_GetNext($date,$d,$today));
+ } else {
+ push(@tmp, &Date_GetPrev($date,$d,$today));
+ }
+ }
+ @date=@tmp;
+ next FLAG;
+ }
+
+ # We want to go forward exact amounts of time instead of
+ # business mode calculations so that we don't change the time
+ # (which may have been set in the recur).
+ if ($f =~ /^(F|B)(D|W)(\d+)$/) {
+ @tmp=($1,$2,$3);
+ $sign="+";
+ $sign="-" if ($tmp[0] eq "B");
+ $work=0;
+ $work=1 if ($tmp[1] eq "W");
+ $n=$tmp[2];
+ @tmp=();
+ foreach $date (@date) {
+ for ($i=1; $i<=$n; $i++) {
+ while (1) {
+ $date=&DateCalc($date,"${sign}0:0:0:1:0:0:0");
+ last if (! $work || &Date_IsWorkDay($date,0));
+ }
+ }
+ push(@tmp,$date);
+ }
+ @date=@tmp;
+ next FLAG;
+ }
+
+ if ($f =~ /^CW(N|P|D)$/ || $f =~ /^(N|P|D)W(D)$/) {
+ $tmp=$1;
+ my $noalt = $2 ? 1 : 0;
+ if ($tmp eq "N" || ($tmp eq "D" && $Cnf{"TomorrowFirst"})) {
+ $forw=1;
+ } else {
+ $forw=0;
+ }
+
+ @tmp=();
+ DATE: foreach $date (@date) {
+ $df=$db=$date;
+ if (&Date_IsWorkDay($date)) {
+ push(@tmp,$date);
+ next DATE;
+ }
+ while (1) {
+ if ($forw) {
+ $d=$df=&DateCalc($df,"+0:0:0:1:0:0:0");
+ } else {
+ $d=$db=&DateCalc($db,"-0:0:0:1:0:0:0");
+ }
+ if (&Date_IsWorkDay($d)) {
+ push(@tmp,$d);
+ next DATE;
+ }
+ $forw=1-$forw if (! $noalt);
+ }
+ }
+ @date=@tmp;
+ next FLAG;
+ }
+
+ if ($f eq "EASTER") {
+ @tmp=();
+ foreach $date (@date) {
+ ($y,$m,$d,$h,$mn,$s)=&Date_Split($date, 1);
+ ($m,$d)=&Date_Easter($y);
+ $date=&Date_Join($y,$m,$d,$h,$mn,$s);
+ next if (&Date_Cmp($date,$date0)<0 ||
+ &Date_Cmp($date,$date1)>0);
+ push(@tmp,$date);
+ }
+ @date=@tmp;
+ }
+ }
+ @date = sort(@date);
+ }
+ @date;
+}
+
+sub Date_GetPrev {
+ print "DEBUG: Date_GetPrev\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,$dow,$today,$hr,$min,$sec)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ my($y,$m,$d,$h,$mn,$s,$err,$curr_dow,%dow,$num,$delta,$th,$tm,$ts,
+ $adjust,$curr)=();
+ $hr="00" if (defined $hr && $hr eq "0");
+ $min="00" if (defined $min && $min eq "0");
+ $sec="00" if (defined $sec && $sec eq "0");
+
+ if (! &Date_Split($date)) {
+ $date=&ParseDateString($date);
+ return "" if (! $date);
+ }
+ $curr=$date;
+ ($y,$m,$d)=( &Date_Split($date, 1) )[0..2];
+
+ if ($dow) {
+ $curr_dow=&Date_DayOfWeek($m,$d,$y);
+ %dow=%{ $Lang{$Cnf{"Language"}}{"WeekH"} };
+ if (&IsInt($dow)) {
+ return "" if ($dow<1 || $dow>7);
+ } else {
+ return "" if (! exists $dow{lc($dow)});
+ $dow=$dow{lc($dow)};
+ }
+ if ($dow == $curr_dow) {
+ $date=&DateCalc_DateDelta($date,"-0:0:1:0:0:0:0",\$err,0) if (! $today);
+ $adjust=1 if ($today==2);
+ } else {
+ $dow -= 7 if ($dow>$curr_dow); # make sure previous day is less
+ $num = $curr_dow - $dow;
+ $date=&DateCalc_DateDelta($date,"-0:0:0:$num:0:0:0",\$err,0);
+ }
+ $date=&Date_SetTime($date,$hr,$min,$sec) if (defined $hr);
+ $date=&DateCalc_DateDelta($date,"-0:0:1:0:0:0:0",\$err,0)
+ if ($adjust && &Date_Cmp($date,$curr)>0);
+
+ } else {
+ ($h,$mn,$s)=( &Date_Split($date, 1) )[3..5];
+ ($th,$tm,$ts)=&Date_ParseTime($hr,$min,$sec);
+ if ($hr) {
+ ($hr,$min,$sec)=($th,$tm,$ts);
+ $delta="-0:0:0:1:0:0:0";
+ } elsif ($min) {
+ ($hr,$min,$sec)=($h,$tm,$ts);
+ $delta="-0:0:0:0:1:0:0";
+ } elsif ($sec) {
+ ($hr,$min,$sec)=($h,$mn,$ts);
+ $delta="-0:0:0:0:0:1:0";
+ } else {
+ confess "ERROR: invalid arguments in Date_GetPrev.\n";
+ }
+
+ $d=&Date_SetTime($date,$hr,$min,$sec);
+ if ($today) {
+ $d=&DateCalc_DateDelta($d,$delta,\$err,0) if (&Date_Cmp($d,$date)>0);
+ } else {
+ $d=&DateCalc_DateDelta($d,$delta,\$err,0) if (&Date_Cmp($d,$date)>=0);
+ }
+ $date=$d;
+ }
+ return $date;
+}
+
+sub Date_GetNext {
+ print "DEBUG: Date_GetNext\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,$dow,$today,$hr,$min,$sec)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ my($y,$m,$d,$h,$mn,$s,$err,$curr_dow,%dow,$num,$delta,$th,$tm,$ts,
+ $adjust,$curr)=();
+ $hr="00" if (defined $hr && $hr eq "0");
+ $min="00" if (defined $min && $min eq "0");
+ $sec="00" if (defined $sec && $sec eq "0");
+
+ if (! &Date_Split($date)) {
+ $date=&ParseDateString($date);
+ return "" if (! $date);
+ }
+ $curr=$date;
+ ($y,$m,$d)=( &Date_Split($date, 1) )[0..2];
+
+ if ($dow) {
+ $curr_dow=&Date_DayOfWeek($m,$d,$y);
+ %dow=%{ $Lang{$Cnf{"Language"}}{"WeekH"} };
+ if (&IsInt($dow)) {
+ return "" if ($dow<1 || $dow>7);
+ } else {
+ return "" if (! exists $dow{lc($dow)});
+ $dow=$dow{lc($dow)};
+ }
+ if ($dow == $curr_dow) {
+ $date=&DateCalc_DateDelta($date,"+0:0:1:0:0:0:0",\$err,0) if (! $today);
+ $adjust=1 if ($today==2);
+ } else {
+ $curr_dow -= 7 if ($curr_dow>$dow); # make sure next date is greater
+ $num = $dow - $curr_dow;
+ $date=&DateCalc_DateDelta($date,"+0:0:0:$num:0:0:0",\$err,0);
+ }
+ $date=&Date_SetTime($date,$hr,$min,$sec) if (defined $hr);
+ $date=&DateCalc_DateDelta($date,"+0:0:1:0:0:0:0",\$err,0)
+ if ($adjust && &Date_Cmp($date,$curr)<0);
+
+ } else {
+ ($h,$mn,$s)=( &Date_Split($date, 1) )[3..5];
+ ($th,$tm,$ts)=&Date_ParseTime($hr,$min,$sec);
+ if ($hr) {
+ ($hr,$min,$sec)=($th,$tm,$ts);
+ $delta="+0:0:0:1:0:0:0";
+ } elsif ($min) {
+ ($hr,$min,$sec)=($h,$tm,$ts);
+ $delta="+0:0:0:0:1:0:0";
+ } elsif ($sec) {
+ ($hr,$min,$sec)=($h,$mn,$ts);
+ $delta="+0:0:0:0:0:1:0";
+ } else {
+ confess "ERROR: invalid arguments in Date_GetNext.\n";
+ }
+
+ $d=&Date_SetTime($date,$hr,$min,$sec);
+ if ($today) {
+ $d=&DateCalc_DateDelta($d,$delta,\$err,0) if (&Date_Cmp($d,$date)<0);
+ } else {
+ $d=&DateCalc_DateDelta($d,$delta,\$err,0) if (&Date_Cmp($d,$date)<1);
+ }
+ $date=$d;
+ }
+
+ return $date;
+}
+
+sub Date_IsHoliday {
+ print "DEBUG: Date_IsHoliday\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ $date=&ParseDateString($date);
+ return undef if (! $date);
+ $date=&Date_SetTime($date,0,0,0);
+ my($y)=(&Date_Split($date, 1))[0];
+ &Date_UpdateHolidays($y) if (! exists $Holiday{"dates"}{$y});
+ return undef if (! exists $Holiday{"dates"}{$y}{$date});
+ my($name)=$Holiday{"dates"}{$y}{$date};
+ return "" if (! $name);
+ $name;
+}
+
+sub Events_List {
+ print "DEBUG: Events_List\n" if ($Curr{"Debug"} =~ /trace/);
+ my(@args)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ &Events_ParseRaw();
+
+ my($tmp,$date0,$date1,$flag);
+ $date0=&ParseDateString($args[0]);
+ warn "Invalid date $args[0]", return undef if (! $date0);
+
+ if ($#args == 0) {
+ return &Events_Calc($date0);
+ }
+
+ if ($args[1]) {
+ $date1=&ParseDateString($args[1]);
+ warn "Invalid date $args[1]\n", return undef if (! $date1);
+ if (&Date_Cmp($date0,$date1)>0) {
+ $tmp=$date1;
+ $date1=$date0;
+ $date0=$tmp;
+ }
+ } else {
+ $date0=&Date_SetTime($date0,"00:00:00");
+ $date1=&DateCalc_DateDelta($date0,"+0:0:0:1:0:0:0");
+ }
+
+ $tmp=&Events_Calc($date0,$date1);
+
+ $flag=$args[2];
+ return $tmp if (! $flag);
+
+ my(@tmp,%ret,$delta)=();
+ @tmp=@$tmp;
+ push(@tmp,$date1);
+
+ if ($flag==1) {
+ while ($#tmp>0) {
+ ($date0,$tmp)=splice(@tmp,0,2);
+ $date1=$tmp[0];
+ $delta=&DateCalc_DateDate($date0,$date1);
+ foreach $flag (@$tmp) {
+ if (exists $ret{$flag}) {
+ $ret{$flag}=&DateCalc_DeltaDelta($ret{$flag},$delta);
+ } else {
+ $ret{$flag}=$delta;
+ }
+ }
+ }
+ return \%ret;
+
+ } elsif ($flag==2) {
+ while ($#tmp>0) {
+ ($date0,$tmp)=splice(@tmp,0,2);
+ $date1=$tmp[0];
+ $delta=&DateCalc_DateDate($date0,$date1);
+ $flag=join("+",sort @$tmp);
+ next if (! $flag);
+ if (exists $ret{$flag}) {
+ $ret{$flag}=&DateCalc_DeltaDelta($ret{$flag},$delta);
+ } else {
+ $ret{$flag}=$delta;
+ }
+ }
+ return \%ret;
+ }
+
+ warn "Invalid flag $flag\n";
+ return undef;
+}
+
+###
+# NOTE: The following routines may be called in the routines below with very
+# little time penalty.
+###
+sub Date_SetTime {
+ print "DEBUG: Date_SetTime\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,$h,$mn,$s)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ my($y,$m,$d)=();
+
+ if (! &Date_Split($date)) {
+ $date=&ParseDateString($date);
+ return "" if (! $date);
+ }
+
+ ($y,$m,$d)=( &Date_Split($date, 1) )[0..2];
+ ($h,$mn,$s)=&Date_ParseTime($h,$mn,$s);
+
+ my($ampm,$wk);
+ return "" if (&Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk));
+ &Date_Join($y,$m,$d,$h,$mn,$s);
+}
+
+sub Date_SetDateField {
+ print "DEBUG: Date_SetDateField\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,$field,$val,$nocheck)=@_;
+ my($y,$m,$d,$h,$mn,$s)=();
+ $nocheck=0 if (! defined $nocheck);
+
+ ($y,$m,$d,$h,$mn,$s)=&Date_Split($date);
+
+ if (! $y) {
+ $date=&ParseDateString($date);
+ return "" if (! $date);
+ ($y,$m,$d,$h,$mn,$s)=&Date_Split($date, 1);
+ }
+
+ if (lc($field) eq "y") {
+ $y=$val;
+ } elsif (lc($field) eq "m") {
+ $m=$val;
+ } elsif (lc($field) eq "d") {
+ $d=$val;
+ } elsif (lc($field) eq "h") {
+ $h=$val;
+ } elsif (lc($field) eq "mn") {
+ $mn=$val;
+ } elsif (lc($field) eq "s") {
+ $s=$val;
+ } else {
+ confess "ERROR: Date_SetDateField: invalid field: $field\n";
+ }
+
+ $date=&Date_Join($y,$m,$d,$h,$mn,$s);
+ return $date if ($nocheck || &Date_Split($date));
+ return "";
+}
+
+########################################################################
+# OTHER SUBROUTINES
+########################################################################
+# NOTE: These routines should not call any of the routines above as
+# there will be a severe time penalty (and the possibility of
+# infinite recursion). The last couple routines above are
+# exceptions.
+# NOTE: Date_Init is a special case. It should be called (conditionally)
+# in every routine that uses any variable from the Date::Manip
+# namespace.
+########################################################################
+
+sub Date_DaysInMonth {
+ print "DEBUG: Date_DaysInMonth\n" if ($Curr{"Debug"} =~ /trace/);
+ my($m,$y)=@_;
+ $y=&Date_FixYear($y) if (length($y)!=4);
+ my(@d_in_m)=(0,31,28,31,30,31,30,31,31,30,31,30,31);
+ $d_in_m[2]=29 if (&Date_LeapYear($y));
+ return $d_in_m[$m];
+}
+
+sub Date_DayOfWeek {
+ print "DEBUG: Date_DayOfWeek\n" if ($Curr{"Debug"} =~ /trace/);
+ my($m,$d,$y)=@_;
+ $y=&Date_FixYear($y) if (length($y)!=4);
+ my($dayofweek,$dec31)=();
+
+ $dec31=5; # Dec 31, 1BC was Friday
+ $dayofweek=(&Date_DaysSince1BC($m,$d,$y)+$dec31) % 7;
+ $dayofweek=7 if ($dayofweek==0);
+ return $dayofweek;
+}
+
+# Can't be in "use integer" because the numbers are too big.
+no integer;
+sub Date_SecsSince1970 {
+ print "DEBUG: Date_SecsSince1970\n" if ($Curr{"Debug"} =~ /trace/);
+ my($m,$d,$y,$h,$mn,$s)=@_;
+ $y=&Date_FixYear($y) if (length($y)!=4);
+ my($sec_now,$sec_70)=();
+ $sec_now=(&Date_DaysSince1BC($m,$d,$y)-1)*24*3600 + $h*3600 + $mn*60 + $s;
+# $sec_70 =(&Date_DaysSince1BC(1,1,1970)-1)*24*3600;
+ $sec_70 =62167219200;
+ return ($sec_now-$sec_70);
+}
+
+sub Date_SecsSince1970GMT {
+ print "DEBUG: Date_SecsSince1970GMT\n" if ($Curr{"Debug"} =~ /trace/);
+ my($m,$d,$y,$h,$mn,$s)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ $y=&Date_FixYear($y) if (length($y)!=4);
+
+ my($sec)=&Date_SecsSince1970($m,$d,$y,$h,$mn,$s);
+ return $sec if ($Cnf{"ConvTZ"} eq "IGNORE");
+
+ my($tz)=$Cnf{"ConvTZ"};
+ $tz=$Cnf{"TZ"} if (! $tz);
+ $tz=$Zone{"n2o"}{lc($tz)} if ($tz !~ /^[+-]\d{4}$/);
+
+ my($tzs)=1;
+ $tzs=-1 if ($tz<0);
+ $tz=~/.(..)(..)/;
+ my($tzh,$tzm)=($1,$2);
+ $sec - $tzs*($tzh*3600+$tzm*60);
+}
+use integer;
+
+sub Date_DaysSince1BC {
+ print "DEBUG: Date_DaysSince1BC\n" if ($Curr{"Debug"} =~ /trace/);
+ my($m,$d,$y)=@_;
+ $y=&Date_FixYear($y) if (length($y)!=4);
+ my($Ny,$N4,$N100,$N400,$dayofyear,$days)=();
+ my($cc,$yy)=();
+
+ $y=~ /(\d{2})(\d{2})/;
+ ($cc,$yy)=($1,$2);
+
+ # Number of full years since Dec 31, 1BC (counting the year 0000).
+ $Ny=$y;
+
+ # Number of full 4th years (incl. 0000) since Dec 31, 1BC
+ $N4=($Ny-1)/4 + 1;
+ $N4=0 if ($y==0);
+
+ # Number of full 100th years (incl. 0000)
+ $N100=$cc + 1;
+ $N100-- if ($yy==0);
+ $N100=0 if ($y==0);
+
+ # Number of full 400th years (incl. 0000)
+ $N400=($N100-1)/4 + 1;
+ $N400=0 if ($y==0);
+
+ $dayofyear=&Date_DayOfYear($m,$d,$y);
+ $days= $Ny*365 + $N4 - $N100 + $N400 + $dayofyear;
+
+ return $days;
+}
+
+sub Date_DayOfYear {
+ print "DEBUG: Date_DayOfYear\n" if ($Curr{"Debug"} =~ /trace/);
+ my($m,$d,$y)=@_;
+ $y=&Date_FixYear($y) if (length($y)!=4);
+ # DinM = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
+ my(@days) = ( 0, 31, 59, 90,120,151,181,212,243,273,304,334,365);
+ my($ly)=0;
+ $ly=1 if ($m>2 && &Date_LeapYear($y));
+ return ($days[$m-1]+$d+$ly);
+}
+
+sub Date_DaysInYear {
+ print "DEBUG: Date_DaysInYear\n" if ($Curr{"Debug"} =~ /trace/);
+ my($y)=@_;
+ $y=&Date_FixYear($y) if (length($y)!=4);
+ return 366 if (&Date_LeapYear($y));
+ return 365;
+}
+
+sub Date_WeekOfYear {
+ print "DEBUG: Date_WeekOfYear\n" if ($Curr{"Debug"} =~ /trace/);
+ my($m,$d,$y,$f)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ $y=&Date_FixYear($y) if (length($y)!=4);
+
+ my($day,$dow,$doy)=();
+ $doy=&Date_DayOfYear($m,$d,$y);
+
+ # The current DayOfYear and DayOfWeek
+ if ($Cnf{"Jan1Week1"}) {
+ $day=1;
+ } else {
+ $day=4;
+ }
+ $dow=&Date_DayOfWeek(1,$day,$y);
+
+ # Move back to the first day of week 1.
+ $f-=7 if ($f>$dow);
+ $day-= ($dow-$f);
+
+ return 0 if ($day>$doy); # Day is in last week of previous year
+ return (($doy-$day)/7 + 1);
+}
+
+sub Date_LeapYear {
+ print "DEBUG: Date_LeapYear\n" if ($Curr{"Debug"} =~ /trace/);
+ my($y)=@_;
+ $y=&Date_FixYear($y) if (length($y)!=4);
+ return 0 unless $y % 4 == 0;
+ return 1 unless $y % 100 == 0;
+ return 0 unless $y % 400 == 0;
+ return 1;
+}
+
+sub Date_DaySuffix {
+ print "DEBUG: Date_DaySuffix\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ return $Lang{$Cnf{"Language"}}{"DoML"}[$d-1];
+}
+
+sub Date_ConvTZ {
+ print "DEBUG: Date_ConvTZ\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,$from,$to)=@_;
+ if (not Date_Split($date)) {
+ croak "date passed in ('$date') is not a Date::Manip object";
+ }
+
+ &Date_Init() if (! $Curr{"InitDone"});
+ my($gmt)=();
+
+ if (! $from) {
+
+ if (! $to) {
+ # TZ -> ConvTZ
+ return $date if ($Cnf{"ConvTZ"} eq "IGNORE" or ! $Cnf{"ConvTZ"});
+ $from=$Cnf{"TZ"};
+ $to=$Cnf{"ConvTZ"};
+
+ } else {
+ # ConvTZ,TZ -> $to
+ $from=$Cnf{"ConvTZ"};
+ $from=$Cnf{"TZ"} if (! $from);
+ }
+
+ } else {
+
+ if (! $to) {
+ # $from -> ConvTZ,TZ
+ return $date if ($Cnf{"ConvTZ"} eq "IGNORE");
+ $to=$Cnf{"ConvTZ"};
+ $to=$Cnf{"TZ"} if (! $to);
+
+ } else {
+ # $from -> $to
+ }
+ }
+
+ $to=$Zone{"n2o"}{lc($to)}
+ if (exists $Zone{"n2o"}{lc($to)});
+ $from=$Zone{"n2o"}{lc($from)}
+ if (exists $Zone{"n2o"}{lc($from)});
+ $gmt=$Zone{"n2o"}{"gmt"};
+
+ return $date if ($from !~ /^[+-]\d{4}$/ or $to !~ /^[+-]\d{4}$/);
+ return $date if ($from eq $to);
+
+ my($s1,$h1,$m1,$s2,$h2,$m2,$d,$h,$m,$sign,$delta,$err,$yr,$mon,$sec)=();
+ # We're going to try to do the calculation without calling DateCalc.
+ ($yr,$mon,$d,$h,$m,$sec)=&Date_Split($date, 1);
+
+ # Convert $date from $from to GMT
+ $from=~/([+-])(\d{2})(\d{2})/;
+ ($s1,$h1,$m1)=($1,$2,$3);
+ $s1= ($s1 eq "-" ? "+" : "-"); # switch sign
+ $sign=$s1 . "1"; # + or - 1
+
+ # and from GMT to $to
+ $to=~/([+-])(\d{2})(\d{2})/;
+ ($s2,$h2,$m2)=($1,$2,$3);
+
+ if ($s1 eq $s2) {
+ # Both the same sign
+ $m+= $sign*($m1+$m2);
+ $h+= $sign*($h1+$h2);
+ } else {
+ $sign=($s2 eq "-" ? +1 : -1) if ($h1<$h2 || ($h1==$h2 && $m1<$m2));
+ $m+= $sign*($m1-$m2);
+ $h+= $sign*($h1-$h2);
+ }
+
+ if ($m>59) {
+ $h+= $m/60;
+ $m-= ($m/60)*60;
+ } elsif ($m<0) {
+ $h+= ($m/60 - 1);
+ $m-= ($m/60 - 1)*60;
+ }
+
+ if ($h>23) {
+ $delta=$h/24;
+ $h -= $delta*24;
+ if (($d + $delta) > 28) {
+ $date=&Date_Join($yr,$mon,$d,$h,$m,$sec);
+ return &DateCalc_DateDelta($date,"+0:0:0:$delta:0:0:0",\$err,0);
+ }
+ $d+= $delta;
+ } elsif ($h<0) {
+ $delta=-$h/24 + 1;
+ $h += $delta*24;
+ if (($d - $delta) < 1) {
+ $date=&Date_Join($yr,$mon,$d,$h,$m,$sec);
+ return &DateCalc_DateDelta($date,"-0:0:0:$delta:0:0:0",\$err,0);
+ }
+ $d-= $delta;
+ }
+ return &Date_Join($yr,$mon,$d,$h,$m,$sec);
+}
+
+sub Date_TimeZone {
+ print "DEBUG: Date_TimeZone\n" if ($Curr{"Debug"} =~ /trace/);
+ my($null,$tz,@tz,$std,$dst,$time,$isdst,$tmp,$in)=();
+ &Date_Init() if (! $Curr{"InitDone"});
+
+ # Get timezones from all of the relevant places
+
+ push(@tz,$Cnf{"TZ"}) if (defined $Cnf{"TZ"}); # TZ config var
+ push(@tz,$ENV{"TZ"}) if (defined $ENV{"TZ"}); # TZ environ var
+ push(@tz,$ENV{'SYS$TIMEZONE_RULE'})
+ if defined $ENV{'SYS$TIMEZONE_RULE'}; # VMS TZ environ var
+ push(@tz,$ENV{'SYS$TIMEZONE_NAME'})
+ if defined $ENV{'SYS$TIMEZONE_NAME'}; # VMS TZ name environ var
+ push(@tz,$ENV{'UCX$TZ'})
+ if defined $ENV{'UCX$TZ'}; # VMS TZ environ var
+ push(@tz,$ENV{'TCPIP$TZ'})
+ if defined $ENV{'TCPIP$TZ'}; # VMS TZ environ var
+
+ # The `date` command... if we're doing taint checking, we need to
+ # always call it with a full path... otherwise, use the user's path.
+ #
+ # Microsoft operating systems don't have a date command built in. Try
+ # to trap all the various ways of knowing we are on one of these systems.
+ #
+ # We'll try `date +%Z` first, and if that fails, we'll take just the
+ # `date` program and assume the output is of the format:
+ # Thu Aug 31 14:57:46 EDT 2000
+
+ unless (($^X =~ /perl\.exe$/i) or
+ ($OS eq "Windows") or
+ ($OS eq "Netware") or
+ ($OS eq "VMS")) {
+ if ($Date::Manip::NoTaint) {
+ if ($OS eq "VMS") {
+ $tz=$ENV{'SYS$TIMEZONE_NAME'};
+ if (! $tz) {
+ $tz=$ENV{'MULTINET_TIMEZONE'};
+ if (! $tz) {
+ $tz=$ENV{'SYS$TIMEZONE_DIFFERENTIAL'}/3600.; # e.g. '-4' for EDT
+ }
+ }
+ } else {
+ $tz=`date +%Z 2> /dev/null`;
+ chomp($tz);
+ if (! $tz) {
+ $tz=`date 2> /dev/null`;
+ chomp($tz);
+ $tz=(split(/\s+/,$tz))[4];
+ }
+ }
+ push(@tz,$tz);
+ } else {
+ # We need to satisfy taint checking, but also look in all the
+ # directories in @DatePath.
+ #
+ local $ENV{PATH} = join(':', @Date::Manip::DatePath);
+ local $ENV{BASH_ENV} = '';
+ $tz=`date +%Z 2> /dev/null`;
+ chomp($tz);
+ if (! $tz) {
+ $tz=`date 2> /dev/null`;
+ chomp($tz);
+ $tz=(split(/\s+/,$tz))[4];
+ }
+ push(@tz,$tz);
+ }
+ }
+
+ push(@tz,$main::TZ) if (defined $main::TZ); # $main::TZ
+
+ if (-s "/etc/TIMEZONE") { # /etc/TIMEZONE
+ $in=new IO::File;
+ $in->open("/etc/TIMEZONE","r");
+ while (! eof($in)) {
+ $tmp=<$in>;
+ if ($tmp =~ /^TZ\s*=\s*(.*?)\s*$/) {
+ push(@tz,$1);
+ last;
+ }
+ }
+ $in->close;
+ }
+
+ if (-s "/etc/timezone") { # /etc/timezone
+ $in=new IO::File;
+ $in->open("/etc/timezone","r");
+ while (! eof($in)) {
+ $tmp=<$in>;
+ next if ($tmp =~ /^\s*\043/);
+ chomp($tmp);
+ if ($tmp =~ /^\s*(.*?)\s*$/) {
+ push(@tz,$1);
+ last;
+ }
+ }
+ $in->close;
+ }
+
+ # Now parse each one to find the first valid one.
+ foreach $tz (@tz) {
+ $tz =~ s/\s*$//;
+ $tz =~ s/^\s*//;
+ next if (! $tz);
+
+ return uc($tz)
+ if (defined $Zone{"n2o"}{lc($tz)});
+
+ if ($tz =~ /^[+-]\d{4}$/) {
+ return $tz;
+ } elsif ($tz =~ /^([+-]\d{2})(?::(\d{2}))?$/) {
+ my($h,$m)=($1,$2);
+ $m="00" if (! $m);
+ return "$h$m";
+ }
+
+ # Handle US/Eastern format
+ if ($tz =~ /^$Zone{"tzones"}$/i) {
+ $tmp=lc $1;
+ $tz=$Zone{"tz2z"}{$tmp};
+ }
+
+ # Handle STD#DST# format (and STD-#DST-# formats)
+ if ($tz =~ /^([a-z]+)-?\d([a-z]+)-?\d?$/i) {
+ ($std,$dst)=($1,$2);
+ next if (! defined $Zone{"n2o"}{lc($std)} or
+ ! defined $Zone{"n2o"}{lc($dst)});
+ $time = time();
+ ($null,$null,$null,$null,$null,$null,$null,$null,$isdst) =
+ localtime($time);
+ return uc($dst) if ($isdst);
+ return uc($std);
+ }
+ }
+
+ confess "ERROR: Date::Manip unable to determine TimeZone.\n";
+}
+
+# Returns 1 if $date is a work day. If $time is non-zero, the time is
+# also checked to see if it falls within work hours. Returns "" if
+# an invalid date is passed in.
+sub Date_IsWorkDay {
+ print "DEBUG: Date_IsWorkDay\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,$time)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ $date=&ParseDateString($date);
+ return "" if (! $date);
+ my($d)=$date;
+ $d=&Date_SetTime($date,$Cnf{"WorkDayBeg"}) if (! $time);
+
+ my($y,$mon,$day,$tmp,$h,$m,$dow)=();
+ ($y,$mon,$day,$h,$m,$tmp)=&Date_Split($d, 1);
+ $dow=&Date_DayOfWeek($mon,$day,$y);
+
+ return 0 if ($dow<$Cnf{"WorkWeekBeg"} or
+ $dow>$Cnf{"WorkWeekEnd"} or
+ "$h:$m" lt $Cnf{"WorkDayBeg"} or
+ "$h:$m" gt $Cnf{"WorkDayEnd"});
+
+ if (! exists $Holiday{"dates"}{$y}) {
+ # There will be recursion problems if we ever end up here twice.
+ $Holiday{"dates"}{$y}={};
+ &Date_UpdateHolidays($y)
+ }
+ $d=&Date_SetTime($date,"00:00:00");
+ return 0 if (exists $Holiday{"dates"}{$y}{$d});
+ 1;
+}
+
+# Finds the day $off work days from now. If $time is passed in, we must
+# also take into account the time of day.
+#
+# If $time is not passed in, day 0 is today (if today is a workday) or the
+# next work day if it isn't. In any case, the time of day is unaffected.
+#
+# If $time is passed in, day 0 is now (if now is part of a workday) or the
+# start of the very next work day.
+sub Date_NextWorkDay {
+ print "DEBUG: Date_NextWorkDay\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,$off,$time)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ $date=&ParseDateString($date);
+ my($err)=();
+
+ if (! &Date_IsWorkDay($date,$time)) {
+ if ($time) {
+ while (1) {
+ $date=&Date_GetNext($date,undef,0,$Cnf{"WorkDayBeg"});
+ last if (&Date_IsWorkDay($date,$time));
+ }
+ } else {
+ while (1) {
+ $date=&DateCalc_DateDelta($date,"+0:0:0:1:0:0:0",\$err,0);
+ last if (&Date_IsWorkDay($date,$time));
+ }
+ }
+ }
+
+ while ($off>0) {
+ while (1) {
+ $date=&DateCalc_DateDelta($date,"+0:0:0:1:0:0:0",\$err,0);
+ last if (&Date_IsWorkDay($date,$time));
+ }
+ $off--;
+ }
+
+ return $date;
+}
+
+# Finds the day $off work days before now. If $time is passed in, we must
+# also take into account the time of day.
+#
+# If $time is not passed in, day 0 is today (if today is a workday) or the
+# previous work day if it isn't. In any case, the time of day is unaffected.
+#
+# If $time is passed in, day 0 is now (if now is part of a workday) or the
+# end of the previous work period. Note that since the end of a work day
+# will automatically be turned into the start of the next one, this time
+# may actually be treated as AFTER the current time.
+sub Date_PrevWorkDay {
+ print "DEBUG: Date_PrevWorkDay\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,$off,$time)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ $date=&ParseDateString($date);
+ my($err)=();
+
+ if (! &Date_IsWorkDay($date,$time)) {
+ if ($time) {
+ while (1) {
+ $date=&Date_GetPrev($date,undef,0,$Cnf{"WorkDayEnd"});
+ last if (&Date_IsWorkDay($date,$time));
+ }
+ while (1) {
+ $date=&Date_GetNext($date,undef,0,$Cnf{"WorkDayBeg"});
+ last if (&Date_IsWorkDay($date,$time));
+ }
+ } else {
+ while (1) {
+ $date=&DateCalc_DateDelta($date,"-0:0:0:1:0:0:0",\$err,0);
+ last if (&Date_IsWorkDay($date,$time));
+ }
+ }
+ }
+
+ while ($off>0) {
+ while (1) {
+ $date=&DateCalc_DateDelta($date,"-0:0:0:1:0:0:0",\$err,0);
+ last if (&Date_IsWorkDay($date,$time));
+ }
+ $off--;
+ }
+
+ return $date;
+}
+
+# This finds the nearest workday to $date. If $date is a workday, it
+# is returned.
+sub Date_NearestWorkDay {
+ print "DEBUG: Date_NearestWorkDay\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date,$tomorrow)=@_;
+ &Date_Init() if (! $Curr{"InitDone"});
+ $date=&ParseDateString($date);
+ my($a,$b,$dela,$delb,$err)=();
+ $tomorrow=$Cnf{"TomorrowFirst"} if (! defined $tomorrow);
+
+ return $date if (&Date_IsWorkDay($date));
+
+ # Find the nearest one.
+ if ($tomorrow) {
+ $dela="+0:0:0:1:0:0:0";
+ $delb="-0:0:0:1:0:0:0";
+ } else {
+ $dela="-0:0:0:1:0:0:0";
+ $delb="+0:0:0:1:0:0:0";
+ }
+ $a=$b=$date;
+
+ while (1) {
+ $a=&DateCalc_DateDelta($a,$dela,\$err);
+ return $a if (&Date_IsWorkDay($a));
+ $b=&DateCalc_DateDelta($b,$delb,\$err);
+ return $b if (&Date_IsWorkDay($b));
+ }
+}
+
+# &Date_NthDayOfYear($y,$n);
+# Returns a list of (YYYY,MM,DD,HH,MM,SS) for the Nth day of the year.
+sub Date_NthDayOfYear {
+ no integer;
+ print "DEBUG: Date_NthDayOfYear\n" if ($Curr{"Debug"} =~ /trace/);
+ my($y,$n)=@_;
+ $y=$Curr{"Y"} if (! $y);
+ $n=1 if (! defined $n or $n eq "");
+ $n+=0; # to turn 023 into 23
+ $y=&Date_FixYear($y) if (length($y)<4);
+ my $leap=&Date_LeapYear($y);
+ return () if ($n<1);
+ return () if ($n >= ($leap ? 367 : 366));
+
+ my(@d_in_m)=(31,28,31,30,31,30,31,31,30,31,30,31);
+ $d_in_m[1]=29 if ($leap);
+
+ # Calculate the hours, minutes, and seconds into the day.
+ my $remain=($n - int($n))*24;
+ my $h=int($remain);
+ $remain=($remain - $h)*60;
+ my $mn=int($remain);
+ $remain=($remain - $mn)*60;
+ my $s=$remain;
+
+ # Calculate the month and the day.
+ my($m,$d)=(0,0);
+ $n=int($n);
+ while ($n>0) {
+ $m++;
+ if ($n<=$d_in_m[0]) {
+ $d=int($n);
+ $n=0;
+ } else {
+ $n-= $d_in_m[0];
+ shift(@d_in_m);
+ }
+ }
+
+ ($y,$m,$d,$h,$mn,$s);
+}
+
+########################################################################
+# NOT FOR EXPORT
+########################################################################
+
+# This is used in Date_Init to fill in a hash based on international
+# data. It takes a list of keys and values and returns both a hash
+# with these values and a regular expression of keys.
+#
+# IN:
+# $data = [ key1 val1 key2 val2 ... ]
+# $opts = lc : lowercase the keys in the regexp
+# sort : sort (by length) the keys in the regexp
+# back : create a regexp with a back reference
+# escape : escape all strings in the regexp
+#
+# OUT:
+# $regexp = '(?:key1|key2|...)'
+# $hash = { key1=>val1 key2=>val2 ... }
+
+sub Date_InitHash {
+ print "DEBUG: Date_InitHash\n" if ($Curr{"Debug"} =~ /trace/);
+ my($data,$regexp,$opts,$hash)=@_;
+ my(@data)=@$data;
+ my($key,$val,@list)=();
+
+ # Parse the options
+ my($lc,$sort,$back,$escape)=(0,0,0,0);
+ $lc=1 if ($opts =~ /lc/i);
+ $sort=1 if ($opts =~ /sort/i);
+ $back=1 if ($opts =~ /back/i);
+ $escape=1 if ($opts =~ /escape/i);
+
+ # Create the hash
+ while (@data) {
+ ($key,$val,@data)=@data;
+ $key=lc($key) if ($lc);
+ $$hash{$key}=$val;
+ }
+
+ # Create the regular expression
+ if ($regexp) {
+ @list=keys(%$hash);
+ @list=sort sortByLength(@list) if ($sort);
+ if ($escape) {
+ foreach $val (@list) {
+ $val="\Q$val\E";
+ }
+ }
+ if ($back) {
+ $$regexp="(" . join("|",@list) . ")";
+ } else {
+ $$regexp="(?:" . join("|",@list) . ")";
+ }
+ }
+}
+
+# This is used in Date_Init to fill in regular expressions, lists, and
+# hashes based on international data. It takes a list of lists which have
+# to be stored as regular expressions (to find any element in the list),
+# lists, and hashes (indicating the location in the lists).
+#
+# IN:
+# $data = [ [ [ valA1 valA2 ... ][ valA1' valA2' ... ] ... ]
+# [ [ valB1 valB2 ... ][ valB1' valB2' ... ] ... ]
+# ...
+# [ [ valZ1 valZ2 ... ] [valZ1' valZ1' ... ] ... ] ]
+# $lists = [ \@listA \@listB ... \@listZ ]
+# $opts = lc : lowercase the values in the regexp
+# sort : sort (by length) the values in the regexp
+# back : create a regexp with a back reference
+# escape : escape all strings in the regexp
+# $hash = [ \%hash, TYPE ]
+# TYPE 0 : $hash{ valBn=>n-1 }
+# TYPE 1 : $hash{ valBn=>n }
+#
+# OUT:
+# $regexp = '(?:valA1|valA2|...|valB1|...)'
+# $lists = [ [ valA1 valA2 ... ] # only the 1st list (or
+# [ valB1 valB2 ... ] ... ] # 2nd for int. characters)
+# $hash
+
+sub Date_InitLists {
+ print "DEBUG: Date_InitLists\n" if ($Curr{"Debug"} =~ /trace/);
+ my($data,$regexp,$opts,$lists,$hash)=@_;
+ my(@data)=@$data;
+ my(@lists)=@$lists;
+ my($i,@ele,$ele,@list,$j,$tmp)=();
+
+ # Parse the options
+ my($lc,$sort,$back,$escape)=(0,0,0,0);
+ $lc=1 if ($opts =~ /lc/i);
+ $sort=1 if ($opts =~ /sort/i);
+ $back=1 if ($opts =~ /back/i);
+ $escape=1 if ($opts =~ /escape/i);
+
+ # Set each of the lists
+ if (@lists) {
+ confess "ERROR: Date_InitLists: lists must be 1 per data\n"
+ if ($#lists != $#data);
+ for ($i=0; $i<=$#data; $i++) {
+ @ele=@{ $data[$i] };
+ if ($Cnf{"IntCharSet"} && $#ele>0) {
+ @{ $lists[$i] } = @{ $ele[1] };
+ } else {
+ @{ $lists[$i] } = @{ $ele[0] };
+ }
+ }
+ }
+
+ # Create the hash
+ my($hashtype,$hashsave,%hash)=();
+ if (@$hash) {
+ ($hash,$hashtype)=@$hash;
+ $hashsave=1;
+ } else {
+ $hashtype=0;
+ $hashsave=0;
+ }
+ for ($i=0; $i<=$#data; $i++) {
+ @ele=@{ $data[$i] };
+ foreach $ele (@ele) {
+ @list = @{ $ele };
+ for ($j=0; $j<=$#list; $j++) {
+ $tmp=$list[$j];
+ next if (! $tmp);
+ $tmp=lc($tmp) if ($lc);
+ $hash{$tmp}= $j+$hashtype;
+ }
+ }
+ }
+ %$hash = %hash if ($hashsave);
+
+ # Create the regular expression
+ if ($regexp) {
+ @list=keys(%hash);
+ @list=sort sortByLength(@list) if ($sort);
+ if ($escape) {
+ foreach $ele (@list) {
+ $ele="\Q$ele\E";
+ }
+ }
+ if ($back) {
+ $$regexp="(" . join("|",@list) . ")";
+ } else {
+ $$regexp="(?:" . join("|",@list) . ")";
+ }
+ }
+}
+
+# This is used in Date_Init to fill in regular expressions and lists based
+# on international data. This takes a list of strings and returns a regular
+# expression (to find any one of them).
+#
+# IN:
+# $data = [ string1 string2 ... ]
+# $opts = lc : lowercase the values in the regexp
+# sort : sort (by length) the values in the regexp
+# back : create a regexp with a back reference
+# escape : escape all strings in the regexp
+#
+# OUT:
+# $regexp = '(string1|string2|...)'
+
+sub Date_InitStrings {
+ print "DEBUG: Date_InitStrings\n" if ($Curr{"Debug"} =~ /trace/);
+ my($data,$regexp,$opts)=@_;
+ my(@list)=@{ $data };
+
+ # Parse the options
+ my($lc,$sort,$back,$escape)=(0,0,0,0);
+ $lc=1 if ($opts =~ /lc/i);
+ $sort=1 if ($opts =~ /sort/i);
+ $back=1 if ($opts =~ /back/i);
+ $escape=1 if ($opts =~ /escape/i);
+
+ # Create the regular expression
+ my($ele)=();
+ @list=sort sortByLength(@list) if ($sort);
+ if ($escape) {
+ foreach $ele (@list) {
+ $ele="\Q$ele\E";
+ }
+ }
+ if ($back) {
+ $$regexp="(" . join("|",@list) . ")";
+ } else {
+ $$regexp="(?:" . join("|",@list) . ")";
+ }
+ $$regexp=lc($$regexp) if ($lc);
+}
+
+# items is passed in (either as a space separated string, or a reference to
+# a list) and a regular expression which matches any one of the items is
+# prepared. The regular expression will be of one of the forms:
+# "(a|b)" @list not empty, back option included
+# "(?:a|b)" @list not empty
+# "()" @list empty, back option included
+# "" @list empty
+# $options is a string which contains any of the following strings:
+# back : the regular expression has a backreference
+# opt : the regular expression is optional and a "?" is appended in
+# the first two forms
+# optws : the regular expression is optional and may be replaced by
+# whitespace
+# optWs : the regular expression is optional, but if not present, must
+# be replaced by whitespace
+# sort : the items in the list are sorted by length (longest first)
+# lc : the string is lowercased
+# under : any underscores are converted to spaces
+# pre : it may be preceded by whitespace
+# Pre : it must be preceded by whitespace
+# PRE : it must be preceded by whitespace or the start
+# post : it may be followed by whitespace
+# Post : it must be followed by whitespace
+# POST : it must be followed by whitespace or the end
+# Spaces due to pre/post options will not be included in the back reference.
+#
+# If $array is included, then the elements will also be returned as a list.
+# $array is a string which may contain any of the following:
+# keys : treat the list as a hash and only the keys go into the regexp
+# key0 : treat the list as the values of a hash with keys 0 .. N-1
+# key1 : treat the list as the values of a hash with keys 1 .. N
+# val0 : treat the list as the keys of a hash with values 0 .. N-1
+# val1 : treat the list as the keys of a hash with values 1 .. N
+
+# &Date_InitLists([$lang{"month_name"},$lang{"month_abb"}],
+# [\$Month,"lc,sort,back"],
+# [\@Month,\@Mon],
+# [\%Month,1]);
+
+# This is used in Date_Init to prepare regular expressions. A list of
+# items is passed in (either as a space separated string, or a reference to
+# a list) and a regular expression which matches any one of the items is
+# prepared. The regular expression will be of one of the forms:
+# "(a|b)" @list not empty, back option included
+# "(?:a|b)" @list not empty
+# "()" @list empty, back option included
+# "" @list empty
+# $options is a string which contains any of the following strings:
+# back : the regular expression has a backreference
+# opt : the regular expression is optional and a "?" is appended in
+# the first two forms
+# optws : the regular expression is optional and may be replaced by
+# whitespace
+# optWs : the regular expression is optional, but if not present, must
+# be replaced by whitespace
+# sort : the items in the list are sorted by length (longest first)
+# lc : the string is lowercased
+# under : any underscores are converted to spaces
+# pre : it may be preceded by whitespace
+# Pre : it must be preceded by whitespace
+# PRE : it must be preceded by whitespace or the start
+# post : it may be followed by whitespace
+# Post : it must be followed by whitespace
+# POST : it must be followed by whitespace or the end
+# Spaces due to pre/post options will not be included in the back reference.
+#
+# If $array is included, then the elements will also be returned as a list.
+# $array is a string which may contain any of the following:
+# keys : treat the list as a hash and only the keys go into the regexp
+# key0 : treat the list as the values of a hash with keys 0 .. N-1
+# key1 : treat the list as the values of a hash with keys 1 .. N
+# val0 : treat the list as the keys of a hash with values 0 .. N-1
+# val1 : treat the list as the keys of a hash with values 1 .. N
+sub Date_Regexp {
+ print "DEBUG: Date_Regexp\n" if ($Curr{"Debug"} =~ /trace/);
+ my($list,$options,$array)=@_;
+ my(@list,$ret,%hash,$i)=();
+ local($_)=();
+ $options="" if (! defined $options);
+ $array="" if (! defined $array);
+
+ my($sort,$lc,$under)=(0,0,0);
+ $sort =1 if ($options =~ /sort/i);
+ $lc =1 if ($options =~ /lc/i);
+ $under=1 if ($options =~ /under/i);
+ my($back,$opt,$pre,$post,$ws)=("?:","","","","");
+ $back ="" if ($options =~ /back/i);
+ $opt ="?" if ($options =~ /opt/i);
+ $pre ='\s*' if ($options =~ /pre/);
+ $pre ='\s+' if ($options =~ /Pre/);
+ $pre ='(?:\s+|^)' if ($options =~ /PRE/);
+ $post ='\s*' if ($options =~ /post/);
+ $post ='\s+' if ($options =~ /Post/);
+ $post ='(?:$|\s+)' if ($options =~ /POST/);
+ $ws ='\s*' if ($options =~ /optws/);
+ $ws ='\s+' if ($options =~ /optws/);
+
+ my($hash,$keys,$key0,$key1,$val0,$val1)=(0,0,0,0,0,0);
+ $keys =1 if ($array =~ /keys/i);
+ $key0 =1 if ($array =~ /key0/i);
+ $key1 =1 if ($array =~ /key1/i);
+ $val0 =1 if ($array =~ /val0/i);
+ $val1 =1 if ($array =~ /val1/i);
+ $hash =1 if ($keys or $key0 or $key1 or $val0 or $val1);
+
+ my($ref)=ref $list;
+ if (! $ref) {
+ $list =~ s/\s*$//;
+ $list =~ s/^\s*//;
+ $list =~ s/\s+/&&&/g;
+ } elsif ($ref eq "ARRAY") {
+ $list = join("&&&",@$list);
+ } else {
+ confess "ERROR: Date_Regexp.\n";
+ }
+
+ if (! $list) {
+ if ($back eq "") {
+ return "()";
+ } else {
+ return "";
+ }
+ }
+
+ $list=lc($list) if ($lc);
+ $list=~ s/_/ /g if ($under);
+ @list=split(/&&&/,$list);
+ if ($keys) {
+ %hash=@list;
+ @list=keys %hash;
+ } elsif ($key0 or $key1 or $val0 or $val1) {
+ $i=0;
+ $i=1 if ($key1 or $val1);
+ if ($key0 or $key1) {
+ %hash= map { $_,$i++ } @list;
+ } else {
+ %hash= map { $i++,$_ } @list;
+ }
+ }
+ @list=sort sortByLength(@list) if ($sort);
+
+ $ret="($back" . join("|",@list) . ")";
+ $ret="(?:$pre$ret$post)" if ($pre or $post);
+ $ret.=$opt;
+ $ret="(?:$ret|$ws)" if ($ws);
+
+ if ($array and $hash) {
+ return ($ret,%hash);
+ } elsif ($array) {
+ return ($ret,@list);
+ } else {
+ return $ret;
+ }
+}
+
+# This will produce a delta with the correct number of signs. At most two
+# signs will be in it normally (one before the year, and one in front of
+# the day), but if appropriate, signs will be in front of all elements.
+# Also, as many of the signs will be equivalent as possible.
+sub Delta_Normalize {
+ print "DEBUG: Delta_Normalize\n" if ($Curr{"Debug"} =~ /trace/);
+ my($delta,$mode)=@_;
+ return "" if (! $delta);
+ return "+0:+0:+0:+0:+0:+0:+0"
+ if ($delta =~ /^([+-]?0+:){6}[+-]?0+$/ and $Cnf{"DeltaSigns"});
+ return "+0:0:0:0:0:0:0" if ($delta =~ /^([+-]?0+:){6}[+-]?0+$/);
+
+ my($tmp,$sign1,$sign2,$len)=();
+
+ # Calculate the length of the day in minutes
+ $len=24*60;
+ $len=$Curr{"WDlen"} if ($mode==2 || $mode==3);
+
+ # We have to get the sign of every component explicitely so that a "-0"
+ # or "+0" doesn't get lost by treating it numerically (i.e. "-0:0:2" must
+ # be a negative delta).
+
+ my($y,$mon,$w,$d,$h,$m,$s)=&Delta_Split($delta);
+
+ # We need to make sure that the signs of all parts of a delta are the
+ # same. The easiest way to do this is to convert all of the large
+ # components to the smallest ones, then convert the smaller components
+ # back to the larger ones.
+
+ # Do the year/month part
+
+ $mon += $y*12; # convert y to m
+ $sign1="+";
+ if ($mon<0) {
+ $mon *= -1;
+ $sign1="-";
+ }
+
+ $y = $mon/12; # convert m to y
+ $mon -= $y*12;
+
+ $y=0 if ($y eq "-0"); # get around silly -0 problem
+ $mon=0 if ($mon eq "-0");
+
+ # Do the wk/day/hour/min/sec part
+
+ {
+ # Unfortunately, $s is overflowing for dates more than ~70 years
+ # apart.
+ no integer;
+
+ if ($mode==3 || $mode==2) {
+ $s += $d*$len*60 + $h*3600 + $m*60; # convert d/h/m to s
+ } else {
+ $s += ($d+7*$w)*$len*60 + $h*3600 + $m*60; # convert w/d/h/m to s
+ }
+ $sign2="+";
+ if ($s<0) {
+ $s*=-1;
+ $sign2="-";
+ }
+
+ $m = int($s/60); # convert s to m
+ $s -= $m*60;
+ $d = int($m/$len); # convert m to d
+ $m -= $d*$len;
+
+ # The rest should be fine.
+ }
+ $h = $m/60; # convert m to h
+ $m -= $h*60;
+ if ($mode == 3 || $mode == 2) {
+ $w = $w*1; # get around +0 problem
+ } else {
+ $w = $d/7; # convert d to w
+ $d -= $w*7;
+ }
+
+ $w=0 if ($w eq "-0"); # get around silly -0 problem
+ $d=0 if ($d eq "-0");
+ $h=0 if ($h eq "-0");
+ $m=0 if ($m eq "-0");
+ $s=0 if ($s eq "-0");
+
+ # Only include two signs if necessary
+ $sign1=$sign2 if ($y==0 and $mon==0);
+ $sign2=$sign1 if ($w==0 and $d==0 and $h==0 and $m==0 and $s==0);
+ $sign2="" if ($sign1 eq $sign2 and ! $Cnf{"DeltaSigns"});
+
+ if ($Cnf{"DeltaSigns"}) {
+ return "$sign1$y:$sign1$mon:$sign2$w:$sign2$d:$sign2$h:$sign2$m:$sign2$s";
+ } else {
+ return "$sign1$y:$mon:$sign2$w:$d:$h:$m:$s";
+ }
+}
+
+# This checks a delta to make sure it is valid. If it is, it splits
+# it and returns the elements with a sign on each. The 2nd argument
+# specifies the default sign. Blank elements are set to 0. If the
+# third element is non-nil, exactly 7 elements must be included.
+sub Delta_Split {
+ print "DEBUG: Delta_Split\n" if ($Curr{"Debug"} =~ /trace/);
+ my($delta,$sign,$exact)=@_;
+ my(@delta)=split(/:/,$delta);
+ return () if ($exact and $#delta != 6);
+ my($i)=();
+ $sign="+" if (! defined $sign);
+ for ($i=0; $i<=$#delta; $i++) {
+ $delta[$i]="0" if (! $delta[$i]);
+ return () if ($delta[$i] !~ /^[+-]?\d+$/);
+ $sign = ($delta[$i] =~ s/^([+-])// ? $1 : $sign);
+ $delta[$i] = $sign.$delta[$i];
+ }
+ @delta;
+}
+
+# Reads up to 3 arguments. $h may contain the time in any international
+# format. Any empty elements are set to 0.
+sub Date_ParseTime {
+ print "DEBUG: Date_ParseTime\n" if ($Curr{"Debug"} =~ /trace/);
+ my($h,$m,$s)=@_;
+ my($t)=&CheckTime("one");
+
+ if (defined $h and $h =~ /$t/) {
+ $h=$1;
+ $m=$2;
+ $s=$3 if (defined $3);
+ }
+ $h="00" if (! defined $h);
+ $m="00" if (! defined $m);
+ $s="00" if (! defined $s);
+
+ ($h,$m,$s);
+}
+
+# Forms a date with the 6 elements passed in (all of which must be defined).
+# No check as to validity is made.
+sub Date_Join {
+ print "DEBUG: Date_Join\n" if ($Curr{"Debug"} =~ /trace/);
+ foreach (0 .. $#_) {
+ croak "undefined arg $_ to Date_Join()" if not defined $_[$_];
+ }
+ my($y,$m,$d,$h,$mn,$s)=@_;
+ my($ym,$md,$dh,$hmn,$mns)=();
+
+ if ($Cnf{"Internal"} == 0) {
+ $ym=$md=$dh="";
+ $hmn=$mns=":";
+
+ } elsif ($Cnf{"Internal"} == 1) {
+ $ym=$md=$dh=$hmn=$mns="";
+
+ } elsif ($Cnf{"Internal"} == 2) {
+ $ym=$md="-";
+ $dh=" ";
+ $hmn=$mns=":";
+
+ } else {
+ confess "ERROR: Invalid internal format in Date_Join.\n";
+ }
+ $m="0$m" if (length($m)==1);
+ $d="0$d" if (length($d)==1);
+ $h="0$h" if (length($h)==1);
+ $mn="0$mn" if (length($mn)==1);
+ $s="0$s" if (length($s)==1);
+ "$y$ym$m$md$d$dh$h$hmn$mn$mns$s";
+}
+
+# This checks a time. If it is valid, it splits it and returns 3 elements.
+# If "one" or "two" is passed in, a regexp with 1/2 or 2 digit hours is
+# returned.
+sub CheckTime {
+ print "DEBUG: CheckTime\n" if ($Curr{"Debug"} =~ /trace/);
+ my($time)=@_;
+ my($h)='(?:0?[0-9]|1[0-9]|2[0-3])';
+ my($h2)='(?:0[0-9]|1[0-9]|2[0-3])';
+ my($m)='[0-5][0-9]';
+ my($s)=$m;
+ my($hm)="(?:". $Lang{$Cnf{"Language"}}{"SepHM"} ."|:)";
+ my($ms)="(?:". $Lang{$Cnf{"Language"}}{"SepMS"} ."|:)";
+ my($ss)=$Lang{$Cnf{"Language"}}{"SepSS"};
+ my($t)="^($h)$hm($m)(?:$ms($s)(?:$ss\\d+)?)?\$";
+ if ($time eq "one") {
+ return $t;
+ } elsif ($time eq "two") {
+ $t="^($h2)$hm($m)(?:$ms($s)(?:$ss\\d+)?)?\$";
+ return $t;
+ }
+
+ if ($time =~ /$t/i) {
+ ($h,$m,$s)=($1,$2,$3);
+ $h="0$h" if (length($h)<2);
+ $m="0$m" if (length($m)<2);
+ $s="00" if (! defined $s);
+ return ($h,$m,$s);
+ } else {
+ return ();
+ }
+}
+
+# This checks a recurrence. If it is valid, it splits it and returns the
+# elements. Otherwise, it returns an empty list.
+# ($recur0,$recur1,$flags,$dateb,$date0,$date1)=&Recur_Split($recur);
+sub Recur_Split {
+ print "DEBUG: Recur_Split\n" if ($Curr{"Debug"} =~ /trace/);
+ my($recur)=@_;
+ my(@ret,@tmp);
+
+ my($R) = '(\*?(?:[-,0-9]+[:\*]){6}[-,0-9]+)';
+ my($F) = '(?:\*([^*]*))';
+ my($DB,$D0,$D1);
+ $DB=$D0=$D1=$F;
+
+ if ($recur =~ /^$R$F?$DB?$D0?$D1?$/) {
+ @ret=($1,$2,$3,$4,$5);
+ @tmp=split(/\*/,shift(@ret));
+ return () if ($#tmp>1);
+ return (@tmp,"",@ret) if ($#tmp==0);
+ return (@tmp,@ret);
+ }
+ return ();
+}
+
+# This checks a date. If it is valid, it splits it and returns the elements.
+# If no date is passed in, it returns a regular expression for the date.
+#
+# The optional second argument says 'I really expect this to be a
+# valid Date::Manip object, please throw an exception if it is
+# not'. Otherwise, errors are signalled by returning ().
+#
+sub Date_Split {
+ print "DEBUG: Date_Split\n" if ($Curr{"Debug"} =~ /trace/);
+ my($date, $definitely_valid)=@_;
+ $definitely_valid = 0 if not defined $definitely_valid;
+ my($ym,$md,$dh,$hmn,$mns)=();
+ my($y)='(\d{4})';
+ my($m)='(0[1-9]|1[0-2])';
+ my($d)='(0[1-9]|[1-2][0-9]|3[0-1])';
+ my($h)='([0-1][0-9]|2[0-3])';
+ my($mn)='([0-5][0-9])';
+ my($s)=$mn;
+
+ if ($Cnf{"Internal"} == 0) {
+ $ym=$md=$dh="";
+ $hmn=$mns=":";
+
+ } elsif ($Cnf{"Internal"} == 1) {
+ $ym=$md=$dh=$hmn=$mns="";
+
+ } elsif ($Cnf{"Internal"} == 2) {
+ $ym=$md="-";
+ $dh=" ";
+ $hmn=$mns=":";
+
+ } else {
+ confess "ERROR: Invalid internal format in Date_Split.\n";
+ }
+
+ my($t)="^$y$ym$m$md$d$dh$h$hmn$mn$mns$s\$";
+
+ if (not defined $date or $date eq '') {
+ if ($definitely_valid) {
+ die "bad date '$date'";
+ } else {
+ return $t;
+ }
+ }
+
+ if ($date =~ /$t/) {
+ ($y,$m,$d,$h,$mn,$s)=($1,$2,$3,$4,$5,$6);
+ my(@d_in_m)=(0,31,28,31,30,31,30,31,31,30,31,30,31);
+ $d_in_m[2]=29 if (&Date_LeapYear($y));
+ if ($d>$d_in_m[$m]) {
+ my $msg = "invalid date $date: day $d of month $m, but only $d_in_m[$m] days in that month";
+ if ($definitely_valid) {
+ die $msg;
+ }
+ else {
+ warn $msg;
+ return ();
+ }
+ }
+ return ($y,$m,$d,$h,$mn,$s);
+ }
+
+ if ($definitely_valid) {
+ die "invalid date $date: doesn't match regexp $t";
+ }
+ return ();
+}
+
+# This returns the date easter occurs on for a given year as ($month,$day).
+# This is from the Calendar FAQ.
+sub Date_Easter {
+ my($y)=@_;
+ $y=&Date_FixYear($y) if (length($y)==2);
+
+ my($c) = $y/100;
+ my($g) = $y % 19;
+ my($k) = ($c-17)/25;
+ my($i) = ($c - $c/4 - ($c-$k)/3 + 19*$g + 15) % 30;
+ $i = $i - ($i/28)*(1 - ($i/28)*(29/($i+1))*((21-$g)/11));
+ my($j) = ($y + $y/4 + $i + 2 - $c + $c/4) % 7;
+ my($l) = $i-$j;
+ my($m) = 3 + ($l+40)/44;
+ my($d) = $l + 28 - 31*($m/4);
+ return ($m,$d);
+}
+
+# This takes a list of years, months, WeekOfMonth's, and optionally
+# DayOfWeek's, and returns a list of dates. Optionally, a list of dates
+# can be passed in as the 1st argument (with the 2nd argument the null list)
+# and the year/month of these will be used.
+#
+# If $FDn is non-zero, the first week of the month contains the first
+# occurence of this day (1=Monday). If $FIn is non-zero, the first week of
+# the month contains the date (i.e. $FIn'th day of the month).
+sub Date_Recur_WoM {
+ my($y,$m,$w,$d,$FDn,$FIn)=@_;
+ my(@y)=@$y;
+ my(@m)=@$m;
+ my(@w)=@$w;
+ my(@d)=@$d;
+ my($date0,$date1,@tmp,@date,$d0,$d1,@tmp2)=();
+
+ if (@m) {
+ @tmp=();
+ foreach $y (@y) {
+ return () if (length($y)==1 || length($y)==3 || ! &IsInt($y,0,9999));
+ $y=&Date_FixYear($y) if (length($y)==2);
+ push(@tmp,$y);
+ }
+ @y=sort { $a<=>$b } (@tmp);
+
+ return () if (! @m);
+ foreach $m (@m) {
+ return () if (! &IsInt($m,1,12));
+ }
+ @m=sort { $a<=>$b } (@m);
+
+ @tmp=@tmp2=();
+ foreach $y (@y) {
+ foreach $m (@m) {
+ push(@tmp,$y);
+ push(@tmp2,$m);
+ }
+ }
+
+ @y=@tmp;
+ @m=@tmp2;
+
+ } else {
+ foreach $d0 (@y) {
+ @tmp=&Date_Split($d0);
+ return () if (! @tmp);
+ push(@tmp2,$tmp[0]);
+ push(@m,$tmp[1]);
+ }
+ @y=@tmp2;
+ }
+
+ return () if (! @w);
+ foreach $w (@w) {
+ return () if ($w==0 || ! &IsInt($w,-5,5));
+ }
+
+ if (@d) {
+ foreach $d (@d) {
+ return () if (! &IsInt($d,1,7));
+ }
+ @d=sort { $a<=>$b } (@d);
+ }
+
+ @date=();
+ foreach $y (@y) {
+ $m=shift(@m);
+
+ # Find 1st day of this month and next month
+ $date0=&Date_Join($y,$m,1,0,0,0);
+ $date1=&DateCalc($date0,"+0:1:0:0:0:0:0");
+
+ if (@d) {
+ foreach $d (@d) {
+ # Find 1st occurence of DOW (in both months)
+ $d0=&Date_GetNext($date0,$d,1);
+ $d1=&Date_GetNext($date1,$d,1);
+
+ @tmp=();
+ while (&Date_Cmp($d0,$d1)<0) {
+ push(@tmp,$d0);
+ $d0=&DateCalc($d0,"+0:0:1:0:0:0:0");
+ }
+
+ @tmp2=();
+ foreach $w (@w) {
+ if ($w>0) {
+ push(@tmp2,$tmp[$w-1]);
+ } else {
+ push(@tmp2,$tmp[$#tmp+1+$w]);
+ }
+ }
+ @tmp2=sort(@tmp2);
+ push(@date,@tmp2);
+ }
+
+ } else {
+ # Find 1st day of 1st week
+ if ($FDn != 0) {
+ $date0=&Date_GetNext($date0,$FDn,1);
+ } else {
+ $date0=&Date_Join($y,$m,$FIn,0,0,0);
+ }
+ $date0=&Date_GetPrev($date0,$Cnf{"FirstDay"},1);
+
+ # Find 1st day of 1st week of next month
+ if ($FDn != 0) {
+ $date1=&Date_GetNext($date1,$FDn,1);
+ } else {
+ $date1=&DateCalc($date1,"+0:0:0:".($FIn-1).":0:0:0") if ($FIn>1);
+ }
+ $date1=&Date_GetPrev($date1,$Cnf{"FirstDay"},1);
+
+ @tmp=();
+ while (&Date_Cmp($date0,$date1)<0) {
+ push(@tmp,$date0);
+ $date0=&DateCalc($date0,"+0:0:1:0:0:0:0");
+ }
+
+ @tmp2=();
+ foreach $w (@w) {
+ if ($w>0) {
+ push(@tmp2,$tmp[$w-1]);
+ } else {
+ push(@tmp2,$tmp[$#tmp+1+$w]);
+ }
+ }
+ @tmp2=sort(@tmp2);
+ push(@date,@tmp2);
+ }
+ }
+
+ @date;
+}
+
+# This returns a sorted list of dates formed by adding/subtracting
+# $delta to $dateb in the range $date0<=$d<$dateb. The first date int
+# the list is actually the first date<$date0 and the last date in the
+# list is the first date>=$date1 (because sometimes the set part will
+# move the date back into the range).
+sub Date_Recur {
+ my($date0,$date1,$dateb,$delta)=@_;
+ my(@ret,$d)=();
+
+ while (&Date_Cmp($dateb,$date0)<0) {
+ $dateb=&DateCalc_DateDelta($dateb,$delta);
+ }
+ while (&Date_Cmp($dateb,$date1)>=0) {
+ $dateb=&DateCalc_DateDelta($dateb,"-$delta");
+ }
+
+ # Add the dates $date0..$dateb
+ $d=$dateb;
+ while (&Date_Cmp($d,$date0)>=0) {
+ unshift(@ret,$d);
+ $d=&DateCalc_DateDelta($d,"-$delta");
+ }
+ # Add the first date earler than the range
+ unshift(@ret,$d);
+
+ # Add the dates $dateb..$date1
+ $d=&DateCalc_DateDelta($dateb,$delta);
+ while (&Date_Cmp($d,$date1)<0) {
+ push(@ret,$d);
+ $d=&DateCalc_DateDelta($d,$delta);
+ }
+ # Add the first date later than the range
+ push(@ret,$d);
+
+ @ret;
+}
+
+# This sets the values in each date of a recurrence.
+#
+# $h,$m,$s can each be values or lists "1-2,4". If any are equal to "-1",
+# they are not set (and none of the larger elements are set).
+sub Date_RecurSetTime {
+ my($date0,$date1,$dates,$h,$m,$s)=@_;
+ my(@dates)=@$dates;
+ my(@h,@m,@s,$date,@tmp)=();
+
+ $m="-1" if ($s eq "-1");
+ $h="-1" if ($m eq "-1");
+
+ if ($h ne "-1") {
+ @h=&ReturnList($h);
+ return () if ! (@h);
+ @h=sort { $a<=>$b } (@h);
+
+ @tmp=();
+ foreach $date (@dates) {
+ foreach $h (@h) {
+ push(@tmp,&Date_SetDateField($date,"h",$h,1));
+ }
+ }
+ @dates=@tmp;
+ }
+
+ if ($m ne "-1") {
+ @m=&ReturnList($m);
+ return () if ! (@m);
+ @m=sort { $a<=>$b } (@m);
+
+ @tmp=();
+ foreach $date (@dates) {
+ foreach $m (@m) {
+ push(@tmp,&Date_SetDateField($date,"mn",$m,1));
+ }
+ }
+ @dates=@tmp;
+ }
+
+ if ($s ne "-1") {
+ @s=&ReturnList($s);
+ return () if ! (@s);
+ @s=sort { $a<=>$b } (@s);
+
+ @tmp=();
+ foreach $date (@dates) {
+ foreach $s (@s) {
+ push(@tmp,&Date_SetDateField($date,"s",$s,1));
+ }
+ }
+ @dates=@tmp;
+ }
+
+ @tmp=();
+ foreach $date (@dates) {
+ push(@tmp,$date) if (&Date_Cmp($date,$date0)>=0 &&
+ &Date_Cmp($date,$date1)<0 &&
+ &Date_Split($date));
+ }
+
+ @tmp;
+}
+
+sub DateCalc_DateDate {
+ print "DEBUG: DateCalc_DateDate\n" if ($Curr{"Debug"} =~ /trace/);
+ my($D1,$D2,$mode)=@_;
+ my(@d_in_m)=(0,31,28,31,30,31,30,31,31,30,31,30,31);
+ $mode=0 if (! defined $mode);
+
+ # Exact mode
+ if ($mode==0) {
+ my($y1,$m1,$d1,$h1,$mn1,$s1)=&Date_Split($D1, 1);
+ my($y2,$m2,$d2,$h2,$mn2,$s2)=&Date_Split($D2, 1);
+ my($i,@delta,$d,$delta,$y)=();
+
+ # form the delta for hour/min/sec
+ $delta[4]=$h2-$h1;
+ $delta[5]=$mn2-$mn1;
+ $delta[6]=$s2-$s1;
+
+ # form the delta for yr/mon/day
+ $delta[0]=$delta[1]=0;
+ $d=0;
+ if ($y2>$y1) {
+ $d=&Date_DaysInYear($y1) - &Date_DayOfYear($m1,$d1,$y1);
+ $d+=&Date_DayOfYear($m2,$d2,$y2);
+ for ($y=$y1+1; $y<$y2; $y++) {
+ $d+= &Date_DaysInYear($y);
+ }
+ } elsif ($y2<$y1) {
+ $d=&Date_DaysInYear($y2) - &Date_DayOfYear($m2,$d2,$y2);
+ $d+=&Date_DayOfYear($m1,$d1,$y1);
+ for ($y=$y2+1; $y<$y1; $y++) {
+ $d+= &Date_DaysInYear($y);
+ }
+ $d *= -1;
+ } else {
+ $d=&Date_DayOfYear($m2,$d2,$y2) - &Date_DayOfYear($m1,$d1,$y1);
+ }
+ $delta[2]=0;
+ $delta[3]=$d;
+
+ for ($i=0; $i<7; $i++) {
+ $delta[$i]="+".$delta[$i] if ($delta[$i]>=0);
+ }
+
+ $delta=join(":",@delta);
+ $delta=&Delta_Normalize($delta,0);
+ return $delta;
+ }
+
+ my($date1,$date2)=($D1,$D2);
+ my($tmp,$sign,$err,@tmp)=();
+
+ # make sure both are work days
+ if ($mode==2 || $mode==3) {
+ $date1=&Date_NextWorkDay($date1,0,1);
+ $date2=&Date_NextWorkDay($date2,0,1);
+ }
+
+ # make sure date1 comes before date2
+ if (&Date_Cmp($date1,$date2)>0) {
+ $sign="-";
+ $tmp=$date1;
+ $date1=$date2;
+ $date2=$tmp;
+ } else {
+ $sign="+";
+ }
+ if (&Date_Cmp($date1,$date2)==0) {
+ return "+0:+0:+0:+0:+0:+0:+0" if ($Cnf{"DeltaSigns"});
+ return "+0:0:0:0:0:0:0";
+ }
+
+ my($y1,$m1,$d1,$h1,$mn1,$s1)=&Date_Split($date1, 1);
+ my($y2,$m2,$d2,$h2,$mn2,$s2)=&Date_Split($date2, 1);
+ my($dy,$dm,$dw,$dd,$dh,$dmn,$ds,$ddd)=(0,0,0,0,0,0,0,0);
+
+ if ($mode != 3) {
+
+ # Do years
+ $dy=$y2-$y1;
+ $dm=0;
+ if ($dy>0) {
+ $tmp=&DateCalc_DateDelta($date1,"+$dy:0:0:0:0:0:0",\$err,0);
+ if (&Date_Cmp($tmp,$date2)>0) {
+ $dy--;
+ $tmp=$date1;
+ $tmp=&DateCalc_DateDelta($date1,"+$dy:0:0:0:0:0:0",\$err,0)
+ if ($dy>0);
+ $dm=12;
+ }
+ $date1=$tmp;
+ }
+
+ # Do months
+ $dm+=$m2-$m1;
+ if ($dm>0) {
+ $tmp=&DateCalc_DateDelta($date1,"+0:$dm:0:0:0:0:0",\$err,0);
+ if (&Date_Cmp($tmp,$date2)>0) {
+ $dm--;
+ $tmp=$date1;
+ $tmp=&DateCalc_DateDelta($date1,"+0:$dm:0:0:0:0:0",\$err,0)
+ if ($dm>0);
+ }
+ $date1=$tmp;
+ }
+
+ # At this point, check to see that we're on a business day again so that
+ # Aug 3 (Monday) -> Sep 3 (Sunday) -> Sep 4 (Monday) = 1 month
+ if ($mode==2) {
+ if (! &Date_IsWorkDay($date1,0)) {
+ $date1=&Date_NextWorkDay($date1,0,1);
+ }
+ }
+ }
+
+ # Do days
+ if ($mode==2 || $mode==3) {
+ $dd=0;
+ while (1) {
+ $tmp=&Date_NextWorkDay($date1,1,1);
+ if (&Date_Cmp($tmp,$date2)<=0) {
+ $dd++;
+ $date1=$tmp;
+ } else {
+ last;
+ }
+ }
+
+ } else {
+ ($y1,$m1,$d1)=( &Date_Split($date1, 1) )[0..2];
+ $dd=0;
+ # If we're jumping across months, set $d1 to the first of the next month
+ # (or possibly the 0th of next month which is equivalent to the last day
+ # of this month)
+ if ($m1!=$m2) {
+ $d_in_m[2]=29 if (&Date_LeapYear($y1));
+ $dd=$d_in_m[$m1]-$d1+1;
+ $d1=1;
+ $tmp=&DateCalc_DateDelta($date1,"+0:0:0:$dd:0:0:0",\$err,0);
+ if (&Date_Cmp($tmp,$date2)>0) {
+ $dd--;
+ $d1--;
+ $tmp=&DateCalc_DateDelta($date1,"+0:0:0:$dd:0:0:0",\$err,0);
+ }
+ $date1=$tmp;
+ }
+
+ $ddd=0;
+ if ($d1<$d2) {
+ $ddd=$d2-$d1;
+ $tmp=&DateCalc_DateDelta($date1,"+0:0:0:$ddd:0:0:0",\$err,0);
+ if (&Date_Cmp($tmp,$date2)>0) {
+ $ddd--;
+ $tmp=&DateCalc_DateDelta($date1,"+0:0:0:$ddd:0:0:0",\$err,0);
+ }
+ $date1=$tmp;
+ }
+ $dd+=$ddd;
+ }
+
+ # in business mode, make sure h1 comes before h2 (if not find delta between
+ # now and end of day and move to start of next business day)
+ $d1=( &Date_Split($date1, 1) )[2];
+ $dh=$dmn=$ds=0;
+ if ($mode==2 || $mode==3 and $d1 != $d2) {
+ $tmp=&Date_SetTime($date1,$Cnf{"WorkDayEnd"});
+ $tmp=&DateCalc_DateDelta($tmp,"+0:0:0:0:0:1:0")
+ if ($Cnf{"WorkDay24Hr"});
+ $tmp=&DateCalc_DateDate($date1,$tmp,0);
+ ($tmp,$tmp,$tmp,$tmp,$dh,$dmn,$ds)=&Delta_Split($tmp);
+ $date1=&Date_NextWorkDay($date1,1,0);
+ $date1=&Date_SetTime($date1,$Cnf{"WorkDayBeg"});
+ $d1=( &Date_Split($date1, 1) )[2];
+ confess "ERROR: DateCalc DateDate Business.\n" if ($d1 != $d2);
+ }
+
+ # Hours, minutes, seconds
+ $tmp=&DateCalc_DateDate($date1,$date2,0);
+ @tmp=&Delta_Split($tmp);
+ $dh += $tmp[4];
+ $dmn += $tmp[5];
+ $ds += $tmp[6];
+
+ $tmp="$sign$dy:$dm:0:$dd:$dh:$dmn:$ds";
+ &Delta_Normalize($tmp,$mode);
+}
+
+sub DateCalc_DeltaDelta {
+ print "DEBUG: DateCalc_DeltaDelta\n" if ($Curr{"Debug"} =~ /trace/);
+ my($D1,$D2,$mode)=@_;
+ my(@delta1,@delta2,$i,$delta,@delta)=();
+ $mode=0 if (! defined $mode);
+
+ @delta1=&Delta_Split($D1);
+ @delta2=&Delta_Split($D2);
+ for ($i=0; $i<7; $i++) {
+ $delta[$i]=$delta1[$i]+$delta2[$i];
+ $delta[$i]="+".$delta[$i] if ($delta[$i]>=0);
+ }
+
+ $delta=join(":",@delta);
+ $delta=&Delta_Normalize($delta,$mode);
+ return $delta;
+}
+
+sub DateCalc_DateDelta {
+ print "DEBUG: DateCalc_DateDelta\n" if ($Curr{"Debug"} =~ /trace/);
+ my($D1,$D2,$errref,$mode)=@_;
+ my($date)=();
+ my(@d_in_m)=(0,31,28,31,30,31,30,31,31,30,31,30,31);
+ my($h1,$m1,$h2,$m2,$len,$hh,$mm)=();
+ $mode=0 if (! defined $mode);
+
+ if ($mode==2 || $mode==3) {
+ $h1=$Curr{"WDBh"};
+ $m1=$Curr{"WDBm"};
+ $h2=$Curr{"WDEh"};
+ $m2=$Curr{"WDEm"};
+ $hh=$h2-$h1;
+ $mm=$m2-$m1;
+ if ($mm<0) {
+ $hh--;
+ $mm+=60;
+ }
+ }
+
+ # Date, delta
+ my($y,$m,$d,$h,$mn,$s)=&Date_Split($D1, 1);
+ my($dy,$dm,$dw,$dd,$dh,$dmn,$ds)=&Delta_Split($D2);
+
+ # do the month/year part
+ $y+=$dy;
+ while (length($y)<4) {
+ $y = "0$y";
+ }
+ &ModuloAddition(-12,$dm,\$m,\$y); # -12 means 1-12 instead of 0-11
+ $d_in_m[2]=29 if (&Date_LeapYear($y));
+
+ # if we have gone past the last day of a month, move the date back to
+ # the last day of the month
+ if ($d>$d_in_m[$m]) {
+ $d=$d_in_m[$m];
+ }
+
+ # do the week part
+ if ($mode==0 || $mode==1) {
+ $dd += $dw*7;
+ } else {
+ $date=&DateCalc_DateDelta(&Date_Join($y,$m,$d,$h,$mn,$s),
+ "+0:0:$dw:0:0:0:0",0);
+ ($y,$m,$d,$h,$mn,$s)=&Date_Split($date, 1);
+ }
+
+ # in business mode, set the day to a work day at this point so the h/mn/s
+ # stuff will work out
+ if ($mode==2 || $mode==3) {
+ $d=$d_in_m[$m] if ($d>$d_in_m[$m]);
+ $date=&Date_NextWorkDay(&Date_Join($y,$m,$d,$h,$mn,$s),0,1);
+ ($y,$m,$d,$h,$mn,$s)=&Date_Split($date, 1);
+ }
+
+ # seconds, minutes, hours
+ &ModuloAddition(60,$ds,\$s,\$mn);
+ if ($mode==2 || $mode==3) {
+ while (1) {
+ &ModuloAddition(60,$dmn,\$mn,\$h);
+ $h+= $dh;
+
+ if ($h>$h2 or $h==$h2 && $mn>$m2) {
+ $dh=$h-$h2;
+ $dmn=$mn-$m2;
+ $h=$h1;
+ $mn=$m1;
+ $dd++;
+
+ } elsif ($h<$h1 or $h==$h1 && $mn<$m1) {
+ $dh=$h-$h1;
+ $dmn=$m1-$mn;
+ $h=$h2;
+ $mn=$m2;
+ $dd--;
+
+ } elsif ($h==$h2 && $mn==$m2) {
+ $dd++;
+ $dh=-$hh;
+ $dmn=-$mm;
+
+ } else {
+ last;
+ }
+ }
+
+ } else {
+ &ModuloAddition(60,$dmn,\$mn,\$h);
+ &ModuloAddition(24,$dh,\$h,\$d);
+ }
+
+ # If we have just gone past the last day of the month, we need to make
+ # up for this:
+ if ($d>$d_in_m[$m]) {
+ $dd+= $d-$d_in_m[$m];
+ $d=$d_in_m[$m];
+ }
+
+ # days
+ if ($mode==2 || $mode==3) {
+ if ($dd>=0) {
+ $date=&Date_NextWorkDay(&Date_Join($y,$m,$d,$h,$mn,$s),$dd,1);
+ } else {
+ $date=&Date_PrevWorkDay(&Date_Join($y,$m,$d,$h,$mn,$s),-$dd,1);
+ }
+ ($y,$m,$d,$h,$mn,$s)=&Date_Split($date, 1);
+
+ } else {
+ $d_in_m[2]=29 if (&Date_LeapYear($y));
+ $d=$d_in_m[$m] if ($d>$d_in_m[$m]);
+ $d += $dd;
+ while ($d<1) {
+ $m--;
+ if ($m==0) {
+ $m=12;
+ $y--;
+ if (&Date_LeapYear($y)) {
+ $d_in_m[2]=29;
+ } else {
+ $d_in_m[2]=28;
+ }
+ }
+ $d += $d_in_m[$m];
+ }
+ while ($d>$d_in_m[$m]) {
+ $d -= $d_in_m[$m];
+ $m++;
+ if ($m==13) {
+ $m=1;
+ $y++;
+ if (&Date_LeapYear($y)) {
+ $d_in_m[2]=29;
+ } else {
+ $d_in_m[2]=28;
+ }
+ }
+ }
+ }
+
+ if ($y<0 or $y>9999) {
+ $$errref=3;
+ return;
+ }
+ &Date_Join($y,$m,$d,$h,$mn,$s);
+}
+
+sub Date_UpdateHolidays {
+ print "DEBUG: Date_UpdateHolidays\n" if ($Curr{"Debug"} =~ /trace/);
+ my($year)=@_;
+ $Holiday{"year"}=$year;
+ $Holiday{"dates"}{$year}={};
+
+ my($date,$delta,$err)=();
+ my($key,@tmp,$tmp);
+
+ foreach $key (keys %{ $Holiday{"desc"} }) {
+ @tmp=&Recur_Split($key);
+ if (@tmp) {
+ $tmp=&ParseDateString("${year}010100:00:00");
+ ($date)=&ParseRecur($key,$tmp,$tmp,($year+1)."-01-01");
+ next if (! $date);
+
+ } elsif ($key =~ /^(.*)([+-].*)$/) {
+ # Date +/- Delta
+ ($date,$delta)=($1,$2);
+ $tmp=&ParseDateString("$date $year");
+ if ($tmp) {
+ $date=$tmp;
+ } else {
+ $date=&ParseDateString($date);
+ next if ($date !~ /^$year/);
+ }
+ $date=&DateCalc($date,$delta,\$err,0);
+
+ } else {
+ # Date
+ $date=$key;
+ $tmp=&ParseDateString("$date $year");
+ if ($tmp) {
+ $date=$tmp;
+ } else {
+ $date=&ParseDateString($date);
+ next if ($date !~ /^$year/);
+ }
+ }
+ $Holiday{"dates"}{$year}{$date}=$Holiday{"desc"}{$key};
+ }
+}
+
+# This sets a Date::Manip config variable.
+sub Date_SetConfigVariable {
+ print "DEBUG: Date_SetConfigVariable\n" if ($Curr{"Debug"} =~ /trace/);
+ my($var,$val)=@_;
+
+ # These are most appropriate for command line options instead of in files.
+ $Cnf{"PathSep"}=$val, return if ($var =~ /^PathSep$/i);
+ $Cnf{"PersonalCnf"}=$val, return if ($var =~ /^PersonalCnf$/i);
+ $Cnf{"PersonalCnfPath"}=$val, return if ($var =~ /^PersonalCnfPath$/i);
+ &EraseHolidays(), return if ($var =~ /^EraseHolidays$/i);
+ $Cnf{"IgnoreGlobalCnf"}=1, return if ($var =~ /^IgnoreGlobalCnf$/i);
+ $Cnf{"GlobalCnf"}=$val, return if ($var =~ /^GlobalCnf$/i);
+
+ $Curr{"InitLang"}=1,
+ $Cnf{"Language"}=$val, return if ($var =~ /^Language$/i);
+ $Cnf{"DateFormat"}=$val, return if ($var =~ /^DateFormat$/i);
+ $Cnf{"TZ"}=$val, return if ($var =~ /^TZ$/i);
+ $Cnf{"ConvTZ"}=$val, return if ($var =~ /^ConvTZ$/i);
+ $Cnf{"Internal"}=$val, return if ($var =~ /^Internal$/i);
+ $Cnf{"FirstDay"}=$val, return if ($var =~ /^FirstDay$/i);
+ $Cnf{"WorkWeekBeg"}=$val, return if ($var =~ /^WorkWeekBeg$/i);
+ $Cnf{"WorkWeekEnd"}=$val, return if ($var =~ /^WorkWeekEnd$/i);
+ $Cnf{"WorkDayBeg"}=$val,
+ $Curr{"ResetWorkDay"}=1, return if ($var =~ /^WorkDayBeg$/i);
+ $Cnf{"WorkDayEnd"}=$val,
+ $Curr{"ResetWorkDay"}=1, return if ($var =~ /^WorkDayEnd$/i);
+ $Cnf{"WorkDay24Hr"}=$val,
+ $Curr{"ResetWorkDay"}=1, return if ($var =~ /^WorkDay24Hr$/i);
+ $Cnf{"DeltaSigns"}=$val, return if ($var =~ /^DeltaSigns$/i);
+ $Cnf{"Jan1Week1"}=$val, return if ($var =~ /^Jan1Week1$/i);
+ $Cnf{"YYtoYYYY"}=$val, return if ($var =~ /^YYtoYYYY$/i);
+ $Cnf{"UpdateCurrTZ"}=$val, return if ($var =~ /^UpdateCurrTZ$/i);
+ $Cnf{"IntCharSet"}=$val, return if ($var =~ /^IntCharSet$/i);
+ $Curr{"DebugVal"}=$val, return if ($var =~ /^Debug$/i);
+ $Cnf{"TomorrowFirst"}=$val, return if ($var =~ /^TomorrowFirst$/i);
+ $Cnf{"ForceDate"}=$val, return if ($var =~ /^ForceDate$/i);
+
+ confess "ERROR: Unknown configuration variable $var in Date::Manip.\n";
+}
+
+sub EraseHolidays {
+ print "DEBUG: EraseHolidays\n" if ($Curr{"Debug"} =~ /trace/);
+
+ $Cnf{"EraseHolidays"}=0;
+ delete $Holiday{"list"};
+ $Holiday{"list"}={};
+ delete $Holiday{"desc"};
+ $Holiday{"desc"}={};
+ $Holiday{"dates"}={};
+}
+
+# This returns a pointer to a list of times and events in the format
+# [ date, [ events ], date, [ events ], ... ]
+# where each list of events are events that are in effect at the date
+# immediately preceding the list.
+#
+# This takes either one date or two dates as arguments.
+sub Events_Calc {
+ print "DEBUG: Events_Calc\n" if ($Curr{"Debug"} =~ /trace/);
+
+ my($date0,$date1)=@_;
+
+ my($tmp);
+ $date0=&ParseDateString($date0);
+ return undef if (! $date0);
+ if ($date1) {
+ $date1=&ParseDateString($date1);
+ if (&Date_Cmp($date0,$date1)>0) {
+ $tmp=$date1;
+ $date1=$date0;
+ $date0=$tmp;
+ }
+ } else {
+ $date1=&DateCalc_DateDelta($date0,"+0:0:0:0:0:0:1");
+ }
+
+ #
+ # [ d0,d1,del,name ] => [ d0, d1+del )
+ # [ d0,0,del,name ] => [ d0, d0+del )
+ #
+ my(%ret,$d0,$d1,$del,$name,$c0,$c1);
+ my(@tmp)=@{ $Events{"dates"} };
+ DATE: while (@tmp) {
+ ($d0,$d1,$del,$name)=splice(@tmp,0,4);
+ $d0=&ParseDateString($d0);
+ $d1=&ParseDateString($d1) if ($d1);
+ $del=&ParseDateDelta($del) if ($del);
+ if ($d1) {
+ if ($del) {
+ $d1=&DateCalc_DateDelta($d1,$del);
+ }
+ } else {
+ $d1=&DateCalc_DateDelta($d0,$del);
+ }
+ if (&Date_Cmp($d0,$d1)>0) {
+ $tmp=$d1;
+ $d1=$d0;
+ $d0=$tmp;
+ }
+ # [ date0,date1 )
+ # [ d0,d1 ) OR [ d0,d1 )
+ next DATE if (&Date_Cmp($d1,$date0)<=0 ||
+ &Date_Cmp($d0,$date1)>=0);
+ # [ date0,date1 )
+ # [ d0,d1 )
+ # [ d0, d1 )
+ if (&Date_Cmp($d0,$date0)<=0) {
+ push @{ $ret{$date0} },$name;
+ push @{ $ret{$d1} },"!$name" if (&Date_Cmp($d1,$date1)<0);
+ next DATE;
+ }
+ # [ date0,date1 )
+ # [ d0,d1 )
+ if (&Date_Cmp($d1,$date1)>=0) {
+ push @{ $ret{$d0} },$name;
+ next DATE;
+ }
+ # [ date0,date1 )
+ # [ d0,d1 )
+ push @{ $ret{$d0} },$name;
+ push @{ $ret{$d1} },"!$name";
+ }
+
+ #
+ # [ recur,delta0,delta1,name ] => [ {date-delta0},{date+delta1} )
+ #
+ my($rec,$del0,$del1,@d);
+ @tmp=@{ $Events{"recur"} };
+ RECUR: while (@tmp) {
+ ($rec,$del0,$del1,$name)=splice(@tmp,0,4);
+ @d=();
+
+ }
+
+ # Sort them AND take into account the "!$name" entries.
+ my(%tmp,$date,@tmp2,@ret);
+ @d=sort { &Date_Cmp($a,$b) } keys %ret;
+ foreach $date (@d) {
+ @tmp=@{ $ret{$date} };
+ @tmp2=();
+ foreach $tmp (@tmp) {
+ push(@tmp2,$tmp), next if ($tmp =~ /^!/);
+ $tmp{$tmp}=1;
+ }
+ foreach $tmp (@tmp2) {
+ $tmp =~ s/^!//;
+ delete $tmp{$tmp};
+ }
+ push(@ret,$date,[ keys %tmp ]);
+ }
+
+ return \@ret;
+}
+
+# This parses the raw events list
+sub Events_ParseRaw {
+ print "DEBUG: Events_ParseRaw\n" if ($Curr{"Debug"} =~ /trace/);
+
+ # Only need to be parsed once
+ my($force)=@_;
+ $Events{"parsed"}=0 if ($force);
+ return if ($Events{"parsed"});
+ $Events{"parsed"}=1;
+
+ my(@events)=@{ $Events{"raw"} };
+ my($event,$name,@event,$date0,$date1,$tmp,$delta,$recur0,$recur1,@recur,$r,
+ $recur);
+ EVENT: while (@events) {
+ ($event,$name)=splice(@events,0,2);
+ @event=split(/\s*;\s*/,$event);
+
+ if ($#event == 0) {
+
+ if ($date0=&ParseDateString($event[0])) {
+ #
+ # date = event
+ #
+ $tmp=&ParseDateString("$event[0] 00:00:00");
+ if ($tmp && $tmp eq $date0) {
+ $delta="+0:0:0:1:0:0:0";
+ } else {
+ $delta="+0:0:0:0:1:0:0";
+ }
+ push @{ $Events{"dates"} },($date0,0,$delta,$name);
+
+ } elsif ($recur=&ParseRecur($event[0])) {
+ #
+ # recur = event
+ #
+ ($recur0,$recur1)=&Recur_Split($recur);
+ if ($recur0) {
+ if ($recur1) {
+ $r="$recur0:$recur1";
+ } else {
+ $r=$recur0;
+ }
+ } else {
+ $r=$recur1;
+ }
+ (@recur)=split(/:/,$r);
+ if (pop(@recur)==0 && pop(@recur)==0 && pop(@recur)==0) {
+ $delta="+0:0:0:1:0:0:0";
+ } else {
+ $delta="+0:0:0:0:1:0:0";
+ }
+ push @{ $Events{"recur"} },($recur,0,$delta,$name);
+
+ } else {
+ # ??? = event
+ warn "WARNING: illegal event ignored [ @event ]\n";
+ next EVENT;
+ }
+
+ } elsif ($#event == 1) {
+
+ if ($date0=&ParseDateString($event[0])) {
+
+ if ($date1=&ParseDateString($event[1])) {
+ #
+ # date ; date = event
+ #
+ $tmp=&ParseDateString("$event[1] 00:00:00");
+ if ($tmp && $tmp eq $date1) {
+ $date1=&DateCalc_DateDelta($date1,"+0:0:0:1:0:0:0");
+ }
+ push @{ $Events{"dates"} },($date0,$date1,0,$name);
+
+ } elsif ($delta=&ParseDateDelta($event[1])) {
+ #
+ # date ; delta = event
+ #
+ push @{ $Events{"dates"} },($date0,0,$delta,$name);
+
+ } else {
+ # date ; ??? = event
+ warn "WARNING: illegal event ignored [ @event ]\n";
+ next EVENT;
+ }
+
+ } elsif ($recur=&ParseRecur($event[0])) {
+
+ if ($delta=&ParseDateDelta($event[1])) {
+ #
+ # recur ; delta = event
+ #
+ push @{ $Events{"recur"} },($recur,0,$delta,$name);
+
+ } else {
+ # recur ; ??? = event
+ warn "WARNING: illegal event ignored [ @event ]\n";
+ next EVENT;
+ }
+
+ } else {
+ # ??? ; ??? = event
+ warn "WARNING: illegal event ignored [ @event ]\n";
+ next EVENT;
+ }
+
+ } else {
+ # date ; delta0 ; delta1 = event
+ # recur ; delta0 ; delta1 = event
+ # ??? ; ??? ; ??? ... = event
+ warn "WARNING: illegal event ignored [ @event ]\n";
+ next EVENT;
+ }
+ }
+}
+
+# This reads an init file.
+sub Date_InitFile {
+ print "DEBUG: Date_InitFile\n" if ($Curr{"Debug"} =~ /trace/);
+ my($file)=@_;
+ my($in)=new IO::File;
+ local($_)=();
+ my($section)="vars";
+ my($var,$val,$recur,$name)=();
+
+ $in->open($file) || return;
+ while(defined ($_=<$in>)) {
+ chomp;
+ s/^\s+//;
+ s/\s+$//;
+ next if (! $_ or /^\#/);
+
+ if (/^\*holiday/i) {
+ $section="holiday";
+ &EraseHolidays() if ($section =~ /holiday/i && $Cnf{"EraseHolidays"});
+ next;
+ } elsif (/^\*events/i) {
+ $section="events";
+ next;
+ }
+
+ if ($section =~ /var/i) {
+ confess "ERROR: invalid Date::Manip config file line.\n $_\n"
+ if (! /(.*\S)\s*=\s*(.*)$/);
+ ($var,$val)=($1,$2);
+ &Date_SetConfigVariable($var,$val);
+
+ } elsif ($section =~ /holiday/i) {
+ confess "ERROR: invalid Date::Manip config file line.\n $_\n"
+ if (! /(.*\S)\s*=\s*(.*)$/);
+ ($recur,$name)=($1,$2);
+ $name="" if (! defined $name);
+ $Holiday{"desc"}{$recur}=$name;
+
+ } elsif ($section =~ /events/i) {
+ confess "ERROR: invalid Date::Manip config file line.\n $_\n"
+ if (! /(.*\S)\s*=\s*(.*)$/);
+ ($val,$var)=($1,$2);
+ push @{ $Events{"raw"} },($val,$var);
+
+ } else {
+ # A section not currently used by Date::Manip (but may be
+ # used by some extension to it).
+ next;
+ }
+ }
+ close($in);
+}
+
+# $flag=&Date_TimeCheck(\$h,\$mn,\$s,\$ampm);
+# Returns 1 if any of the fields are bad. All fields are optional, and
+# all possible checks are done on the data. If a field is not passed in,
+# it is set to default values. If data is missing, appropriate defaults
+# are supplied.
+sub Date_TimeCheck {
+ print "DEBUG: Date_TimeCheck\n" if ($Curr{"Debug"} =~ /trace/);
+ my($h,$mn,$s,$ampm)=@_;
+ my($tmp1,$tmp2,$tmp3)=();
+
+ $$h="" if (! defined $$h);
+ $$mn="" if (! defined $$mn);
+ $$s="" if (! defined $$s);
+ $$ampm="" if (! defined $$ampm);
+ $$ampm=uc($$ampm) if ($$ampm);
+
+ # Check hour
+ $tmp1=$Lang{$Cnf{"Language"}}{"AmPm"};
+ $tmp2="";
+ if ($$ampm =~ /^$tmp1$/i) {
+ $tmp3=$Lang{$Cnf{"Language"}}{"AM"};
+ $tmp2="AM" if ($$ampm =~ /^$tmp3$/i);
+ $tmp3=$Lang{$Cnf{"Language"}}{"PM"};
+ $tmp2="PM" if ($$ampm =~ /^$tmp3$/i);
+ } elsif ($$ampm) {
+ return 1;
+ }
+ if ($tmp2 eq "AM" || $tmp2 eq "PM") {
+ $$h="0$$h" if (length($$h)==1);
+ return 1 if ($$h<1 || $$h>12);
+ $$h="00" if ($tmp2 eq "AM" and $$h==12);
+ $$h += 12 if ($tmp2 eq "PM" and $$h!=12);
+ } else {
+ $$h="00" if ($$h eq "");
+ $$h="0$$h" if (length($$h)==1);
+ return 1 if (! &IsInt($$h,0,23));
+ $tmp2="AM" if ($$h<12);
+ $tmp2="PM" if ($$h>=12);
+ }
+ $$ampm=$Lang{$Cnf{"Language"}}{"AMstr"};
+ $$ampm=$Lang{$Cnf{"Language"}}{"PMstr"} if ($tmp2 eq "PM");
+
+ # Check minutes
+ $$mn="00" if ($$mn eq "");
+ $$mn="0$$mn" if (length($$mn)==1);
+ return 1 if (! &IsInt($$mn,0,59));
+
+ # Check seconds
+ $$s="00" if ($$s eq "");
+ $$s="0$$s" if (length($$s)==1);
+ return 1 if (! &IsInt($$s,0,59));
+
+ return 0;
+}
+
+# $flag=&Date_DateCheck(\$y,\$m,\$d,\$h,\$mn,\$s,\$ampm,\$wk);
+# Returns 1 if any of the fields are bad. All fields are optional, and
+# all possible checks are done on the data. If a field is not passed in,
+# it is set to default values. If data is missing, appropriate defaults
+# are supplied.
+#
+# If the flag UpdateHolidays is set, the year is set to
+# CurrHolidayYear.
+sub Date_DateCheck {
+ print "DEBUG: Date_DateCheck\n" if ($Curr{"Debug"} =~ /trace/);
+ my($y,$m,$d,$h,$mn,$s,$ampm,$wk)=@_;
+ my($tmp1,$tmp2,$tmp3)=();
+
+ my(@d_in_m)=(0,31,28,31,30,31,30,31,31,30,31,30,31);
+ my($curr_y)=$Curr{"Y"};
+ my($curr_m)=$Curr{"M"};
+ my($curr_d)=$Curr{"D"};
+ $$m=1, $$d=1 if (defined $$y and ! defined $$m and ! defined $$d);
+ $$y="" if (! defined $$y);
+ $$m="" if (! defined $$m);
+ $$d="" if (! defined $$d);
+ $$wk="" if (! defined $$wk);
+ $$d=$curr_d if ($$y eq "" and $$m eq "" and $$d eq "");
+
+ # Check year.
+ $$y=$curr_y if ($$y eq "");
+ $$y=&Date_FixYear($$y) if (length($$y)<4);
+ return 1 if (! &IsInt($$y,0,9999));
+ $d_in_m[2]=29 if (&Date_LeapYear($$y));
+
+ # Check month
+ $$m=$curr_m if ($$m eq "");
+ $$m=$Lang{$Cnf{"Language"}}{"MonthH"}{lc($$m)}
+ if (exists $Lang{$Cnf{"Language"}}{"MonthH"}{lc($$m)});
+ $$m="0$$m" if (length($$m)==1);
+ return 1 if (! &IsInt($$m,1,12));
+
+ # Check day
+ $$d="01" if ($$d eq "");
+ $$d="0$$d" if (length($$d)==1);
+ return 1 if (! &IsInt($$d,1,$d_in_m[$$m]));
+ if ($$wk) {
+ $tmp1=&Date_DayOfWeek($$m,$$d,$$y);
+ $tmp2=$Lang{$Cnf{"Language"}}{"WeekH"}{lc($$wk)}
+ if (exists $Lang{$Cnf{"Language"}}{"WeekH"}{lc($$wk)});
+ return 1 if ($tmp1 != $tmp2);
+ }
+
+ return &Date_TimeCheck($h,$mn,$s,$ampm);
+}
+
+# Takes a year in 2 digit form and returns it in 4 digit form
+sub Date_FixYear {
+ print "DEBUG: Date_FixYear\n" if ($Curr{"Debug"} =~ /trace/);
+ my($y)=@_;
+ my($curr_y)=$Curr{"Y"};
+ $y=$curr_y if (! defined $y or ! $y);
+ return $y if (length($y)==4);
+ confess "ERROR: Invalid year ($y)\n" if (length($y)!=2);
+ my($y1,$y2)=();
+
+ if (lc($Cnf{"YYtoYYYY"}) eq "c") {
+ $y1=substring($y,0,2);
+ $y="$y1$y";
+
+ } elsif ($Cnf{"YYtoYYYY"} =~ /^c(\d{2})$/i) {
+ $y1=$1;
+ $y="$y1$y";
+
+ } elsif ($Cnf{"YYtoYYYY"} =~ /^c(\d{2})(\d{2})$/i) {
+ $y1="$1$2";
+ $y ="$1$y";
+ $y += 100 if ($y<$y1);
+
+ } else {
+ $y1=$curr_y-$Cnf{"YYtoYYYY"};
+ $y2=$y1+99;
+ $y="19$y";
+ while ($y<$y1) {
+ $y+=100;
+ }
+ while ($y>$y2) {
+ $y-=100;
+ }
+ }
+ $y;
+}
+
+# &Date_NthWeekOfYear($y,$n);
+# Returns a list of (YYYY,MM,DD) for the 1st day of the Nth week of the
+# year.
+# &Date_NthWeekOfYear($y,$n,$dow,$flag);
+# Returns a list of (YYYY,MM,DD) for the Nth DoW of the year. If flag
+# is nil, the first DoW of the year may actually be in the previous
+# year (since the 1st week may include days from the previous year).
+# If flag is non-nil, the 1st DoW of the year refers to the 1st one
+# actually in the year
+sub Date_NthWeekOfYear {
+ print "DEBUG: Date_NthWeekOfYear\n" if ($Curr{"Debug"} =~ /trace/);
+ my($y,$n,$dow,$flag)=@_;
+ my($m,$d,$err,$tmp,$date,%dow)=();
+ $y=$Curr{"Y"} if (! defined $y or ! $y);
+ $n=1 if (! defined $n or $n eq "");
+ return () if ($n<0 || $n>53);
+ if (defined $dow) {
+ $dow=lc($dow);
+ %dow=%{ $Lang{$Cnf{"Language"}}{"WeekH"} };
+ $dow=$dow{$dow} if (exists $dow{$dow});
+ return () if ($dow<1 || $dow>7);
+ $flag="" if (! defined $flag);
+ } else {
+ $dow="";
+ $flag="";
+ }
+
+ $y=&Date_FixYear($y) if (length($y)<4);
+ if ($Cnf{"Jan1Week1"}) {
+ $date=&Date_Join($y,1,1,0,0,0);
+ } else {
+ $date=&Date_Join($y,1,4,0,0,0);
+ }
+ $date=&Date_GetPrev($date,$Cnf{"FirstDay"},1);
+ $date=&Date_GetNext($date,$dow,1) if ($dow ne "");
+
+ if ($flag) {
+ ($tmp)=&Date_Split($date, 1);
+ $n++ if ($tmp != $y);
+ }
+
+ if ($n>1) {
+ $date=&DateCalc_DateDelta($date,"+0:0:". ($n-1) . ":0:0:0:0",\$err,0);
+ } elsif ($n==0) {
+ $date=&DateCalc_DateDelta($date,"-0:0:1:0:0:0:0",\$err,0);
+ }
+ ($y,$m,$d)=&Date_Split($date, 1);
+ ($y,$m,$d);
+}
+
+########################################################################
+# LANGUAGE INITIALIZATION
+########################################################################
+
+# 8-bit international characters can be gotten by "\xXX". I don't know
+# how to get 16-bit characters. I've got to read up on perllocale.
+sub Char_8Bit {
+ my($hash)=@_;
+
+ # grave `
+ # A` 00c0 a` 00e0
+ # E` 00c8 e` 00e8
+ # I` 00cc i` 00ec
+ # O` 00d2 o` 00f2
+ # U` 00d9 u` 00f9
+ # W` 1e80 w` 1e81
+ # Y` 1ef2 y` 1ef3
+
+ $$hash{"A`"} = "\xc0"; # LATIN CAPITAL LETTER A WITH GRAVE
+ $$hash{"E`"} = "\xc8"; # LATIN CAPITAL LETTER E WITH GRAVE
+ $$hash{"I`"} = "\xcc"; # LATIN CAPITAL LETTER I WITH GRAVE
+ $$hash{"O`"} = "\xd2"; # LATIN CAPITAL LETTER O WITH GRAVE
+ $$hash{"U`"} = "\xd9"; # LATIN CAPITAL LETTER U WITH GRAVE
+ $$hash{"a`"} = "\xe0"; # LATIN SMALL LETTER A WITH GRAVE
+ $$hash{"e`"} = "\xe8"; # LATIN SMALL LETTER E WITH GRAVE
+ $$hash{"i`"} = "\xec"; # LATIN SMALL LETTER I WITH GRAVE
+ $$hash{"o`"} = "\xf2"; # LATIN SMALL LETTER O WITH GRAVE
+ $$hash{"u`"} = "\xf9"; # LATIN SMALL LETTER U WITH GRAVE
+
+ # acute '
+ # A' 00c1 a' 00e1
+ # C' 0106 c' 0107
+ # E' 00c9 e' 00e9
+ # I' 00cd i' 00ed
+ # L' 0139 l' 013a
+ # N' 0143 n' 0144
+ # O' 00d3 o' 00f3
+ # R' 0154 r' 0155
+ # S' 015a s' 015b
+ # U' 00da u' 00fa
+ # W' 1e82 w' 1e83
+ # Y' 00dd y' 00fd
+ # Z' 0179 z' 017a
+
+ $$hash{"A'"} = "\xc1"; # LATIN CAPITAL LETTER A WITH ACUTE
+ $$hash{"E'"} = "\xc9"; # LATIN CAPITAL LETTER E WITH ACUTE
+ $$hash{"I'"} = "\xcd"; # LATIN CAPITAL LETTER I WITH ACUTE
+ $$hash{"O'"} = "\xd3"; # LATIN CAPITAL LETTER O WITH ACUTE
+ $$hash{"U'"} = "\xda"; # LATIN CAPITAL LETTER U WITH ACUTE
+ $$hash{"Y'"} = "\xdd"; # LATIN CAPITAL LETTER Y WITH ACUTE
+ $$hash{"a'"} = "\xe1"; # LATIN SMALL LETTER A WITH ACUTE
+ $$hash{"e'"} = "\xe9"; # LATIN SMALL LETTER E WITH ACUTE
+ $$hash{"i'"} = "\xed"; # LATIN SMALL LETTER I WITH ACUTE
+ $$hash{"o'"} = "\xf3"; # LATIN SMALL LETTER O WITH ACUTE
+ $$hash{"u'"} = "\xfa"; # LATIN SMALL LETTER U WITH ACUTE
+ $$hash{"y'"} = "\xfd"; # LATIN SMALL LETTER Y WITH ACUTE
+
+ # double acute " "
+ # O" 0150 o" 0151
+ # U" 0170 u" 0171
+
+ # circumflex ^
+ # A^ 00c2 a^ 00e2
+ # C^ 0108 c^ 0109
+ # E^ 00ca e^ 00ea
+ # G^ 011c g^ 011d
+ # H^ 0124 h^ 0125
+ # I^ 00ce i^ 00ee
+ # J^ 0134 j^ 0135
+ # O^ 00d4 o^ 00f4
+ # S^ 015c s^ 015d
+ # U^ 00db u^ 00fb
+ # W^ 0174 w^ 0175
+ # Y^ 0176 y^ 0177
+
+ $$hash{"A^"} = "\xc2"; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+ $$hash{"E^"} = "\xca"; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+ $$hash{"I^"} = "\xce"; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+ $$hash{"O^"} = "\xd4"; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+ $$hash{"U^"} = "\xdb"; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+ $$hash{"a^"} = "\xe2"; # LATIN SMALL LETTER A WITH CIRCUMFLEX
+ $$hash{"e^"} = "\xea"; # LATIN SMALL LETTER E WITH CIRCUMFLEX
+ $$hash{"i^"} = "\xee"; # LATIN SMALL LETTER I WITH CIRCUMFLEX
+ $$hash{"o^"} = "\xf4"; # LATIN SMALL LETTER O WITH CIRCUMFLEX
+ $$hash{"u^"} = "\xfb"; # LATIN SMALL LETTER U WITH CIRCUMFLEX
+
+ # tilde ~
+ # A~ 00c3 a~ 00e3
+ # I~ 0128 i~ 0129
+ # N~ 00d1 n~ 00f1
+ # O~ 00d5 o~ 00f5
+ # U~ 0168 u~ 0169
+
+ $$hash{"A~"} = "\xc3"; # LATIN CAPITAL LETTER A WITH TILDE
+ $$hash{"N~"} = "\xd1"; # LATIN CAPITAL LETTER N WITH TILDE
+ $$hash{"O~"} = "\xd5"; # LATIN CAPITAL LETTER O WITH TILDE
+ $$hash{"a~"} = "\xe3"; # LATIN SMALL LETTER A WITH TILDE
+ $$hash{"n~"} = "\xf1"; # LATIN SMALL LETTER N WITH TILDE
+ $$hash{"o~"} = "\xf5"; # LATIN SMALL LETTER O WITH TILDE
+
+ # macron -
+ # A- 0100 a- 0101
+ # E- 0112 e- 0113
+ # I- 012a i- 012b
+ # O- 014c o- 014d
+ # U- 016a u- 016b
+
+ # breve ( [half circle up]
+ # A( 0102 a( 0103
+ # G( 011e g( 011f
+ # U( 016c u( 016d
+
+ # dot .
+ # C. 010a c. 010b
+ # E. 0116 e. 0117
+ # G. 0120 g. 0121
+ # I. 0130
+ # Z. 017b z. 017c
+
+ # diaeresis : [side by side dots]
+ # A: 00c4 a: 00e4
+ # E: 00cb e: 00eb
+ # I: 00cf i: 00ef
+ # O: 00d6 o: 00f6
+ # U: 00dc u: 00fc
+ # W: 1e84 w: 1e85
+ # Y: 0178 y: 00ff
+
+ $$hash{"A:"} = "\xc4"; # LATIN CAPITAL LETTER A WITH DIAERESIS
+ $$hash{"E:"} = "\xcb"; # LATIN CAPITAL LETTER E WITH DIAERESIS
+ $$hash{"I:"} = "\xcf"; # LATIN CAPITAL LETTER I WITH DIAERESIS
+ $$hash{"O:"} = "\xd6"; # LATIN CAPITAL LETTER O WITH DIAERESIS
+ $$hash{"U:"} = "\xdc"; # LATIN CAPITAL LETTER U WITH DIAERESIS
+ $$hash{"a:"} = "\xe4"; # LATIN SMALL LETTER A WITH DIAERESIS
+ $$hash{"e:"} = "\xeb"; # LATIN SMALL LETTER E WITH DIAERESIS
+ $$hash{"i:"} = "\xef"; # LATIN SMALL LETTER I WITH DIAERESIS
+ $$hash{"o:"} = "\xf6"; # LATIN SMALL LETTER O WITH DIAERESIS
+ $$hash{"u:"} = "\xfc"; # LATIN SMALL LETTER U WITH DIAERESIS
+ $$hash{"y:"} = "\xff"; # LATIN SMALL LETTER Y WITH DIAERESIS
+
+ # ring o
+ # U0 016e u0 016f
+
+ # cedilla , [squiggle down and left below the letter]
+ # ,C 00c7 ,c 00e7
+ # ,G 0122 ,g 0123
+ # ,K 0136 ,k 0137
+ # ,L 013b ,l 013c
+ # ,N 0145 ,n 0146
+ # ,R 0156 ,r 0157
+ # ,S 015e ,s 015f
+ # ,T 0162 ,t 0163
+
+ $$hash{",C"} = "\xc7"; # LATIN CAPITAL LETTER C WITH CEDILLA
+ $$hash{",c"} = "\xe7"; # LATIN SMALL LETTER C WITH CEDILLA
+
+ # ogonek ; [squiggle down and right below the letter]
+ # A; 0104 a; 0105
+ # E; 0118 e; 0119
+ # I; 012e i; 012f
+ # U; 0172 u; 0173
+
+ # caron < [little v on top]
+ # A< 01cd a< 01ce
+ # C< 010c c< 010d
+ # D< 010e d< 010f
+ # E< 011a e< 011b
+ # L< 013d l< 013e
+ # N< 0147 n< 0148
+ # R< 0158 r< 0159
+ # S< 0160 s< 0161
+ # T< 0164 t< 0165
+ # Z< 017d z< 017e
+
+
+ # Other characters
+
+ # First character is below, 2nd character is above
+ $$hash{"||"} = "\xa6"; # BROKEN BAR
+ $$hash{" :"} = "\xa8"; # DIAERESIS
+ $$hash{"-a"} = "\xaa"; # FEMININE ORDINAL INDICATOR
+ #$$hash{" -"}= "\xaf"; # MACRON (narrow bar)
+ $$hash{" -"} = "\xad"; # HYPHEN (wide bar)
+ $$hash{" o"} = "\xb0"; # DEGREE SIGN
+ $$hash{"-+"} = "\xb1"; # PLUS\342\200\220MINUS SIGN
+ $$hash{" 1"} = "\xb9"; # SUPERSCRIPT ONE
+ $$hash{" 2"} = "\xb2"; # SUPERSCRIPT TWO
+ $$hash{" 3"} = "\xb3"; # SUPERSCRIPT THREE
+ $$hash{" '"} = "\xb4"; # ACUTE ACCENT
+ $$hash{"-o"} = "\xba"; # MASCULINE ORDINAL INDICATOR
+ $$hash{" ."} = "\xb7"; # MIDDLE DOT
+ $$hash{", "} = "\xb8"; # CEDILLA
+ $$hash{"Ao"} = "\xc5"; # LATIN CAPITAL LETTER A WITH RING ABOVE
+ $$hash{"ao"} = "\xe5"; # LATIN SMALL LETTER A WITH RING ABOVE
+ $$hash{"ox"} = "\xf0"; # LATIN SMALL LETTER ETH
+
+ # upside down characters
+
+ $$hash{"ud!"} = "\xa1"; # INVERTED EXCLAMATION MARK
+ $$hash{"ud?"} = "\xbf"; # INVERTED QUESTION MARK
+
+ # overlay characters
+
+ $$hash{"X o"} = "\xa4"; # CURRENCY SIGN
+ $$hash{"Y ="} = "\xa5"; # YEN SIGN
+ $$hash{"S o"} = "\xa7"; # SECTION SIGN
+ $$hash{"O c"} = "\xa9"; # COPYRIGHT SIGN Copyright
+ $$hash{"O R"} = "\xae"; # REGISTERED SIGN
+ $$hash{"D -"} = "\xd0"; # LATIN CAPITAL LETTER ETH
+ $$hash{"O /"} = "\xd8"; # LATIN CAPITAL LETTER O WITH STROKE
+ $$hash{"o /"} = "\xf8"; # LATIN SMALL LETTER O WITH STROKE
+
+ # special names
+
+ $$hash{"1/4"} = "\xbc"; # VULGAR FRACTION ONE QUARTER
+ $$hash{"1/2"} = "\xbd"; # VULGAR FRACTION ONE HALF
+ $$hash{"3/4"} = "\xbe"; # VULGAR FRACTION THREE QUARTERS
+ $$hash{"<<"} = "\xab"; # LEFT POINTING DOUBLE ANGLE QUOTATION MARK
+ $$hash{">>"} = "\xbb"; # RIGHT POINTING DOUBLE ANGLE QUOTATION MARK
+ $$hash{"cent"}= "\xa2"; # CENT SIGN
+ $$hash{"lb"} = "\xa3"; # POUND SIGN
+ $$hash{"mu"} = "\xb5"; # MICRO SIGN
+ $$hash{"beta"}= "\xdf"; # LATIN SMALL LETTER SHARP S
+ $$hash{"para"}= "\xb6"; # PILCROW SIGN
+ $$hash{"-|"} = "\xac"; # NOT SIGN
+ $$hash{"AE"} = "\xc6"; # LATIN CAPITAL LETTER AE
+ $$hash{"ae"} = "\xe6"; # LATIN SMALL LETTER AE
+ $$hash{"x"} = "\xd7"; # MULTIPLICATION SIGN
+ $$hash{"P"} = "\xde"; # LATIN CAPITAL LETTER THORN
+ $$hash{"/"} = "\xf7"; # DIVISION SIGN
+ $$hash{"p"} = "\xfe"; # LATIN SMALL LETTER THORN
+}
+
+# $hashref = &Date_Init_LANGUAGE;
+# This returns a hash containing all of the initialization for a
+# specific language. The hash elements are:
+#
+# @ month_name full month names January February ...
+# @ month_abb month abbreviations Jan Feb ...
+# @ day_name day names Monday Tuesday ...
+# @ day_abb day abbreviations Mon Tue ...
+# @ day_char day character abbrevs M T ...
+# @ am AM notations
+# @ pm PM notations
+#
+# @ num_suff number with suffix 1st 2nd ...
+# @ num_word numbers spelled out first second ...
+#
+# $ now words which mean now now today ...
+# $ last words which mean last last final ...
+# $ each words which mean each each every ...
+# $ of of (as in a member of) in of ...
+# ex. 4th day OF June
+# $ at at 4:00 at
+# $ on on Sunday on
+# $ future in the future in
+# $ past in the past ago
+# $ next next item next
+# $ prev previous item last previous
+# $ later 2 hours later
+#
+# % offset a hash of special dates { tomorrow->0:0:0:1:0:0:0 }
+# % times a hash of times { noon->12:00:00 ... }
+#
+# $ years words for year y yr year ...
+# $ months words for month
+# $ weeks words for week
+# $ days words for day
+# $ hours words for hour
+# $ minutes words for minute
+# $ seconds words for second
+# % replace
+# The replace element is quite important, but a bit tricky. In
+# English (and probably other languages), one of the abbreviations
+# for the word month that would be nice is "m". The problem is that
+# "m" matches the "m" in "minute" which causes the string to be
+# improperly matched in some cases. Hence, the list of abbreviations
+# for month is given as:
+# "mon month months"
+# In order to allow you to enter "m", replacements can be done.
+# $replace is a list of pairs of words which are matched and replaced
+# AS ENTIRE WORDS. Having $replace equal to "m"->"month" means that
+# the entire word "m" will be replaced with "month". This allows the
+# desired abbreviation to be used. Make sure that replace contains
+# an even number of words (i.e. all must be pairs). Any time a
+# desired abbreviation matches the start of any other, it has to go
+# here.
+#
+# $ exact exact mode exactly
+# $ approx approximate mode approximately
+# $ business business mode business
+#
+# r sephm hour/minute separator (?::)
+# r sepms minute/second separator (?::)
+# r sepss second/fraction separator (?:[.:])
+#
+# Elements marked with an asterix (@) are returned as a set of lists.
+# Each list contains the strings for each element. The first set is used
+# when the 7-bit ASCII (US) character set is wanted. The 2nd set is used
+# when an international character set is available. Both of the 1st two
+# sets should be complete (but the 2nd list can be left empty to force the
+# first set to be used always). The 3rd set and later can be partial sets
+# if desired.
+#
+# Elements marked with a dollar ($) are returned as a simple list of words.
+#
+# Elements marked with a percent (%) are returned as a hash list.
+#
+# Elements marked with (r) are regular expression elements which must not
+# create a back reference.
+#
+# ***NOTE*** Every hash element (unless otherwise noted) MUST be defined in
+# every language.
+
+sub Date_Init_English {
+ print "DEBUG: Date_Init_English\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+
+ $$d{"month_name"}=
+ [["January","February","March","April","May","June",
+ "July","August","September","October","November","December"]];
+
+ $$d{"month_abb"}=
+ [["Jan","Feb","Mar","Apr","May","Jun",
+ "Jul","Aug","Sep","Oct","Nov","Dec"],
+ [],
+ ["","","","","","","","","Sept"]];
+
+ $$d{"day_name"}=
+ [["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]];
+ $$d{"day_abb"}=
+ [["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],
+ ["", "Tues","", "Thur","", "", ""]];
+ $$d{"day_char"}=
+ [["M","T","W","Th","F","Sa","S"]];
+
+ $$d{"num_suff"}=
+ [["1st","2nd","3rd","4th","5th","6th","7th","8th","9th","10th",
+ "11th","12th","13th","14th","15th","16th","17th","18th","19th","20th",
+ "21st","22nd","23rd","24th","25th","26th","27th","28th","29th","30th",
+ "31st"]];
+ $$d{"num_word"}=
+ [["first","second","third","fourth","fifth","sixth","seventh","eighth",
+ "ninth","tenth","eleventh","twelfth","thirteenth","fourteenth",
+ "fifteenth","sixteenth","seventeenth","eighteenth","nineteenth",
+ "twentieth","twenty-first","twenty-second","twenty-third",
+ "twenty-fourth","twenty-fifth","twenty-sixth","twenty-seventh",
+ "twenty-eighth","twenty-ninth","thirtieth","thirty-first"]];
+
+ $$d{"now"} =["today","now"];
+ $$d{"last"} =["last","final"];
+ $$d{"each"} =["each","every"];
+ $$d{"of"} =["in","of"];
+ $$d{"at"} =["at"];
+ $$d{"on"} =["on"];
+ $$d{"future"} =["in"];
+ $$d{"past"} =["ago"];
+ $$d{"next"} =["next"];
+ $$d{"prev"} =["previous","last"];
+ $$d{"later"} =["later"];
+
+ $$d{"exact"} =["exactly"];
+ $$d{"approx"} =["approximately"];
+ $$d{"business"}=["business"];
+
+ $$d{"offset"} =["yesterday","-0:0:0:1:0:0:0","tomorrow","+0:0:0:1:0:0:0"];
+ $$d{"times"} =["noon","12:00:00","midnight","00:00:00"];
+
+ $$d{"years"} =["y","yr","year","yrs","years"];
+ $$d{"months"} =["mon","month","months"];
+ $$d{"weeks"} =["w","wk","wks","week","weeks"];
+ $$d{"days"} =["d","day","days"];
+ $$d{"hours"} =["h","hr","hrs","hour","hours"];
+ $$d{"minutes"} =["mn","min","minute","minutes"];
+ $$d{"seconds"} =["s","sec","second","seconds"];
+ $$d{"replace"} =["m","month"];
+
+ $$d{"sephm"} =':';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[.:]';
+
+ $$d{"am"} = ["AM","A.M."];
+ $$d{"pm"} = ["PM","P.M."];
+}
+
+sub Date_Init_Italian {
+ print "DEBUG: Date_Init_Italian\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ my(%h)=();
+ &Char_8Bit(\%h);
+ my($i)=$h{"i'"};
+
+ $$d{"month_name"}=
+ [[qw(Gennaio Febbraio Marzo Aprile Maggio Giugno
+ Luglio Agosto Settembre Ottobre Novembre Dicembre)]];
+
+ $$d{"month_abb"}=
+ [[qw(Gen Feb Mar Apr Mag Giu Lug Ago Set Ott Nov Dic)]];
+
+ $$d{"day_name"}=
+ [[qw(Lunedi Martedi Mercoledi Giovedi Venerdi Sabato Domenica)],
+ [qw(Luned${i} Marted${i} Mercoled${i} Gioved${i} Venerd${i})]];
+ $$d{"day_abb"}=
+ [[qw(Lun Mar Mer Gio Ven Sab Dom)]];
+ $$d{"day_char"}=
+ [[qw(L Ma Me G V S D)]];
+
+ $$d{"num_suff"}=
+ [[qw(1mo 2do 3zo 4to 5to 6to 7mo 8vo 9no 10mo 11mo 12mo 13mo 14mo 15mo
+ 16mo 17mo 18mo 19mo 20mo 21mo 22mo 23mo 24mo 25mo 26mo 27mo 28mo
+ 29mo 3mo 31mo)]];
+ $$d{"num_word"}=
+ [[qw(primo secondo terzo quarto quinto sesto settimo ottavo nono decimo
+ undicesimo dodicesimo tredicesimo quattordicesimo quindicesimo
+ sedicesimo diciassettesimo diciottesimo diciannovesimo ventesimo
+ ventunesimo ventiduesimo ventitreesimo ventiquattresimo
+ venticinquesimo ventiseiesimo ventisettesimo ventottesimo
+ ventinovesimo trentesimo trentunesimo)]];
+
+ $$d{"now"} =[qw(adesso oggi)];
+ $$d{"last"} =[qw(ultimo)];
+ $$d{"each"} =[qw(ogni)];
+ $$d{"of"} =[qw(della del)];
+ $$d{"at"} =[qw(alle)];
+ $$d{"on"} =[qw(di)];
+ $$d{"future"} =[qw(fra)];
+ $$d{"past"} =[qw(fa)];
+ $$d{"next"} =[qw(prossimo)];
+ $$d{"prev"} =[qw(ultimo)];
+ $$d{"later"} =[qw(dopo)];
+
+ $$d{"exact"} =[qw(esattamente)];
+ $$d{"approx"} =[qw(circa)];
+ $$d{"business"}=[qw(lavorativi lavorativo)];
+
+ $$d{"offset"} =[qw(ieri -0:0:0:1:0:0:0 domani +0:0:0:1:0:0:0)];
+ $$d{"times"} =[qw(mezzogiorno 12:00:00 mezzanotte 00:00:00)];
+
+ $$d{"years"} =[qw(anni anno a)];
+ $$d{"months"} =[qw(mesi mese mes)];
+ $$d{"weeks"} =[qw(settimane settimana sett)];
+ $$d{"days"} =[qw(giorni giorno g)];
+ $$d{"hours"} =[qw(ore ora h)];
+ $$d{"minutes"} =[qw(minuti minuto min)];
+ $$d{"seconds"} =[qw(secondi secondo sec)];
+ $$d{"replace"} =[qw(s sec m mes)];
+
+ $$d{"sephm"} =':';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[.:]';
+
+ $$d{"am"} = [qw(AM)];
+ $$d{"pm"} = [qw(PM)];
+}
+
+sub Date_Init_French {
+ print "DEBUG: Date_Init_French\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ my(%h)=();
+ &Char_8Bit(\%h);
+ my($e)=$h{"e'"};
+ my($u)=$h{"u^"};
+ my($a)=$h{"a'"};
+
+ $$d{"month_name"}=
+ [["janvier","fevrier","mars","avril","mai","juin",
+ "juillet","aout","septembre","octobre","novembre","decembre"],
+ ["janvier","f${e}vrier","mars","avril","mai","juin",
+ "juillet","ao${u}t","septembre","octobre","novembre","d${e}cembre"]];
+ $$d{"month_abb"}=
+ [["jan","fev","mar","avr","mai","juin",
+ "juil","aout","sept","oct","nov","dec"],
+ ["jan","f${e}v","mar","avr","mai","juin",
+ "juil","ao${u}t","sept","oct","nov","d${e}c"]];
+
+ $$d{"day_name"}=
+ [["lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche"]];
+ $$d{"day_abb"}=
+ [["lun","mar","mer","jeu","ven","sam","dim"]];
+ $$d{"day_char"}=
+ [["l","ma","me","j","v","s","d"]];
+
+ $$d{"num_suff"}=
+ [["1er","2e","3e","4e","5e","6e","7e","8e","9e","10e",
+ "11e","12e","13e","14e","15e","16e","17e","18e","19e","20e",
+ "21e","22e","23e","24e","25e","26e","27e","28e","29e","30e",
+ "31e"]];
+ $$d{"num_word"}=
+ [["premier","deux","trois","quatre","cinq","six","sept","huit","neuf",
+ "dix","onze","douze","treize","quatorze","quinze","seize","dix-sept",
+ "dix-huit","dix-neuf","vingt","vingt et un","vingt-deux","vingt-trois",
+ "vingt-quatre","vingt-cinq","vingt-six","vingt-sept","vingt-huit",
+ "vingt-neuf","trente","trente et un"],
+ ["1re"]];
+
+ $$d{"now"} =["aujourd'hui","maintenant"];
+ $$d{"last"} =["dernier"];
+ $$d{"each"} =["chaque","tous les","toutes les"];
+ $$d{"of"} =["en","de"];
+ $$d{"at"} =["a","${a}0"];
+ $$d{"on"} =["sur"];
+ $$d{"future"} =["en"];
+ $$d{"past"} =["il y a"];
+ $$d{"next"} =["suivant"];
+ $$d{"prev"} =["precedent","pr${e}c${e}dent"];
+ $$d{"later"} =["plus tard"];
+
+ $$d{"exact"} =["exactement"];
+ $$d{"approx"} =["approximativement"];
+ $$d{"business"}=["professionel"];
+
+ $$d{"offset"} =["hier","-0:0:0:1:0:0:0","demain","+0:0:0:1:0:0:0"];
+ $$d{"times"} =["midi","12:00:00","minuit","00:00:00"];
+
+ $$d{"years"} =["an","annee","ans","annees","ann${e}e","ann${e}es"];
+ $$d{"months"} =["mois"];
+ $$d{"weeks"} =["sem","semaine"];
+ $$d{"days"} =["j","jour","jours"];
+ $$d{"hours"} =["h","heure","heures"];
+ $$d{"minutes"} =["mn","min","minute","minutes"];
+ $$d{"seconds"} =["s","sec","seconde","secondes"];
+ $$d{"replace"} =["m","mois"];
+
+ $$d{"sephm"} ='[h:]';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[.:,]';
+
+ $$d{"am"} = ["du matin"];
+ $$d{"pm"} = ["du soir"];
+}
+
+sub Date_Init_Romanian {
+ print "DEBUG: Date_Init_Romanian\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ my(%h)=();
+ &Char_8Bit(\%h);
+ my($p)=$h{"p"};
+ my($i)=$h{"i^"};
+ my($a)=$h{"a~"};
+ my($o)=$h{"-o"};
+
+ $$d{"month_name"}=
+ [["ianuarie","februarie","martie","aprilie","mai","iunie",
+ "iulie","august","septembrie","octombrie","noiembrie","decembrie"]];
+ $$d{"month_abb"}=
+ [["ian","febr","mart","apr","mai","iun",
+ "iul","aug","sept","oct","nov","dec"],
+ ["","feb"]];
+
+ $$d{"day_name"}=
+ [["luni","marti","miercuri","joi","vineri","simbata","duminica"],
+ ["luni","mar${p}i","miercuri","joi","vineri","s${i}mb${a}t${a}",
+ "duminic${a}"]];
+ $$d{"day_abb"}=
+ [["lun","mar","mie","joi","vin","sim","dum"],
+ ["lun","mar","mie","joi","vin","s${i}m","dum"]];
+ $$d{"day_char"}=
+ [["L","Ma","Mi","J","V","S","D"]];
+
+ $$d{"num_suff"}=
+ [["prima","a doua","a 3-a","a 4-a","a 5-a","a 6-a","a 7-a","a 8-a",
+ "a 9-a","a 10-a","a 11-a","a 12-a","a 13-a","a 14-a","a 15-a",
+ "a 16-a","a 17-a","a 18-a","a 19-a","a 20-a","a 21-a","a 22-a",
+ "a 23-a","a 24-a","a 25-a","a 26-a","a 27-a","a 28-a","a 29-a",
+ "a 30-a","a 31-a"]];
+
+ $$d{"num_word"}=
+ [["prima","a doua","a treia","a patra","a cincea","a sasea","a saptea",
+ "a opta","a noua","a zecea","a unsprezecea","a doisprezecea",
+ "a treisprezecea","a patrusprezecea","a cincisprezecea","a saiprezecea",
+ "a saptesprezecea","a optsprezecea","a nouasprezecea","a douazecea",
+ "a douazecisiuna","a douazecisidoua","a douazecisitreia",
+ "a douazecisipatra","a douazecisicincea","a douazecisisasea",
+ "a douazecisisaptea","a douazecisiopta","a douazecisinoua","a treizecea",
+ "a treizecisiuna"],
+ ["prima","a doua","a treia","a patra","a cincea","a ${o}asea",
+ "a ${o}aptea","a opta","a noua","a zecea","a unsprezecea",
+ "a doisprezecea","a treisprezecea","a patrusprezecea","a cincisprezecea",
+ "a ${o}aiprezecea","a ${o}aptesprezecea","a optsprezecea",
+ "a nou${a}sprezecea","a dou${a}zecea","a dou${a}zeci${o}iuna",
+ "a dou${a}zeci${o}idoua","a dou${a}zeci${o}itreia",
+ "a dou${a}zeci${o}ipatra","a dou${a}zeci${o}icincea",
+ "a dou${a}zeci${o}i${o}asea","a dou${a}zeci${o}i${o}aptea",
+ "a dou${a}zeci${o}iopta","a dou${a}zeci${o}inoua","a treizecea",
+ "a treizeci${o}iuna"],
+ ["intii", "doi", "trei", "patru", "cinci", "sase", "sapte",
+ "opt","noua","zece","unsprezece","doisprezece",
+ "treisprezece","patrusprezece","cincisprezece","saiprezece",
+ "saptesprezece","optsprezece","nouasprezece","douazeci",
+ "douazecisiunu","douazecisidoi","douazecisitrei",
+ "douazecisipatru","douazecisicinci","douazecisisase","douazecisisapte",
+ "douazecisiopt","douazecisinoua","treizeci","treizecisiunu"],
+ ["${i}nt${i}i", "doi", "trei", "patru", "cinci", "${o}ase", "${o}apte",
+ "opt","nou${a}","zece","unsprezece","doisprezece",
+ "treisprezece","patrusprezece","cincisprezece","${o}aiprezece",
+ "${o}aptesprezece","optsprezece","nou${a}sprezece","dou${a}zeci",
+ "dou${a}zeci${o}iunu","dou${a}zeci${o}idoi","dou${a}zeci${o}itrei",
+ "dou${a}zecisipatru","dou${a}zeci${o}icinci","dou${a}zeci${o}i${o}ase",
+ "dou${a}zeci${o}i${o}apte","dou${a}zeci${o}iopt",
+ "dou${a}zeci${o}inou${a}","treizeci","treizeci${o}iunu"]];
+
+ $$d{"now"} =["acum","azi","astazi","ast${a}zi"];
+ $$d{"last"} =["ultima"];
+ $$d{"each"} =["fiecare"];
+ $$d{"of"} =["din","in","n"];
+ $$d{"at"} =["la"];
+ $$d{"on"} =["on"];
+ $$d{"future"} =["in","${i}n"];
+ $$d{"past"} =["in urma", "${i}n urm${a}"];
+ $$d{"next"} =["urmatoarea","urm${a}toarea"];
+ $$d{"prev"} =["precedenta","ultima"];
+ $$d{"later"} =["mai tirziu", "mai t${i}rziu"];
+
+ $$d{"exact"} =["exact"];
+ $$d{"approx"} =["aproximativ"];
+ $$d{"business"}=["de lucru","lucratoare","lucr${a}toare"];
+
+ $$d{"offset"} =["ieri","-0:0:0:1:0:0:0",
+ "alaltaieri", "-0:0:0:2:0:0:0",
+ "alalt${a}ieri","-0:0:0:2:0:0:0",
+ "miine","+0:0:0:1:0:0:0",
+ "m${i}ine","+0:0:0:1:0:0:0",
+ "poimiine","+0:0:0:2:0:0:0",
+ "poim${i}ine","+0:0:0:2:0:0:0"];
+ $$d{"times"} =["amiaza","12:00:00",
+ "amiaz${a}","12:00:00",
+ "miezul noptii","00:00:00",
+ "miezul nop${p}ii","00:00:00"];
+
+ $$d{"years"} =["ani","an","a"];
+ $$d{"months"} =["luni","luna","lun${a}","l"];
+ $$d{"weeks"} =["saptamini","s${a}pt${a}m${i}ni","saptamina",
+ "s${a}pt${a}m${i}na","sapt","s${a}pt"];
+ $$d{"days"} =["zile","zi","z"];
+ $$d{"hours"} =["ore", "ora", "or${a}", "h"];
+ $$d{"minutes"} =["minute","min","m"];
+ $$d{"seconds"} =["secunde","sec",];
+ $$d{"replace"} =["s","secunde"];
+
+ $$d{"sephm"} =':';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[.:,]';
+
+ $$d{"am"} = ["AM","A.M."];
+ $$d{"pm"} = ["PM","P.M."];
+}
+
+sub Date_Init_Swedish {
+ print "DEBUG: Date_Init_Swedish\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ my(%h)=();
+ &Char_8Bit(\%h);
+ my($ao)=$h{"ao"};
+ my($o) =$h{"o:"};
+ my($a) =$h{"a:"};
+
+ $$d{"month_name"}=
+ [["Januari","Februari","Mars","April","Maj","Juni",
+ "Juli","Augusti","September","Oktober","November","December"]];
+ $$d{"month_abb"}=
+ [["Jan","Feb","Mar","Apr","Maj","Jun",
+ "Jul","Aug","Sep","Okt","Nov","Dec"]];
+
+ $$d{"day_name"}=
+ [["Mandag","Tisdag","Onsdag","Torsdag","Fredag","Lordag","Sondag"],
+ ["M${ao}ndag","Tisdag","Onsdag","Torsdag","Fredag","L${o}rdag",
+ "S${o}ndag"]];
+ $$d{"day_abb"}=
+ [["Man","Tis","Ons","Tor","Fre","Lor","Son"],
+ ["M${ao}n","Tis","Ons","Tor","Fre","L${o}r","S${o}n"]];
+ $$d{"day_char"}=
+ [["M","Ti","O","To","F","L","S"]];
+
+ $$d{"num_suff"}=
+ [["1:a","2:a","3:e","4:e","5:e","6:e","7:e","8:e","9:e","10:e",
+ "11:e","12:e","13:e","14:e","15:e","16:e","17:e","18:e","19:e","20:e",
+ "21:a","22:a","23:e","24:e","25:e","26:e","27:e","28:e","29:e","30:e",
+ "31:a"]];
+ $$d{"num_word"}=
+ [["forsta","andra","tredje","fjarde","femte","sjatte","sjunde",
+ "attonde","nionde","tionde","elfte","tolfte","trettonde","fjortonde",
+ "femtonde","sextonde","sjuttonde","artonde","nittonde","tjugonde",
+ "tjugoforsta","tjugoandra","tjugotredje","tjugofjarde","tjugofemte",
+ "tjugosjatte","tjugosjunde","tjugoattonde","tjugonionde",
+ "trettionde","trettioforsta"],
+ ["f${o}rsta","andra","tredje","fj${a}rde","femte","sj${a}tte","sjunde",
+ "${ao}ttonde","nionde","tionde","elfte","tolfte","trettonde","fjortonde",
+ "femtonde","sextonde","sjuttonde","artonde","nittonde","tjugonde",
+ "tjugof${o}rsta","tjugoandra","tjugotredje","tjugofj${a}rde","tjugofemte",
+ "tjugosj${a}tte","tjugosjunde","tjugo${ao}ttonde","tjugonionde",
+ "trettionde","trettiof${o}rsta"]];
+
+ $$d{"now"} =["idag","nu"];
+ $$d{"last"} =["forra","f${o}rra","senaste"];
+ $$d{"each"} =["varje"];
+ $$d{"of"} =["om"];
+ $$d{"at"} =["kl","kl.","klockan"];
+ $$d{"on"} =["pa","p${ao}"];
+ $$d{"future"} =["om"];
+ $$d{"past"} =["sedan"];
+ $$d{"next"} =["nasta","n${a}sta"];
+ $$d{"prev"} =["forra","f${o}rra"];
+ $$d{"later"} =["senare"];
+
+ $$d{"exact"} =["exakt"];
+ $$d{"approx"} =["ungefar","ungef${a}r"];
+ $$d{"business"}=["arbetsdag","arbetsdagar"];
+
+ $$d{"offset"} =["ig${ao}r","-0:0:0:1:0:0:0","igar","-0:0:0:1:0:0:0",
+ "imorgon","+0:0:0:1:0:0:0"];
+ $$d{"times"} =["mitt pa dagen","12:00:00","mitt p${ao} dagen","12:00:00",
+ "midnatt","00:00:00"];
+
+ $$d{"years"} =["ar","${ao}r"];
+ $$d{"months"} =["man","manad","manader","m${ao}n","m${ao}nad","m${ao}nader"];
+ $$d{"weeks"} =["v","vecka","veckor"];
+ $$d{"days"} =["d","dag","dagar"];
+ $$d{"hours"} =["t","tim","timme","timmar"];
+ $$d{"minutes"} =["min","minut","minuter"];
+ $$d{"seconds"} =["s","sek","sekund","sekunder"];
+ $$d{"replace"} =["m","minut"];
+
+ $$d{"sephm"} ='[.:]';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[.:]';
+
+ $$d{"am"} = ["FM"];
+ $$d{"pm"} = ["EM"];
+}
+
+sub Date_Init_German {
+ print "DEBUG: Date_Init_German\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ my(%h)=();
+ &Char_8Bit(\%h);
+ my($a)=$h{"a:"};
+ my($u)=$h{"u:"};
+ my($o)=$h{"o:"};
+ my($b)=$h{"beta"};
+
+ $$d{"month_name"}=
+ [["Januar","Februar","Maerz","April","Mai","Juni",
+ "Juli","August","September","Oktober","November","Dezember"],
+ ["J${a}nner","Februar","M${a}rz","April","Mai","Juni",
+ "Juli","August","September","Oktober","November","Dezember"]];
+ $$d{"month_abb"}=
+ [["Jan","Feb","Mar","Apr","Mai","Jun",
+ "Jul","Aug","Sep","Okt","Nov","Dez"],
+ ["J${a}n","Feb","M${a}r","Apr","Mai","Jun",
+ "Jul","Aug","Sep","Okt","Nov","Dez"]];
+
+ $$d{"day_name"}=
+ [["Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag",
+ "Sonntag"]];
+ $$d{"day_abb"}=
+ [["Mon","Die","Mit","Don","Fre","Sam","Son"]];
+ $$d{"day_char"}=
+ [["M","Di","Mi","Do","F","Sa","So"]];
+
+ $$d{"num_suff"}=
+ [["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.",
+ "11.","12.","13.","14.","15.","16.","17.","18.","19.","20.",
+ "21.","22.","23.","24.","25.","26.","27.","28.","29.","30.",
+ "31."]];
+ $$d{"num_word"}=
+ [
+ ["erste","zweite","dritte","vierte","funfte","sechste","siebente",
+ "achte","neunte","zehnte","elfte","zwolfte","dreizehnte","vierzehnte",
+ "funfzehnte","sechzehnte","siebzehnte","achtzehnte","neunzehnte",
+ "zwanzigste","einundzwanzigste","zweiundzwanzigste","dreiundzwanzigste",
+ "vierundzwanzigste","funfundzwanzigste","sechundzwanzigste",
+ "siebundzwanzigste","achtundzwanzigste","neunundzwanzigste",
+ "dreibigste","einunddreibigste"],
+ ["erste","zweite","dritte","vierte","f${u}nfte","sechste","siebente",
+ "achte","neunte","zehnte","elfte","zw${o}lfte","dreizehnte",
+ "vierzehnte","f${u}nfzehnte","sechzehnte","siebzehnte","achtzehnte",
+ "neunzehnte","zwanzigste","einundzwanzigste","zweiundzwanzigste",
+ "dreiundzwanzigste","vierundzwanzigste","f${u}nfundzwanzigste",
+ "sechundzwanzigste","siebundzwanzigste","achtundzwanzigste",
+ "neunundzwanzigste","drei${b}igste","einunddrei${b}igste"],
+ ["erster"]];
+
+ $$d{"now"} =["heute","jetzt"];
+ $$d{"last"} =["letzte","letzten"];
+ $$d{"each"} =["jeden"];
+ $$d{"of"} =["der","im","des"];
+ $$d{"at"} =["um"];
+ $$d{"on"} =["am"];
+ $$d{"future"} =["in"];
+ $$d{"past"} =["vor"];
+ $$d{"next"} =["nachste","n${a}chste","nachsten","n${a}chsten"];
+ $$d{"prev"} =["vorherigen","vorherige","letzte","letzten"];
+ $$d{"later"} =["spater","sp${a}ter"];
+
+ $$d{"exact"} =["genau"];
+ $$d{"approx"} =["ungefahr","ungef${a}hr"];
+ $$d{"business"}=["Arbeitstag"];
+
+ $$d{"offset"} =["gestern","-0:0:0:1:0:0:0","morgen","+0:0:0:1:0:0:0"];
+ $$d{"times"} =["mittag","12:00:00","mitternacht","00:00:00"];
+
+ $$d{"years"} =["j","Jahr","Jahre"];
+ $$d{"months"} =["Monat","Monate"];
+ $$d{"weeks"} =["w","Woche","Wochen"];
+ $$d{"days"} =["t","Tag","Tage"];
+ $$d{"hours"} =["h","std","Stunde","Stunden"];
+ $$d{"minutes"} =["min","Minute","Minuten"];
+ $$d{"seconds"} =["s","sek","Sekunde","Sekunden"];
+ $$d{"replace"} =["m","Monat"];
+
+ $$d{"sephm"} =':';
+ $$d{"sepms"} ='[: ]';
+ $$d{"sepss"} ='[.:]';
+
+ $$d{"am"} = ["FM"];
+ $$d{"pm"} = ["EM"];
+}
+
+sub Date_Init_Dutch {
+ print "DEBUG: Date_Init_Dutch\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ my(%h)=();
+ &Char_8Bit(\%h);
+
+ $$d{"month_name"}=
+ [["januari","februari","maart","april","mei","juni","juli","augustus",
+ "september","october","november","december"],
+ ["","","","","","","","","","oktober"]];
+
+ $$d{"month_abb"}=
+ [["jan","feb","maa","apr","mei","jun","jul",
+ "aug","sep","oct","nov","dec"],
+ ["","","mrt","","","","","","","okt"]];
+ $$d{"day_name"}=
+ [["maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag",
+ "zondag"]];
+ $$d{"day_abb"}=
+ [["ma","di","wo","do","vr","zat","zon"],
+ ["","","","","","za","zo"]];
+ $$d{"day_char"}=
+ [["M","D","W","D","V","Za","Zo"]];
+
+ $$d{"num_suff"}=
+ [["1ste","2de","3de","4de","5de","6de","7de","8ste","9de","10de",
+ "11de","12de","13de","14de","15de","16de","17de","18de","19de","20ste",
+ "21ste","22ste","23ste","24ste","25ste","26ste","27ste","28ste","29ste",
+ "30ste","31ste"]];
+ $$d{"num_word"}=
+ [["eerste","tweede","derde","vierde","vijfde","zesde","zevende","achtste",
+ "negende","tiende","elfde","twaalfde",
+ map {"${_}tiende";} qw (der veer vijf zes zeven acht negen),
+ "twintigste",
+ map {"${_}entwintigste";} qw (een twee drie vier vijf zes zeven acht
+ negen),
+ "dertigste","eenendertigste"],
+ ["","","","","","","","","","","","","","","","","","","","",
+ map {"${_}-en-twintigste";} qw (een twee drie vier vijf zes zeven acht
+ negen),
+ "dertigste","een-en-dertigste"],
+ ["een","twee","drie","vier","vijf","zes","zeven","acht","negen","tien",
+ "elf","twaalf",
+ map {"${_}tien"} qw (der veer vijf zes zeven acht negen),
+ "twintig",
+ map {"${_}entwintig"} qw (een twee drie vier vijf zes zeven acht negen),
+ "dertig","eenendertig"],
+ ["","","","","","","","","","","","","","","","","","","","",
+ map {"${_}-en-twintig"} qw (een twee drie vier vijf zes zeven acht
+ negen),
+ "dertig","een-en-dertig"]];
+
+ $$d{"now"} =["nu","nou","vandaag"];
+ $$d{"last"} =["laatste"];
+ $$d{"each"} =["elke","elk"];
+ $$d{"of"} =["in","van"];
+ $$d{"at"} =["om"];
+ $$d{"on"} =["op"];
+ $$d{"future"} =["over"];
+ $$d{"past"} =["geleden","vroeger","eerder"];
+ $$d{"next"} =["volgende","volgend"];
+ $$d{"prev"} =["voorgaande","voorgaand"];
+ $$d{"later"} =["later"];
+
+ $$d{"exact"} =["exact","precies","nauwkeurig"];
+ $$d{"approx"} =["ongeveer","ong",'ong\.',"circa","ca",'ca\.'];
+ $$d{"business"}=["werk","zakelijke","zakelijk"];
+
+ $$d{"offset"} =["morgen","+0:0:0:1:0:0:0","overmorgen","+0:0:0:2:0:0:0",
+ "gisteren","-0:0:0:1:0:0:0","eergisteren","-0::00:2:0:0:0"];
+ $$d{"times"} =["noen","12:00:00","middernacht","00:00:00"];
+
+ $$d{"years"} =["jaar","jaren","ja","j"];
+ $$d{"months"} =["maand","maanden","mnd"];
+ $$d{"weeks"} =["week","weken","w"];
+ $$d{"days"} =["dag","dagen","d"];
+ $$d{"hours"} =["uur","uren","u","h"];
+ $$d{"minutes"} =["minuut","minuten","min"];
+ $$d{"seconds"} =["seconde","seconden","sec","s"];
+ $$d{"replace"} =["m","minuten"];
+
+ $$d{"sephm"} ='[:.uh]';
+ $$d{"sepms"} ='[:.m]';
+ $$d{"sepss"} ='[.:]';
+
+ $$d{"am"} = ["am","a.m.","vm","v.m.","voormiddag","'s_ochtends",
+ "ochtend","'s_nachts","nacht"];
+ $$d{"pm"} = ["pm","p.m.","nm","n.m.","namiddag","'s_middags","middag",
+ "'s_avonds","avond"];
+}
+
+sub Date_Init_Polish {
+ print "DEBUG: Date_Init_Polish\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+
+ $$d{"month_name"}=
+ [["stycznia","luty","marca","kwietnia","maja","czerwca",
+ "lipca","sierpnia","wrzesnia","pazdziernika","listopada","grudnia"],
+ ["stycznia","luty","marca","kwietnia","maja","czerwca","lipca",
+ "sierpnia","wrze\x9cnia","pa\x9fdziernika","listopada","grudnia"]];
+ $$d{"month_abb"}=
+ [["sty.","lut.","mar.","kwi.","maj","cze.",
+ "lip.","sie.","wrz.","paz.","lis.","gru."],
+ ["sty.","lut.","mar.","kwi.","maj","cze.",
+ "lip.","sie.","wrz.","pa\x9f.","lis.","gru."]];
+
+ $$d{"day_name"}=
+ [["poniedzialek","wtorek","sroda","czwartek","piatek","sobota",
+ "niedziela"],
+ ["poniedzia\x81\xb3ek","wtorek","\x9croda","czwartek","pi\x81\xb9tek",
+ "sobota","niedziela"]];
+ $$d{"day_abb"}=
+ [["po.","wt.","sr.","cz.","pi.","so.","ni."],
+ ["po.","wt.","\x9cr.","cz.","pi.","so.","ni."]];
+ $$d{"day_char"}=
+ [["p","w","e","c","p","s","n"],
+ ["p","w","\x9c.","c","p","s","n"]];
+
+ $$d{"num_suff"}=
+ [["1.","2.","3.","4.","5.","6.","7.","8.","9.","10.",
+ "11.","12.","13.","14.","15.","16.","17.","18.","19.","20.",
+ "21.","22.","23.","24.","25.","26.","27.","28.","29.","30.",
+ "31."]];
+ $$d{"num_word"}=
+ [["pierwszego","drugiego","trzeczego","czwartego","piatego","szostego",
+ "siodmego","osmego","dziewiatego","dziesiatego",
+ "jedenastego","dwunastego","trzynastego","czternastego","pietnastego",
+ "szestnastego","siedemnastego","osiemnastego","dziewietnastego",
+ "dwudziestego",
+ "dwudziestego pierwszego","dwudziestego drugiego",
+ "dwudziestego trzeczego","dwudziestego czwartego",
+ "dwudziestego piatego","dwudziestego szostego",
+ "dwudziestego siodmego","dwudziestego osmego",
+ "dwudziestego dziewiatego","trzydziestego","trzydziestego pierwszego"],
+ ["pierwszego","drugiego","trzeczego","czwartego","pi\x81\xb9tego",
+ "sz\x81\xf3stego","si\x81\xf3dmego","\x81\xf3smego","dziewi\x81\xb9tego",
+ "dziesi\x81\xb9tego","jedenastego","dwunastego","trzynastego",
+ "czternastego","pi\x81\xeatnastego","szestnastego","siedemnastego",
+ "osiemnastego","dziewietnastego","dwudziestego",
+ "dwudziestego pierwszego","dwudziestego drugiego",
+ "dwudziestego trzeczego","dwudziestego czwartego",
+ "dwudziestego pi\x81\xb9tego","dwudziestego sz\x81\xf3stego",
+ "dwudziestego si\x81\xf3dmego","dwudziestego \x81\xf3smego",
+ "dwudziestego dziewi\x81\xb9tego","trzydziestego",
+ "trzydziestego pierwszego"]];
+
+ $$d{"now"} =["dzisaj","teraz"];
+ $$d{"last"} =["ostatni","ostatna"];
+ $$d{"each"} =["kazdy","ka\x81\xbfdy", "kazdym","ka\x81\xbfdym"];
+ $$d{"of"} =["w","z"];
+ $$d{"at"} =["o","u"];
+ $$d{"on"} =["na"];
+ $$d{"future"} =["za"];
+ $$d{"past"} =["temu"];
+ $$d{"next"} =["nastepny","nast\x81\xeapny","nastepnym","nast\x81\xeapnym",
+ "przyszly","przysz\x81\xb3y","przyszlym",
+ "przysz\x81\xb3ym"];
+ $$d{"prev"} =["zeszly","zesz\x81\xb3y","zeszlym","zesz\x81\xb3ym"];
+ $$d{"later"} =["later"];
+
+ $$d{"exact"} =["doklandnie","dok\x81\xb3andnie"];
+ $$d{"approx"} =["w przyblizeniu","w przybli\x81\xbfeniu","mniej wiecej",
+ "mniej wi\x81\xeacej","okolo","oko\x81\xb3o"];
+ $$d{"business"}=["sluzbowy","s\x81\xb3u\x81\xbfbowy","sluzbowym",
+ "s\x81\xb3u\x81\xbfbowym"];
+
+ $$d{"times"} =["po\x81\xb3udnie","12:00:00",
+ "p\x81\xf3\x81\xb3noc","00:00:00",
+ "poludnie","12:00:00","polnoc","00:00:00"];
+ $$d{"offset"} =["wczoraj","-0:0:1:0:0:0","jutro","+0:0:1:0:0:0"];
+
+ $$d{"years"} =["rok","lat","lata","latach"];
+ $$d{"months"} =["m.","miesiac","miesi\x81\xb9c","miesiecy",
+ "miesi\x81\xeacy","miesiacu","miesi\x81\xb9cu"];
+ $$d{"weeks"} =["ty.","tydzien","tydzie\x81\xf1","tygodniu"];
+ $$d{"days"} =["d.","dzien","dzie\x81\xf1","dni"];
+ $$d{"hours"} =["g.","godzina","godziny","godzinie"];
+ $$d{"minutes"} =["mn.","min.","minut","minuty"];
+ $$d{"seconds"} =["s.","sekund","sekundy"];
+ $$d{"replace"} =["m.","miesiac"];
+
+ $$d{"sephm"} =':';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[.:]';
+
+ $$d{"am"} = ["AM","A.M."];
+ $$d{"pm"} = ["PM","P.M."];
+}
+
+sub Date_Init_Spanish {
+ print "DEBUG: Date_Init_Spanish\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ my(%h)=();
+ &Char_8Bit(\%h);
+
+ $$d{"month_name"}=
+ [["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto",
+ "Septiembre","Octubre","Noviembre","Diciembre"]];
+
+ $$d{"month_abb"}=
+ [["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct",
+ "Nov","Dic"]];
+
+ $$d{"day_name"}=
+ [["Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo"]];
+ $$d{"day_abb"}=
+ [["Lun","Mar","Mie","Jue","Vie","Sab","Dom"]];
+ $$d{"day_char"}=
+ [["L","Ma","Mi","J","V","S","D"]];
+
+ $$d{"num_suff"}=
+ [["1o","2o","3o","4o","5o","6o","7o","8o","9o","10o",
+ "11o","12o","13o","14o","15o","16o","17o","18o","19o","20o",
+ "21o","22o","23o","24o","25o","26o","27o","28o","29o","30o","31o"],
+ ["1a","2a","3a","4a","5a","6a","7a","8a","9a","10a",
+ "11a","12a","13a","14a","15a","16a","17a","18a","19a","20a",
+ "21a","22a","23a","24a","25a","26a","27a","28a","29a","30a","31a"]];
+ $$d{"num_word"}=
+ [["Primero","Segundo","Tercero","Cuarto","Quinto","Sexto","Septimo",
+ "Octavo","Noveno","Decimo","Decimo Primero","Decimo Segundo",
+ "Decimo Tercero","Decimo Cuarto","Decimo Quinto","Decimo Sexto",
+ "Decimo Septimo","Decimo Octavo","Decimo Noveno","Vigesimo",
+ "Vigesimo Primero","Vigesimo Segundo","Vigesimo Tercero",
+ "Vigesimo Cuarto","Vigesimo Quinto","Vigesimo Sexto",
+ "Vigesimo Septimo","Vigesimo Octavo","Vigesimo Noveno","Trigesimo",
+ "Trigesimo Primero"],
+ ["Primera","Segunda","Tercera","Cuarta","Quinta","Sexta","Septima",
+ "Octava","Novena","Decima","Decimo Primera","Decimo Segunda",
+ "Decimo Tercera","Decimo Cuarta","Decimo Quinta","Decimo Sexta",
+ "Decimo Septima","Decimo Octava","Decimo Novena","Vigesima",
+ "Vigesimo Primera","Vigesimo Segunda","Vigesimo Tercera",
+ "Vigesimo Cuarta","Vigesimo Quinta","Vigesimo Sexta",
+ "Vigesimo Septima","Vigesimo Octava","Vigesimo Novena","Trigesima",
+ "Trigesimo Primera"]];
+
+ $$d{"now"} =["Hoy","Ahora"];
+ $$d{"last"} =["ultimo"];
+ $$d{"each"} =["cada"];
+ $$d{"of"} =["en","de"];
+ $$d{"at"} =["a"];
+ $$d{"on"} =["el"];
+ $$d{"future"} =["en"];
+ $$d{"past"} =["hace"];
+ $$d{"next"} =["siguiente"];
+ $$d{"prev"} =["anterior"];
+ $$d{"later"} =["later"];
+
+ $$d{"exact"} =["exactamente"];
+ $$d{"approx"} =["aproximadamente"];
+ $$d{"business"}=["laborales"];
+
+ $$d{"offset"} =["ayer","-0:0:0:1:0:0:0","manana","+0:0:0:1:0:0:0"];
+ $$d{"times"} =["mediodia","12:00:00","medianoche","00:00:00"];
+
+ $$d{"years"} =["a","ano","ano","anos","anos"];
+ $$d{"months"} =["m","mes","mes","meses"];
+ $$d{"weeks"} =["sem","semana","semana","semanas"];
+ $$d{"days"} =["d","dia","dias"];
+ $$d{"hours"} =["hr","hrs","hora","horas"];
+ $$d{"minutes"} =["min","min","minuto","minutos"];
+ $$d{"seconds"} =["s","seg","segundo","segundos"];
+ $$d{"replace"} =["m","mes"];
+
+ $$d{"sephm"} =':';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[.:]';
+
+ $$d{"am"} = ["AM","A.M."];
+ $$d{"pm"} = ["PM","P.M."];
+}
+
+sub Date_Init_Portuguese {
+ print "DEBUG: Date_Init_Portuguese\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ my(%h)=();
+ &Char_8Bit(\%h);
+ my($o) = $h{"-o"};
+ my($c) = $h{",c"};
+ my($a) = $h{"a'"};
+ my($e) = $h{"e'"};
+ my($u) = $h{"u'"};
+ my($o2)= $h{"o'"};
+ my($a2)= $h{"a`"};
+ my($a3)= $h{"a~"};
+ my($e2)= $h{"e^"};
+
+ $$d{"month_name"}=
+ [["Janeiro","Fevereiro","Marco","Abril","Maio","Junho",
+ "Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],
+ ["Janeiro","Fevereiro","Mar${c}o","Abril","Maio","Junho",
+ "Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"]];
+
+ $$d{"month_abb"}=
+ [["Jan","Fev","Mar","Abr","Mai","Jun",
+ "Jul","Ago","Set","Out","Nov","Dez"]];
+
+ $$d{"day_name"}=
+ [["Segunda","Terca","Quarta","Quinta","Sexta","Sabado","Domingo"],
+ ["Segunda","Ter${c}a","Quarta","Quinta","Sexta","S${a}bado","Domingo"]];
+ $$d{"day_abb"}=
+ [["Seg","Ter","Qua","Qui","Sex","Sab","Dom"],
+ ["Seg","Ter","Qua","Qui","Sex","S${a}b","Dom"]];
+ $$d{"day_char"}=
+ [["Sg","T","Qa","Qi","Sx","Sb","D"]];
+
+ $$d{"num_suff"}=
+ [["1${o}","2${o}","3${o}","4${o}","5${o}","6${o}","7${o}","8${o}",
+ "9${o}","10${o}","11${o}","12${o}","13${o}","14${o}","15${o}",
+ "16${o}","17${o}","18${o}","19${o}","20${o}","21${o}","22${o}",
+ "23${o}","24${o}","25${o}","26${o}","27${o}","28${o}","29${o}",
+ "30${o}","31${o}"]];
+ $$d{"num_word"}=
+ [["primeiro","segundo","terceiro","quarto","quinto","sexto","setimo",
+ "oitavo","nono","decimo","decimo primeiro","decimo segundo",
+ "decimo terceiro","decimo quarto","decimo quinto","decimo sexto",
+ "decimo setimo","decimo oitavo","decimo nono","vigesimo",
+ "vigesimo primeiro","vigesimo segundo","vigesimo terceiro",
+ "vigesimo quarto","vigesimo quinto","vigesimo sexto","vigesimo setimo",
+ "vigesimo oitavo","vigesimo nono","trigesimo","trigesimo primeiro"],
+ ["primeiro","segundo","terceiro","quarto","quinto","sexto","s${e}timo",
+ "oitavo","nono","d${e}cimo","d${e}cimo primeiro","d${e}cimo segundo",
+ "d${e}cimo terceiro","d${e}cimo quarto","d${e}cimo quinto",
+ "d${e}cimo sexto","d${e}cimo s${e}timo","d${e}cimo oitavo",
+ "d${e}cimo nono","vig${e}simo","vig${e}simo primeiro",
+ "vig${e}simo segundo","vig${e}simo terceiro","vig${e}simo quarto",
+ "vig${e}simo quinto","vig${e}simo sexto","vig${e}simo s${e}timo",
+ "vig${e}simo oitavo","vig${e}simo nono","trig${e}simo",
+ "trig${e}simo primeiro"]];
+
+ $$d{"now"} =["agora","hoje"];
+ $$d{"last"} =["${u}ltimo","ultimo"];
+ $$d{"each"} =["cada"];
+ $$d{"of"} =["da","do"];
+ $$d{"at"} =["as","${a2}s"];
+ $$d{"on"} =["na","no"];
+ $$d{"future"} =["em"];
+ $$d{"past"} =["a","${a2}"];
+ $$d{"next"} =["proxima","proximo","pr${o2}xima","pr${o2}ximo"];
+ $$d{"prev"} =["ultima","ultimo","${u}ltima","${u}ltimo"];
+ $$d{"later"} =["passadas","passados"];
+
+ $$d{"exact"} =["exactamente"];
+ $$d{"approx"} =["aproximadamente"];
+ $$d{"business"}=["util","uteis"];
+
+ $$d{"offset"} =["ontem","-0:0:0:1:0:0:0",
+ "amanha","+0:0:0:1:0:0:0","amanh${a3}","+0:0:0:1:0:0:0"];
+ $$d{"times"} =["meio-dia","12:00:00","meia-noite","00:00:00"];
+
+ $$d{"years"} =["anos","ano","ans","an","a"];
+ $$d{"months"} =["meses","m${e2}s","mes","m"];
+ $$d{"weeks"} =["semanas","semana","sem","sems","s"];
+ $$d{"days"} =["dias","dia","d"];
+ $$d{"hours"} =["horas","hora","hr","hrs"];
+ $$d{"minutes"} =["minutos","minuto","min","mn"];
+ $$d{"seconds"} =["segundos","segundo","seg","sg"];
+ $$d{"replace"} =["m","mes","s","sems"];
+
+ $$d{"sephm"} =':';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[,]';
+
+ $$d{"am"} = ["AM","A.M."];
+ $$d{"pm"} = ["PM","P.M."];
+}
+
+sub Date_Init_Russian {
+ print "DEBUG: Date_Init_Russian\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+ my(%h)=();
+ &Char_8Bit(\%h);
+ my($a) =$h{"a:"};
+
+ $$d{"month_name"}=
+ [
+ ["\xd1\xce\xd7\xc1\xd2\xd1","\xc6\xc5\xd7\xd2\xc1\xcc\xd1",
+ "\xcd\xc1\xd2\xd4\xc1","\xc1\xd0\xd2\xc5\xcc\xd1","\xcd\xc1\xd1",
+ "\xc9\xc0\xce\xd1",
+ "\xc9\xc0\xcc\xd1","\xc1\xd7\xc7\xd5\xd3\xd4\xc1",
+ "\xd3\xc5\xce\xd4\xd1\xc2\xd2\xd1","\xcf\xcb\xd4\xd1\xc2\xd2\xd1",
+ "\xce\xcf\xd1\xc2\xd2\xd1","\xc4\xc5\xcb\xc1\xc2\xd2\xd1"],
+ ["\xd1\xce\xd7\xc1\xd2\xd8","\xc6\xc5\xd7\xd2\xc1\xcc\xd8",
+ "\xcd\xc1\xd2\xd4","\xc1\xd0\xd2\xc5\xcc\xd8","\xcd\xc1\xca",
+ "\xc9\xc0\xce\xd8",
+ "\xc9\xc0\xcc\xd8","\xc1\xd7\xc7\xd5\xd3\xd4",
+ "\xd3\xc5\xce\xd4\xd1\xc2\xd2\xd8","\xcf\xcb\xd4\xd1\xc2\xd2\xd8",
+ "\xce\xcf\xd1\xc2\xd2\xd8","\xc4\xc5\xcb\xc1\xc2\xd2\xd8"]
+ ];
+
+ $$d{"month_abb"}=
+ [["\xd1\xce\xd7","\xc6\xc5\xd7","\xcd\xd2\xd4","\xc1\xd0\xd2",
+ "\xcd\xc1\xca","\xc9\xc0\xce",
+ "\xc9\xc0\xcc","\xc1\xd7\xc7","\xd3\xce\xd4","\xcf\xcb\xd4",
+ "\xce\xcf\xd1\xc2","\xc4\xc5\xcb"],
+ ["","\xc6\xd7\xd2","","","\xcd\xc1\xd1","",
+ "","","\xd3\xc5\xce","\xcf\xcb\xd4","\xce\xcf\xd1",""]];
+
+ $$d{"day_name"}=
+ [["\xd0\xcf\xce\xc5\xc4\xc5\xcc\xd8\xce\xc9\xcb",
+ "\xd7\xd4\xcf\xd2\xce\xc9\xcb","\xd3\xd2\xc5\xc4\xc1",
+ "\xde\xc5\xd4\xd7\xc5\xd2\xc7","\xd0\xd1\xd4\xce\xc9\xc3\xc1",
+ "\xd3\xd5\xc2\xc2\xcf\xd4\xc1",
+ "\xd7\xcf\xd3\xcb\xd2\xc5\xd3\xc5\xce\xd8\xc5"]];
+ $$d{"day_abb"}=
+ [["\xd0\xce\xc4","\xd7\xd4\xd2","\xd3\xd2\xc4","\xde\xd4\xd7",
+ "\xd0\xd4\xce","\xd3\xd5\xc2","\xd7\xd3\xcb"],
+ ["\xd0\xcf\xce","\xd7\xd4\xcf","\xd3\xd2e","\xde\xc5\xd4",
+ "\xd0\xd1\xd4","\xd3\xd5\xc2","\xd7\xcf\xd3\xcb"]];
+ $$d{"day_char"}=
+ [["\xd0\xce","\xd7\xd4","\xd3\xd2","\xde\xd4","\xd0\xd4","\xd3\xc2",
+ "\xd7\xd3"]];
+
+ $$d{"num_suff"}=
+ [["1 ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 ","10 ",
+ "11 ","12 ","13 ","14 ","15 ","16 ","17 ","18 ","19 ","20 ",
+ "21 ","22 ","23 ","24 ","25 ","26 ","27 ","28 ","29 ","30 ",
+ "31 "]];
+ $$d{"num_word"}=
+ [["\xd0\xc5\xd2\xd7\xd9\xca","\xd7\xd4\xcf\xd2\xcf\xca",
+ "\xd4\xd2\xc5\xd4\xc9\xca","\xde\xc5\xd4\xd7\xc5\xd2\xd4\xd9\xca",
+ "\xd0\xd1\xd4\xd9\xca","\xdb\xc5\xd3\xd4\xcf\xca",
+ "\xd3\xc5\xc4\xd8\xcd\xcf\xca","\xd7\xcf\xd3\xd8\xcd\xcf\xca",
+ "\xc4\xc5\xd7\xd1\xd4\xd9\xca","\xc4\xc5\xd3\xd1\xd4\xd9\xca",
+ "\xcf\xc4\xc9\xce\xce\xc1\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xc4\xd7\xc5\xce\xc1\xc4\xde\xc1\xd4\xd9\xca",
+ "\xd4\xd2\xc5\xce\xc1\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xde\xc5\xd4\xd9\xd2\xce\xc1\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xd0\xd1\xd4\xce\xc1\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xdb\xc5\xd3\xd4\xce\xc1\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xd3\xc5\xcd\xd8\xce\xc1\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xd7\xcf\xd3\xc5\xcd\xd8\xce\xc1\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xc4\xc5\xd7\xd1\xd4\xce\xc1\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd0\xc5\xd2\xd7\xd9\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd7\xd4\xcf\xd2\xcf\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd4\xd2\xc5\xd4\xc9\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xde\xc5\xd4\xd7\xc5\xd2\xd4\xd9\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd0\xd1\xd4\xd9\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xdb\xc5\xd3\xd4\xcf\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd3\xc5\xc4\xd8\xcd\xcf\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd7\xcf\xd3\xd8\xcd\xcf\xca",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xc4\xc5\xd7\xd1\xd4\xd9\xca",
+ "\xd4\xd2\xc9\xc4\xc3\xc1\xd4\xd9\xca",
+ "\xd4\xd2\xc9\xc4\xc3\xc1\xd4\xd8 \xd0\xc5\xd2\xd7\xd9\xca"],
+
+ ["\xd0\xc5\xd2\xd7\xcf\xc5","\xd7\xd4\xcf\xd2\xcf\xc5",
+ "\xd4\xd2\xc5\xd4\xd8\xc5","\xde\xc5\xd4\xd7\xc5\xd2\xd4\xcf\xc5",
+ "\xd0\xd1\xd4\xcf\xc5","\xdb\xc5\xd3\xd4\xcf\xc5",
+ "\xd3\xc5\xc4\xd8\xcd\xcf\xc5","\xd7\xcf\xd3\xd8\xcd\xcf\xc5",
+ "\xc4\xc5\xd7\xd1\xd4\xcf\xc5","\xc4\xc5\xd3\xd1\xd4\xcf\xc5",
+ "\xcf\xc4\xc9\xce\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xc4\xd7\xc5\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xd4\xd2\xc5\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xde\xc5\xd4\xd9\xd2\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xd0\xd1\xd4\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xdb\xc5\xd3\xd4\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xd3\xc5\xcd\xd8\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xd7\xcf\xd3\xc5\xcd\xd8\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xc4\xc5\xd7\xd1\xd4\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd0\xc5\xd2\xd7\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd7\xd4\xcf\xd2\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd4\xd2\xc5\xd4\xd8\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xde\xc5\xd4\xd7\xc5\xd2\xd4\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd0\xd1\xd4\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xdb\xc5\xd3\xd4\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd3\xc5\xc4\xd8\xcd\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd7\xcf\xd3\xd8\xcd\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xc4\xc5\xd7\xd1\xd4\xcf\xc5",
+ "\xd4\xd2\xc9\xc4\xc3\xc1\xd4\xcf\xc5",
+ "\xd4\xd2\xc9\xc4\xc3\xc1\xd4\xd8 \xd0\xc5\xd2\xd7\xcf\xc5"],
+
+ ["\xd0\xc5\xd2\xd7\xcf\xc7\xcf","\xd7\xd4\xcf\xd2\xcf\xc7\xcf",
+ "\xd4\xd2\xc5\xd4\xd8\xc5\xc7\xcf",
+ "\xde\xc5\xd4\xd7\xc5\xd2\xd4\xcf\xc7\xcf","\xd0\xd1\xd4\xcf\xc7\xcf",
+ "\xdb\xc5\xd3\xd4\xcf\xc7\xcf","\xd3\xc5\xc4\xd8\xcd\xcf\xc7\xcf",
+ "\xd7\xcf\xd3\xd8\xcd\xcf\xc7\xcf",
+ "\xc4\xc5\xd7\xd1\xd4\xcf\xc7\xcf","\xc4\xc5\xd3\xd1\xd4\xcf\xc7\xcf",
+ "\xcf\xc4\xc9\xce\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xc4\xd7\xc5\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xd4\xd2\xc5\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xde\xc5\xd4\xd9\xd2\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xd0\xd1\xd4\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xdb\xc5\xd3\xd4\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xd3\xc5\xcd\xd8\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xd7\xcf\xd3\xc5\xcd\xd8\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xc4\xc5\xd7\xd1\xd4\xce\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd0\xc5\xd2\xd7\xcf\xc7\xcf",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd7\xd4\xcf\xd2\xcf\xc5",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd4\xd2\xc5\xd4\xd8\xc5\xc7\xcf",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xde\xc5\xd4\xd7\xc5\xd2\xd4\xcf\xc7\xcf",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd0\xd1\xd4\xcf\xc7\xcf",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xdb\xc5\xd3\xd4\xcf\xc7\xcf",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd3\xc5\xc4\xd8\xcd\xcf\xc7\xcf",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xd7\xcf\xd3\xd8\xcd\xcf\xc7\xcf",
+ "\xc4\xd7\xc1\xc4\xc3\xc1\xd4\xd8 \xc4\xc5\xd7\xd1\xd4\xcf\xc7\xcf",
+ "\xd4\xd2\xc9\xc4\xc3\xc1\xd4\xcf\xc7\xcf",
+ "\xd4\xd2\xc9\xc4\xc3\xc1\xd4\xd8 \xd0\xc5\xd2\xd7\xcf\xc7\xcf"]];
+
+ $$d{"now"} =["\xd3\xc5\xc7\xcf\xc4\xce\xd1","\xd3\xc5\xca\xde\xc1\xd3"];
+ $$d{"last"} =["\xd0\xcf\xd3\xcc\xc5\xc4\xce\xc9\xca"];
+ $$d{"each"} =["\xcb\xc1\xd6\xc4\xd9\xca"];
+ $$d{"of"} =[" "];
+ $$d{"at"} =["\xd7"];
+ $$d{"on"} =["\xd7"];
+ $$d{"future"} =["\xd7\xd0\xc5\xd2\xc5\xc4 \xce\xc1"];
+ $$d{"past"} =["\xce\xc1\xda\xc1\xc4 \xce\xc1 "];
+ $$d{"next"} =["\xd3\xcc\xc5\xc4\xd5\xc0\xdd\xc9\xca"];
+ $$d{"prev"} =["\xd0\xd2\xc5\xc4\xd9\xc4\xd5\xdd\xc9\xca"];
+ $$d{"later"} =["\xd0\xcf\xda\xd6\xc5"];
+
+ $$d{"exact"} =["\xd4\xcf\xde\xce\xcf"];
+ $$d{"approx"} =["\xd0\xd2\xc9\xcd\xc5\xd2\xce\xcf"];
+ $$d{"business"}=["\xd2\xc1\xc2\xcf\xde\xc9\xc8"];
+
+ $$d{"offset"} =["\xd0\xcf\xda\xc1\xd7\xde\xc5\xd2\xc1","-0:0:0:2:0:0:0",
+ "\xd7\xde\xc5\xd2\xc1","-0:0:0:1:0:0:0",
+ "\xda\xc1\xd7\xd4\xd2\xc1","+0:0:0:1:0:0:0",
+ "\xd0\xcf\xd3\xcc\xc5\xda\xc1\xd7\xd4\xd2\xc1",
+ "+0:0:0:2:0:0:0"];
+ $$d{"times"} =["\xd0\xcf\xcc\xc4\xc5\xce\xd8","12:00:00",
+ "\xd0\xcf\xcc\xce\xcf\xde\xd8","00:00:00"];
+
+ $$d{"years"} =["\xc7","\xc7\xc4","\xc7\xcf\xc4","\xcc\xc5\xd4",
+ "\xcc\xc5\xd4","\xc7\xcf\xc4\xc1"];
+ $$d{"months"} =["\xcd\xc5\xd3","\xcd\xc5\xd3\xd1\xc3",
+ "\xcd\xc5\xd3\xd1\xc3\xc5\xd7"];
+ $$d{"weeks"} =["\xce\xc5\xc4\xc5\xcc\xd1","\xce\xc5\xc4\xc5\xcc\xd8",
+ "\xce\xc5\xc4\xc5\xcc\xc9","\xce\xc5\xc4\xc5\xcc\xc0"];
+ $$d{"days"} =["\xc4","\xc4\xc5\xce\xd8","\xc4\xce\xc5\xca",
+ "\xc4\xce\xd1"];
+ $$d{"hours"} =["\xde","\xde.","\xde\xd3","\xde\xd3\xd7","\xde\xc1\xd3",
+ "\xde\xc1\xd3\xcf\xd7","\xde\xc1\xd3\xc1"];
+ $$d{"minutes"} =["\xcd\xce","\xcd\xc9\xce","\xcd\xc9\xce\xd5\xd4\xc1",
+ "\xcd\xc9\xce\xd5\xd4"];
+ $$d{"seconds"} =["\xd3","\xd3\xc5\xcb","\xd3\xc5\xcb\xd5\xce\xc4\xc1",
+ "\xd3\xc5\xcb\xd5\xce\xc4"];
+ $$d{"replace"} =[];
+
+ $$d{"sephm"} ="[:\xde]";
+ $$d{"sepms"} ="[:\xcd]";
+ $$d{"sepss"} ="[:.\xd3]";
+
+ $$d{"am"} = ["\xc4\xd0","${a}\xf0","${a}.\xf0.","\xce\xcf\xde\xc9",
+ "\xd5\xd4\xd2\xc1",
+ "\xc4\xcf \xd0\xcf\xcc\xd5\xc4\xce\xd1"];
+ $$d{"pm"} = ["\xd0\xd0","\xf0\xf0","\xf0.\xf0.","\xc4\xce\xd1",
+ "\xd7\xc5\xde\xc5\xd2\xc1",
+ "\xd0\xcf\xd3\xcc\xc5 \xd0\xcf\xcc\xd5\xc4\xce\xd1",
+ "\xd0\xcf \xd0\xcf\xcc\xd5\xc4\xce\xc0"];
+}
+
+sub Date_Init_Turkish {
+ print "DEBUG: Date_Init_Turkish\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+
+ $$d{"month_name"}=
+ [
+ ["ocak","subat","mart","nisan","mayis","haziran",
+ "temmuz","agustos","eylul","ekim","kasim","aralik"],
+ ["ocak","\xfeubat","mart","nisan","may\xfds","haziran",
+ "temmuz","a\xf0ustos","eyl\xfcl","ekim","kas\xfdm","aral\xfdk"]
+ ];
+
+ $$d{"month_abb"}=
+ [
+ ["oca","sub","mar","nis","may","haz",
+ "tem","agu","eyl","eki","kas","ara"],
+ ["oca","\xfeub","mar","nis","may","haz",
+ "tem","a\xf0u","eyl","eki","kas","ara"]
+ ];
+
+ $$d{"day_name"}=
+ [
+ ["pazartesi","sali","carsamba","persembe","cuma","cumartesi","pazar"],
+ ["pazartesi","sal\xfd","\xe7ar\xfeamba","per\xfeembe","cuma",
+ "cumartesi","pazar"],
+ ];
+
+ $$d{"day_abb"}=
+ [
+ ["pzt","sal","car","per","cum","cts","paz"],
+ ["pzt","sal","\xe7ar","per","cum","cts","paz"],
+ ];
+
+ $$d{"day_char"}=
+ [["Pt","S","Cr","Pr","C","Ct","P"],
+ ["Pt","S","\xc7","Pr","C","Ct","P"]];
+
+ $$d{"num_suff"}=
+ [[ "1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.",
+ "11.", "12.", "13.", "14.", "15.", "16.", "17.", "18.", "19.", "20.",
+ "21.", "22.", "23.", "24.", "25.", "26.", "27.", "28.", "29.", "30.",
+ "31."]];
+
+ $$d{"num_word"}=
+ [
+ ["birinci","ikinci","ucuncu","dorduncu",
+ "besinci","altinci","yedinci","sekizinci",
+ "dokuzuncu","onuncu","onbirinci","onikinci",
+ "onucuncu","ondordoncu",
+ "onbesinci","onaltinci","onyedinci","onsekizinci",
+ "ondokuzuncu","yirminci","yirmibirinci","yirmikinci",
+ "yirmiucuncu","yirmidorduncu",
+ "yirmibesinci","yirmialtinci","yirmiyedinci","yirmisekizinci",
+ "yirmidokuzuncu","otuzuncu","otuzbirinci"],
+ ["birinci","ikinci","\xfc\xe7\xfcnc\xfc","d\xf6rd\xfcnc\xfc",
+ "be\xfeinci","alt\xfdnc\xfd","yedinci","sekizinci",
+ "dokuzuncu","onuncu","onbirinci","onikinci",
+ "on\xfc\xe7\xfcnc\xfc","ond\xf6rd\xfcnc\xfc",
+ "onbe\xfeinci","onalt\xfdnc\xfd","onyedinci","onsekizinci",
+ "ondokuzuncu","yirminci","yirmibirinci","yirmikinci",
+ "yirmi\xfc\xe7\xfcnc\xfc","yirmid\xf6rd\xfcnc\xfc",
+ "yirmibe\xfeinci","yirmialt\xfdnc\xfd","yirmiyedinci","yirmisekizinci",
+ "yirmidokuzuncu","otuzuncu","otuzbirinci"]
+ ];
+
+ $$d{"now"} =["\xfeimdi", "simdi", "bugun","bug\xfcn"];
+ $$d{"last"} =["son", "sonuncu"];
+ $$d{"each"} =["her"];
+ $$d{"of"} =["of"];
+ $$d{"at"} =["saat"];
+ $$d{"on"} =["on"];
+ $$d{"future"} =["gelecek"];
+ $$d{"past"} =["ge\xe7mi\xfe", "gecmis","gecen", "ge\xe7en"];
+ $$d{"next"} =["gelecek","sonraki"];
+ $$d{"prev"} =["onceki","\xf6nceki"];
+ $$d{"later"} =["sonra"];
+
+ $$d{"exact"} =["tam"];
+ $$d{"approx"} =["yakla\xfe\xfdk", "yaklasik"];
+ $$d{"business"}=["i\xfe","\xe7al\xfd\xfema","is", "calisma"];
+
+ $$d{"offset"} =["d\xfcn","-0:0:0:1:0:0:0",
+ "dun", "-0:0:0:1:0:0:0",
+ "yar\xfdn","+0:0:0:1:0:0:0",
+ "yarin","+0:0:0:1:0:0:0"];
+
+ $$d{"times"} =["\xf6\xf0len","12:00:00",
+ "oglen","12:00:00",
+ "yarim","12:300:00",
+ "yar\xfdm","12:30:00",
+ "gece yar\xfds\xfd","00:00:00",
+ "gece yarisi","00:00:00"];
+
+ $$d{"years"} =["yil","y"];
+ $$d{"months"} =["ay","a"];
+ $$d{"weeks"} =["hafta", "h"];
+ $$d{"days"} =["gun","g"];
+ $$d{"hours"} =["saat"];
+ $$d{"minutes"} =["dakika","dak","d"];
+ $$d{"seconds"} =["saniye","sn",];
+ $$d{"replace"} =["s","saat"];
+
+ $$d{"sephm"} =':';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[.:,]';
+
+ $$d{"am"} = ["\xf6gleden \xf6nce","ogleden once"];
+ $$d{"pm"} = ["\xf6\xf0leden sonra","ogleden sonra"];
+}
+
+sub Date_Init_Danish {
+ print "DEBUG: Date_Init_Danish\n" if ($Curr{"Debug"} =~ /trace/);
+ my($d)=@_;
+
+ $$d{"month_name"}=
+ [["Januar","Februar","Marts","April","Maj","Juni",
+ "Juli","August","September","Oktober","November","December"]];
+ $$d{"month_abb"}=
+ [["Jan","Feb","Mar","Apr","Maj","Jun",
+ "Jul","Aug","Sep","Okt","Nov","Dec"]];
+
+ $$d{"day_name"}=
+ [["Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lordag","Sondag"],
+ ["Mandag","Tirsdag","Onsdag","Torsdag","Fredag","L\xf8rdag","S\xf8ndag"]];
+
+ $$d{"day_abb"}=
+ [["Man","Tis","Ons","Tor","Fre","Lor","Son"],
+ ["Man","Tis","Ons","Tor","Fre","L\xf8r","S\xf8n"]];
+ $$d{"day_char"}=
+ [["M","Ti","O","To","F","L","S"]];
+
+ $$d{"num_suff"}=
+ [["1:e","2:e","3:e","4:e","5:e","6:e","7:e","8:e","9:e","10:e",
+ "11:e","12:e","13:e","14:e","15:e","16:e","17:e","18:e","19:e","20:e",
+ "21:e","22:e","23:e","24:e","25:e","26:e","27:e","28:e","29:e","30:e",
+ "31:e"]];
+ $$d{"num_word"}=
+ [["forste","anden","tredie","fjerde","femte","sjette","syvende",
+ "ottende","niende","tiende","elfte","tolvte","trettende","fjortende",
+ "femtende","sekstende","syttende","attende","nittende","tyvende",
+ "enogtyvende","toogtyvende","treogtyvende","fireogtyvende","femogtyvende",
+ "seksogtyvende","syvogtyvende","otteogtyvende","niogtyvende",
+ "tredivte","enogtredivte"],
+ ["f\xf8rste","anden","tredie","fjerde","femte","sjette","syvende",
+ "ottende","niende","tiende","elfte","tolvte","trettende","fjortende",
+ "femtende","sekstende","syttende","attende","nittende","tyvende",
+ "enogtyvende","toogtyvende","treogtyvende","fireogtyvende","femogtyvende",
+ "seksogtyvende","syvogtyvende","otteogtyvende","niogtyvende",
+ "tredivte","enogtredivte"]];
+
+ $$d{"now"} =["idag","nu"];
+ $$d{"last"} =["forrige","sidste","nyeste"];
+ $$d{"each"} =["hver"];
+ $$d{"of"} =["om"];
+ $$d{"at"} =["kl","kl.","klokken"];
+ $$d{"on"} =["pa","p\xe5"];
+ $$d{"future"} =["om"];
+ $$d{"past"} =["siden"];
+ $$d{"next"} =["nasta","n\xe6ste"];
+ $$d{"prev"} =["forrige"];
+ $$d{"later"} =["senere"];
+
+ $$d{"exact"} =["pracist","pr\xe6cist"];
+ $$d{"approx"} =["circa"];
+ $$d{"business"}=["arbejdsdag","arbejdsdage"];
+
+ $$d{"offset"} =["ig\xe5r","-0:0:0:1:0:0:0","igar","-0:0:0:1:0:0:0",
+ "imorgen","+0:0:0:1:0:0:0"];
+ $$d{"times"} =["midt pa dagen","12:00:00","midt p\xe5 dagen","12:00:00",
+ "midnat","00:00:00"];
+
+ $$d{"years"} =["ar","\xe5r"];
+ $$d{"months"} =["man","maned","maneder","m\xe5n","m\xe5ned","m\xe5neder"];
+ $$d{"weeks"} =["u","uge","uger"];
+ $$d{"days"} =["d","dag","dage"];
+ $$d{"hours"} =["t","tim","time","timer"];
+ $$d{"minutes"} =["min","minut","minutter"];
+ $$d{"seconds"} =["s","sek","sekund","sekunder"];
+ $$d{"replace"} =["m","minut"];
+
+ $$d{"sephm"} ='[.:]';
+ $$d{"sepms"} =':';
+ $$d{"sepss"} ='[.:]';
+
+ $$d{"am"} = ["FM"];
+ $$d{"pm"} = ["EM"];
+}
+
+########################################################################
+# FROM MY PERSONAL LIBRARIES
+########################################################################
+
+no integer;
+
+# &ModuloAddition($N,$add,\$val,\$rem);
+# This calculates $val=$val+$add and forces $val to be in a certain range.
+# This is useful for adding numbers for which only a certain range is
+# allowed (for example, minutes can be between 0 and 59 or months can be
+# between 1 and 12). The absolute value of $N determines the range and
+# the sign of $N determines whether the range is 0 to N-1 (if N>0) or
+# 1 to N (N<0). The remainder (as modulo N) is added to $rem.
+# Example:
+# To add 2 hours together (with the excess returned in days) use:
+# &ModuloAddition(60,$s1,\$s,\$day);
+sub ModuloAddition {
+ my($N,$add,$val,$rem)=@_;
+ return if ($N==0);
+ $$val+=$add;
+ if ($N<0) {
+ # 1 to N
+ $N = -$N;
+ if ($$val>$N) {
+ $$rem+= int(($$val-1)/$N);
+ $$val = ($$val-1)%$N +1;
+ } elsif ($$val<1) {
+ $$rem-= int(-$$val/$N)+1;
+ $$val = $N-(-$$val % $N);
+ }
+
+ } else {
+ # 0 to N-1
+ if ($$val>($N-1)) {
+ $$rem+= int($$val/$N);
+ $$val = $$val%$N;
+ } elsif ($$val<0) {
+ $$rem-= int(-($$val+1)/$N)+1;
+ $$val = ($N-1)-(-($$val+1)%$N);
+ }
+ }
+}
+
+# $Flag=&IsInt($String [,$low, $high]);
+# Returns 1 if $String is a valid integer, 0 otherwise. If $low is
+# entered, $String must be >= $low. If $high is entered, $String must
+# be <= $high. It is valid to check only one of the bounds.
+sub IsInt {
+ my($N,$low,$high)=@_;
+ return 0 if (! defined $N or
+ $N !~ /^\s*[-+]?\d+\s*$/ or
+ defined $low && $N<$low or
+ defined $high && $N>$high);
+ return 1;
+}
+
+# $Pos=&SinLindex(\@List,$Str [,$offset [,$CaseInsensitive]]);
+# Searches for an exact string in a list.
+#
+# This is similar to RinLindex except that it searches for elements
+# which are exactly equal to $Str (possibly case insensitive).
+sub SinLindex {
+ my($listref,$Str,$offset,$Insensitive)=@_;
+ my($i,$len,$tmp)=();
+ $len=$#$listref;
+ return -2 if ($len<0 or ! $Str);
+ return -1 if (&Index_First(\$offset,$len));
+ $Str=uc($Str) if ($Insensitive);
+ for ($i=$offset; $i<=$len; $i++) {
+ $tmp=$$listref[$i];
+ $tmp=uc($tmp) if ($Insensitive);
+ return $i if ($tmp eq $Str);
+ }
+ return -1;
+}
+
+sub Index_First {
+ my($offsetref,$max)=@_;
+ $$offsetref=0 if (! $$offsetref);
+ if ($$offsetref < 0) {
+ $$offsetref += $max + 1;
+ $$offsetref=0 if ($$offsetref < 0);
+ }
+ return -1 if ($$offsetref > $max);
+ return 0;
+}
+
+# $File=&CleanFile($file);
+# This cleans up a path to remove the following things:
+# double slash /a//b -> /a/b
+# trailing dot /a/. -> /a
+# leading dot ./a -> a
+# trailing slash a/ -> a
+sub CleanFile {
+ my($file)=@_;
+ $file =~ s/\s*$//;
+ $file =~ s/^\s*//;
+ $file =~ s|//+|/|g; # multiple slash
+ $file =~ s|/\.$|/|; # trailing /. (leaves trailing slash)
+ $file =~ s|^\./|| # leading ./
+ if ($file ne "./");
+ $file =~ s|/$|| # trailing slash
+ if ($file ne "/");
+ return $file;
+}
+
+# $File=&ExpandTilde($file);
+# This checks to see if a "~" appears as the first character in a path.
+# If it does, the "~" expansion is interpreted (if possible) and the full
+# path is returned. If a "~" expansion is used but cannot be
+# interpreted, an empty string is returned.
+#
+# This is Windows/Mac friendly.
+# This is efficient.
+sub ExpandTilde {
+ my($file)=shift;
+ my($user,$home)=();
+ # ~aaa/bbb= ~ aaa /bbb
+ if ($file =~ s|^~([^/]*)||) {
+ $user=$1;
+ # Single user operating systems (Mac, MSWindows) don't have the getpwnam
+ # and getpwuid routines defined. Try to catch various different ways
+ # of knowing we are on one of these systems:
+ return "" if ($OS eq "Windows" or
+ $OS eq "Mac" or
+ $OS eq "Netware" or
+ $OS eq "MPE");
+ $user="" if (! defined $user);
+
+ if ($user) {
+ $home= (getpwnam($user))[7];
+ } else {
+ $home= (getpwuid($<))[7];
+ }
+ $home = VMS::Filespec::unixpath($home) if ($OS eq "VMS");
+ return "" if (! $home);
+ $file="$home/$file";
+ }
+ $file;
+}
+
+# $File=&FullFilePath($file);
+# Returns the full or relative path to $file (expanding "~" if necessary).
+# Returns an empty string if a "~" expansion cannot be interpreted. The
+# path does not need to exist. CleanFile is called.
+sub FullFilePath {
+ my($file)=shift;
+ my($rootpat) = '^/'; #default pattern to match absolute path
+ $rootpat = '^(\\|/|([A-Za-z]:[\\/]))' if ($OS eq 'Windows');
+ $file=&ExpandTilde($file);
+ return "" if (! $file);
+ return &CleanFile($file);
+}
+
+# $Flag=&CheckFilePath($file [,$mode]);
+# Checks to see if $file exists, to see what type it is, and whether
+# the script can access it. If it exists and has the correct mode, 1
+# is returned.
+#
+# $mode is a string which may contain any of the valid file test operator
+# characters except t, M, A, C. The appropriate test is run for each
+# character. For example, if $mode is "re" the -r and -e tests are both
+# run.
+#
+# An empty string is returned if the file doesn't exist. A 0 is returned
+# if the file exists but any test fails.
+#
+# All characters in $mode which do not correspond to valid tests are
+# ignored.
+sub CheckFilePath {
+ my($file,$mode)=@_;
+ my($test)=();
+ $file=&FullFilePath($file);
+ $mode = "" if (! defined $mode);
+
+ # Run tests
+ return 0 if (! defined $file or ! $file);
+ return 0 if (( ! -e $file) or
+ ($mode =~ /r/ && ! -r $file) or
+ ($mode =~ /w/ && ! -w $file) or
+ ($mode =~ /x/ && ! -x $file) or
+ ($mode =~ /R/ && ! -R $file) or
+ ($mode =~ /W/ && ! -W $file) or
+ ($mode =~ /X/ && ! -X $file) or
+ ($mode =~ /o/ && ! -o $file) or
+ ($mode =~ /O/ && ! -O $file) or
+ ($mode =~ /z/ && ! -z $file) or
+ ($mode =~ /s/ && ! -s $file) or
+ ($mode =~ /f/ && ! -f $file) or
+ ($mode =~ /d/ && ! -d $file) or
+ ($mode =~ /l/ && ! -l $file) or
+ ($mode =~ /s/ && ! -s $file) or
+ ($mode =~ /p/ && ! -p $file) or
+ ($mode =~ /b/ && ! -b $file) or
+ ($mode =~ /c/ && ! -c $file) or
+ ($mode =~ /u/ && ! -u $file) or
+ ($mode =~ /g/ && ! -g $file) or
+ ($mode =~ /k/ && ! -k $file) or
+ ($mode =~ /T/ && ! -T $file) or
+ ($mode =~ /B/ && ! -B $file));
+ return 1;
+}
+#&&
+
+# $Path=&FixPath($path [,$full] [,$mode] [,$error]);
+# Makes sure that every directory in $path (a colon separated list of
+# directories) appears as a full path or relative path. All "~"
+# expansions are removed. All trailing slashes are removed also. If
+# $full is non-nil, relative paths are expanded to full paths as well.
+#
+# If $mode is given, it may be either "e", "r", or "w". In this case,
+# additional checking is done to each directory. If $mode is "e", it
+# need ony exist to pass the check. If $mode is "r", it must have have
+# read and execute permission. If $mode is "w", it must have read,
+# write, and execute permission.
+#
+# The value of $error determines what happens if the directory does not
+# pass the test. If it is non-nil, if any directory does not pass the
+# test, the subroutine returns the empty string. Otherwise, it is simply
+# removed from $path.
+#
+# The corrected path is returned.
+sub FixPath {
+ my($path,$full,$mode,$err)=@_;
+ local($_)="";
+ my(@dir)=split(/$Cnf{"PathSep"}/,$path);
+ $full=0 if (! defined $full);
+ $mode="" if (! defined $mode);
+ $err=0 if (! defined $err);
+ $path="";
+ if ($mode eq "e") {
+ $mode="de";
+ } elsif ($mode eq "r") {
+ $mode="derx";
+ } elsif ($mode eq "w") {
+ $mode="derwx";
+ }
+
+ foreach (@dir) {
+
+ # Expand path
+ if ($full) {
+ $_=&FullFilePath($_);
+ } else {
+ $_=&ExpandTilde($_);
+ }
+ if (! $_) {
+ return "" if ($err);
+ next;
+ }
+
+ # Check mode
+ if (! $mode or &CheckFilePath($_,$mode)) {
+ $path .= $Cnf{"PathSep"} . $_;
+ } else {
+ return "" if ($err);
+ }
+ }
+ $path =~ s/^$Cnf{"PathSep"}//;
+ return $path;
+}
+#&&
+
+# $File=&SearchPath($file,$path [,$mode] [,@suffixes]);
+# Searches through directories in $path for a file named $file. The
+# full path is returned if one is found, or an empty string otherwise.
+# The file may exist with one of the @suffixes. The mode is checked
+# similar to &CheckFilePath.
+#
+# The first full path that matches the name and mode is returned. If none
+# is found, an empty string is returned.
+sub SearchPath {
+ my($file,$path,$mode,@suff)=@_;
+ my($f,$s,$d,@dir,$fs)=();
+ $path=&FixPath($path,1,"r");
+ @dir=split(/$Cnf{"PathSep"}/,$path);
+ foreach $d (@dir) {
+ $f="$d/$file";
+ $f=~ s|//|/|g;
+ return $f if (&CheckFilePath($f,$mode));
+ foreach $s (@suff) {
+ $fs="$f.$s";
+ return $fs if (&CheckFilePath($fs,$mode));
+ }
+ }
+ return "";
+}
+
+# @list=&ReturnList($str);
+# This takes a string which should be a comma separated list of integers
+# or ranges (5-7). It returns a sorted list of all integers referred to
+# by the string, or () if there is an invalid element.
+#
+# Negative integers are also handled. "-2--1" is equivalent to "-2,-1".
+sub ReturnList {
+ my($str)=@_;
+ my(@ret,@str,$from,$to,$tmp)=();
+ @str=split(/,/,$str);
+ foreach $str (@str) {
+ if ($str =~ /^[-+]?\d+$/) {
+ push(@ret,$str);
+ } elsif ($str =~ /^([-+]?\d+)-([-+]?\d+)$/) {
+ ($from,$to)=($1,$2);
+ if ($from>$to) {
+ $tmp=$from;
+ $from=$to;
+ $to=$tmp;
+ }
+ push(@ret,$from..$to);
+ } else {
+ return ();
+ }
+ }
+ @ret;
+}
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/Date/Manip.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,2755 @@
+# Copyright (c) 1995-2003 Sullivan Beck. All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+=head1 NAME
+
+Date::Manip - date manipulation routines
+
+=head1 SYNOPSIS
+
+ use Date::Manip;
+
+ $date = ParseDate(\@args);
+ $date = ParseDate($string);
+ $date = ParseDate(\$string);
+
+ @date = UnixDate($date,@format);
+ $date = UnixDate($date,@format);
+
+ $delta = ParseDateDelta(\@args);
+ $delta = ParseDateDelta($string);
+ $delta = ParseDateDelta(\$string);
+
+ @str = Delta_Format($delta,$dec,@format);
+ $str = Delta_Format($delta,$dec,@format);
+
+ $recur = ParseRecur($string,$base,$date0,$date1,$flags);
+ @dates = ParseRecur($string,$base,$date0,$date1,$flags);
+
+ $flag = Date_Cmp($date1,$date2);
+
+ $d = DateCalc($d1,$d2 [,$errref] [,$del]);
+
+ $date = Date_SetTime($date,$hr,$min,$sec);
+ $date = Date_SetTime($date,$time);
+
+ $date = Date_SetDateField($date,$field,$val [,$nocheck]);
+
+ $date = Date_GetPrev($date,$dow,$today,$hr,$min,$sec);
+ $date = Date_GetPrev($date,$dow,$today,$time);
+
+ $date = Date_GetNext($date,$dow,$today,$hr,$min,$sec);
+ $date = Date_GetNext($date,$dow,$today,$time);
+
+ $version = DateManipVersion;
+
+ $flag = Date_IsWorkDay($date [,$flag]);
+
+ $date = Date_NextWorkDay($date,$off [,$time]);
+ $date = Date_PrevWorkDay($date,$off [,$time]);
+
+ $name = Date_IsHoliday($date);
+
+ $listref = Events_List($date);
+ $listref = Events_List($date0,$date1);
+
+ &Date_Init();
+ &Date_Init("VAR=VAL","VAR=VAL",...);
+ @list = Date_Init();
+ @list = Date_Init("VAR=VAL","VAR=VAL",...);
+
+The above routines all check to make sure that Date_Init is called. If it
+hasn't been, they will call it automatically. As a result, there is usually
+no need to call Date_Init explicitely unless you want to change some of the
+config variables (described below).
+
+The following routines are used by the above routines (though they can also
+be called directly). $y may be entered as either a 2 or 4 digit year (it
+will be converted to a 4 digit year based on the variable YYtoYYYY
+described below). Month and day should be numeric in all cases. Most (if
+not all) of the information below can be gotten from UnixDate which is
+really the way I intended it to be gotten, but there are reasons to use
+these (these are significantly faster).
+
+***NOTE*** Unlike the routines listed above, the following routines do NOT
+explicitely call Date_Init. You must make sure that Date_Init has been
+called, either by you explicitely, or by one of the above routines before you
+use these routines.
+
+ $day = Date_DayOfWeek($m,$d,$y);
+ $secs = Date_SecsSince1970($m,$d,$y,$h,$mn,$s);
+ $secs = Date_SecsSince1970GMT($m,$d,$y,$h,$mn,$s);
+ $days = Date_DaysSince1BC($m,$d,$y);
+ $day = Date_DayOfYear($m,$d,$y);
+ $days = Date_DaysInYear($y);
+ $wkno = Date_WeekOfYear($m,$d,$y,$first);
+ $flag = Date_LeapYear($y);
+ $day = Date_DaySuffix($d);
+ $tz = Date_TimeZone();
+ ($y,$m,$d,$h,$mn,$s) = Date_NthDayOfYear($y,$n);
+
+=head1 DESCRIPTION
+
+This is a set of routines designed to make any common date/time
+manipulation easy to do. Operations such as comparing two times,
+calculating a time a given amount of time from another, or parsing
+international times are all easily done. From the very beginning, the main
+focus of Date::Manip has been to be able to do ANY desired date/time
+operation easily, not necessarily quickly. Also, it is definitely oriented
+towards the type of operations we (as people) tend to think of rather than
+those operations used routinely by computers. There are other modules that
+can do a subset of the operations available in Date::Manip much quicker
+than those presented here, so be sure to read the section SHOULD I USE
+DATE::MANIP below before deciding which of the Date and Time modules from
+CPAN is for you.
+
+Date::Manip deals with time as it is presented the Gregorian calendar (the
+one currently in use). The Julian calendar defined leap years as every 4th
+year. The Gregorian calendar improved this by making every 100th year NOT
+a leap year, unless it was also the 400th year. The Gregorian calendar has
+been extrapolated back to the year 0000 AD and forward to the year 9999 AD.
+Note that in historical context, the Julian calendar was in use until 1582
+when the Gregorian calendar was adopted by the Catholic church. Protestant
+countries did not accept it until later; Germany and Netherlands in 1698,
+British Empire in 1752, Russia in 1918. Note that the Gregorian calendar
+is itself imperfect and at some point will need to be corrected. No attempt
+is made to correct for that, and my great great great grandchildren will be
+long dead before this even occurs, so it's not an immediate concern. Yes,
+this is the same type of attitute that caused the great Y2K problem... but
+I have an excuse: I don't know what the correction will be, so I can't
+possible implement it. Nobody doubted that the year after 1999 would be
+known as 2000 :-).
+
+Date::Manip is therefore not equipped to truly deal with historical dates,
+but should be able to perform (virtually) any operation dealing with a
+modern time and date.
+
+Date::Manip has (or will have) functionality to work with several fundamental
+types of data.
+
+=over 4
+
+=item DATE
+
+Although the word date is used extensively here, it is actually somewhat
+misleading. Date::Manip works with the full date AND time (year, month,
+day, hour, minute, second and weeks when appropriate). It doesn't work
+with fractional seconds. Timezones are also supported to some extent.
+
+NOTE: Much better support for timezones (including Daylight Savings Time)
+is planned for the future.
+
+=item DELTA
+
+This refers to a duration or elapsed time. One thing to note is that, as
+used in this module, a delta refers only to the amount of time elapsed. It
+includes no information about a starting or ending time.
+
+=item RECURRENCE
+
+A recurrence is simply a notation for defining when a recurring event
+occurs. For example, if an event occurs every other Friday or every
+4 hours, this can be defined as a recurrence. With a recurrence and a
+starting and ending date, you can get a list of dates in that period when
+a recurring event occurs.
+
+=item GRAIN
+
+The granularity of a time basically refers to how accurate you wish to
+treat a date. For example, if you want to compare two dates to see if
+they are identical at a granularity of days, then they only have to occur
+on the same day. At a granularity of an hour, they have to occur within
+an hour of each other, etc.
+
+NOTE: Support for this will be added in the future.
+
+=item HOLIDAYS and EVENTS
+
+These are basically a named time. Holidays are used in business mode
+calculations. Events allow things like calendar and scheduling
+applications to be designed much more easily.
+
+=back
+
+Among other things, Date::Manip allow you to:
+
+1. Enter a date and be able to choose any format convenient
+
+2. Compare two dates, entered in widely different formats
+ to determine which is earlier
+
+3. Extract any information you want from ANY date using a
+ format string similar to the Unix date command
+
+4. Determine the amount of time between two dates
+
+5. Add a time offset to a date to get a second date (i.e.
+ determine the date 132 days ago or 2 years and 3 months
+ after Jan 2, 1992)
+
+6. Work with dates with dates using international formats
+ (foreign month names, 12/10/95 referring to October
+ rather than December, etc.).
+
+7. To find a list of dates where a recurring event happens.
+
+Each of these tasks is trivial (one or two lines at most) with this package.
+
+=head1 EXAMPLES
+
+In the documentation below, US formats are used, but in most (if not all)
+cases, a non-English equivalent will work equally well.
+
+1. Parsing a date from any convenient format
+
+ $date = ParseDate("today");
+ $date = ParseDate("1st thursday in June 1992");
+ $date = ParseDate("05/10/93");
+ $date = ParseDate("12:30 Dec 12th 1880");
+ $date = ParseDate("8:00pm december tenth");
+ if (! $date) {
+ # Error in the date
+ }
+
+2. Compare two dates
+
+ $date1 = ParseDate($string1);
+ $date2 = ParseDate($string2);
+ $flag = Date_Cmp($date1,$date2);
+ if ($flag<0) {
+ # date1 is earlier
+ } elsif ($flag==0) {
+ # the two dates are identical
+ } else {
+ # date2 is earlier
+ }
+
+3. Extract information from a date.
+
+ print &UnixDate("today","It is now %T on %b %e, %Y.");
+ => "It is now 13:24:08 on Feb 3, 1996."
+
+4. The amount of time between two dates.
+
+ $date1 = ParseDate($string1);
+ $date2 = ParseDate($string2);
+ $delta = DateCalc($date1,$date2,\$err);
+ => 0:0:WK:DD:HH:MM:SS the weeks, days, hours, minutes,
+ and seconds between the two
+ $delta = DateCalc($date1,$date2,\$err,1);
+ => YY:MM:WK:DD:HH:MM:SS the years, months, etc. between
+ the two
+
+ Read the documentation below for an explanation of the
+ difference.
+
+5. To determine a date a given offset from another.
+
+ $date = DateCalc("today","+ 3hours 12minutes 6 seconds",\$err);
+ $date = DateCalc("12 hours ago","12:30 6Jan90",\$err);
+
+ It even works with business days:
+
+ $date = DateCalc("today","+ 3 business days",\$err);
+
+6. To work with dates in another language.
+
+ &Date_Init("Language=French","DateFormat=non-US");
+ $date = ParseDate("1er decembre 1990");
+
+7. To find a list of dates where a recurring event happens
+ (including quite complex ones).
+
+ # To find the 2nd tuesday of every month
+ @date = ParseRecur("0:1*2:2:0:0:0",$base,$start,$stop);
+
+ # To find the Monday after easter in 1997-1999.
+ @date = ParseRecur("*1997-1999:0:0:0:0:0:0*EASTER,ND1");
+
+NOTE: Some date forms do not work as well in languages other than English,
+but this is not because Date::Manip is incapable of doing so (almost nothing
+in this module is language dependent). It is simply that I do not have the
+correct translation available for some words. If there is a date form that
+works in English but does not work in a language you need, let me know and
+if you can provide me the translation, I will fix Date::Manip.
+
+=head1 SHOULD I USE DATE::MANIP
+
+If you look in CPAN, you'll find that there are a number of Date and Time
+packages. Is Date::Manip the one you should be using? In my opinion, the
+answer is no most of the time. This sounds odd coming from the author of
+the software, but read on.
+
+Date::Manip is written entirely in perl. It's the most powerful of the
+date modules. It's also the biggest and slowest.
+
+Since Date::Manip is written entirely in perl, and depends on no other
+module not in a standard perl distribution, Date::Manip has no dependancies
+to meet. Other modules have dependancies on a C compiler or other perl
+modules. Since it is fairly easy to satisfy these dependancies for
+anyone who is reasonably familiar with perl modules, this is not a
+huge advantage that Date::Manip has.
+
+On the other hand, simpler perl modules tend to be faster than Date::Manip,
+and modules written in C are significantly faster than their perl
+counterparts (at least if they're done right). The TimeDate and
+Time-modules modules are written in perl, but are much simpler (and
+hence, faster) than Date::Manip. The Date::Calc module is written in C
+and is a good module for doing many date calculations much faster than
+Date::Manip. Between these three, most of your common date operations
+can be done.
+
+Date::Manip is certainly the most powerful of the Date modules. To the
+best of my knowledge, it will do everything that any other date module will
+do (not just the ones I listed above), and there are a number of features
+that Date::Manip has that none of the other modules have. Date::Manip is
+the "Swiss Army Knife" of Date modules. I'm trying to build a library
+which can do _EVERY_ conceivable date/time manipulation that you'll run
+into in everyday life.
+
+Although I am working on making Date::Manip faster, it will never be as
+fast as other modules. And before anyone asks, Date::Manip will never
+be translated to C (at least by me). I write C because I have to. I
+write perl because I like to. Date::Manip is something I do because it
+interests me, not something I'm paid for.
+
+Date::Manip is also big. The last time I looked, it's one of the largest
+CPAN modules there is. If you ignore modules like Tk, LWP, etc. which are
+actually packages of modules, it may be the largest. It's true that
+Date::Manip will do almost every date operation you could imagine... but
+you rarely need all that power. I'm working on reducing the footprint of
+Date::Manip, but even at it's slimmest, it'll outweigh the other modules by
+a good bit.
+
+If you are going to be using the module in cases where performance is an
+important factor (started up in a CGI program being run by your web server
+5,000 times a second), you should check out one of the other Date or Time
+modules in CPAN. If you're only doing fairly simple date operations
+(parsing common date formats, finding the difference between two dates,
+etc.), the other modules will almost certainly suffice. If you're doing
+one operation very repetitively (parsing 10,000 dates from a database), you
+are probably better off writing your own functions (perhaps bypassing all
+date modules entirely) designed specifically for your needs.
+
+On the other hand, if you want one solution for all your date needs, don't
+need peak speed, or are trying to do more exotic date operations,
+Date::Manip is for you. Operations on things like business dates, foreign
+language dates, holidays and other recurring events, etc. are available
+more-or-less exclusively in Date::Manip.
+
+=head1 ROUTINES
+
+=over 4
+
+=item ParseDate
+
+ $date = ParseDate(\@args);
+ $date = ParseDate($string);
+ $date = ParseDate(\$string);
+
+This takes an array or a string containing a date and parses it. When the
+date is included as an array (for example, the arguments to a program) the
+array should contain a valid date in the first one or more elements
+(elements after a valid date are ignored). Elements containing a valid
+date are shifted from the array. The largest possible number of elements
+which can be correctly interpreted as a valid date are always used. If a
+string is entered rather than an array, that string is tested for a valid
+date. The string is unmodified, even if passed in by reference.
+
+The real work is done in the ParseDateString routine.
+
+The ParseDate routine is primarily used to handle command line arguments.
+If you have a command where you want to enter a date as a command line
+argument, you can use Date::Manip to make something like the following
+work:
+
+ mycommand -date Dec 10 1997 -arg -arg2
+
+No more reading man pages to find out what date format is required in a
+man page.
+
+Historical note: this is originally why the Date::Manip routines were
+written (though long before they were released as the Date::Manip module).
+I was using a bunch of programs (primarily batch queue managers) where
+dates and times were entered as command line options and I was getting
+highly annoyed at the many different (but not compatible) ways that they
+had to be entered. Date::Manip originally consisted of basically 1 routine
+which I could pass "@ARGV" to and have it remove a date from the beginning.
+
+=item ParseDateString
+
+ $date = ParseDateString($string);
+
+This routine is called by ParseDate, but it may also be called directly
+to save some time (a negligable amount).
+
+NOTE: One of the most frequently asked questions that I have gotten
+is how to parse seconds since the epoch. ParseDateString cannot simply
+parse a number as the seconds since the epoch (it conflicts with some
+ISO-8601 date formats). There are two ways to get this information.
+First, you can do the following:
+
+ $secs = ... # seconds since Jan 1, 1970 00:00:00 GMT
+ $date = &DateCalc("Jan 1, 1970 00:00:00 GMT",$secs);
+
+Second, you can call it directly as:
+
+ $date = &ParseDateString("epoch $secs");
+
+To go backwards, just use the "%s" format of UnixDate:
+
+ $secs = &UnixDate($date,"%s");
+
+A full date actually includes 2 parts: date and time. A time must include
+hours and minutes and can optionally include seconds, fractional seconds,
+an am/pm type string, and a timezone. For example:
+
+ [at] HH:MN [Zone]
+ [at] HH:MN [am] [Zone]
+ [at] HH:MN:SS [am] [Zone]
+ [at] HH:MN:SS.SSSS [am] [Zone]
+ [at] HH am [Zone]
+
+Hours can be written using 1 or 2 digits, but the single digit form may
+only be used when no ambiguity is introduced (i.e. when it is not
+immediately preceded by a digit).
+
+A time is usually entered in 24 hour mode, but 12 hour mode can be used
+as well if AM/PM are entered (AM can be entered as AM or A.M. or other
+variations depending on the language).
+
+Fractional seconds are also supported in parsing but the fractional part is
+discarded (with NO rounding ocurring).
+
+Timezones always appear immediately after the time. A number of different
+forms are supported (see the section TIMEZONEs below).
+
+Incidentally, the time is removed from the date before the date is parsed,
+so the time may appear before or after the date, or between any two parts
+of the date.
+
+Valid date formats include the ISO 8601 formats:
+
+ YYYYMMDDHHMNSSF...
+ YYYYMMDDHHMNSS
+ YYYYMMDDHHMN
+ YYYYMMDDHH
+ YY-MMDDHHMNSSF...
+ YY-MMDDHHMNSS
+ YY-MMDDHHMN
+ YY-MMDDHH
+ YYYYMMDD
+ YYYYMM
+ YYYY
+ YY-MMDD
+ YY-MM
+ YY
+ YYYYwWWD ex. 1965-W02-2
+ YYwWWD
+ YYYYDOY ex. 1965-045
+ YYDOY
+
+In the above list, YYYY and YY signify 4 or 2 digit years, MM, DD, HH, MN, SS
+refer to two digit month, day, hour, minute, and second respectively. F...
+refers to fractional seconds (any number of digits) which will be ignored.
+The last 4 formats can be explained by example: 1965-w02-2 refers to Tuesday
+(day 2) of the 2nd week of 1965. 1965-045 refers to the 45th day of 1965.
+
+In all cases, parts of the date may be separated by dashes "-". If this is
+done, 1 or 2 digit forms of MM, DD, etc. may be used. All dashes are
+optional except for those given in the table above (which MUST be included
+for that format to be correctly parsed). So 19980820, 1998-0820,
+1998-08-20, 1998-8-20, and 199808-20 are all equivalent, but that date may
+NOT be written as 980820 (it must be written as 98-0820).
+
+NOTE: Even though not allowed in the standard, the timezone for an ISO-8601
+date is flexible and may be any of the timezones understood by Date::Manip.
+
+Additional date formats are available which may or may not be common including:
+
+ MM/DD **
+ MM/DD/YY **
+ MM/DD/YYYY **
+
+ mmmDD DDmmm mmmYYYY/DD mmmYYYY
+ mmmDD/YY DDmmmYY DD/YYmmm YYYYmmmDD YYYYmmm
+ mmmDDYYYY DDmmmYYYY DDYYYYmmm YYYY/DDmmm
+
+Where mmm refers to the name of a month. All parts of the date can be
+separated by valid separators (space, "/", or "."). The separator "-" may
+be used as long as it doesn't conflict with an ISO 8601 format, but this
+is discouraged since it is easy to overlook conflicts. For example, the
+format MM/DD/YY is just fine, but MM-DD-YY does not work since it conflicts
+with YY-MM-DD. To be safe, if "-" is used as a separator in a non-ISO
+format, they should be turned into "/" before calling the Date::Manip
+routines. As with ISO 8601 formats, all separators are optional except for
+those given as a "/" in the list above.
+
+** Note that with these formats, Americans tend to write month first, but
+many other countries tend to write day first. The latter behavior can be
+obtained by setting the config variable DateFormat to something other than
+"US" (see CUSTOMIZING DATE::MANIP below).
+
+Date separators are treated very flexibly (they are converted to spaces),
+so the following dates are all equivalent:
+
+ 12/10/1965
+ 12-10 / 1965
+ 12 // 10 -. 1965
+
+In some cases, this may actually be TOO flexible, but no attempt is made to
+trap this.
+
+Years can be entered as 2 or 4 digits, days and months as 1 or 2 digits.
+Both days and months must include 2 digits whenever they are immediately
+adjacent to another numeric part of the date or time. Date separators
+are required if single digit forms of DD or MM are used. If separators
+are not used, the date will either be unparsable or will get parsed
+incorrectly.
+
+Miscellaneous other allowed formats are:
+ which dofw in mmm in YY "first sunday in june 1996 at 14:00" **
+ dofw week num YY "sunday week 22 1995" **
+ which dofw YY "22nd sunday at noon" **
+ dofw which week YY "sunday 22nd week in 1996" **
+ next/last dofw "next friday at noon"
+ next/last week/month "next month"
+ in num days/weeks/months "in 3 weeks at 12:00"
+ num days/weeks/months later "3 weeks later"
+ num days/weeks/months ago "3 weeks ago"
+ dofw in num week "Friday in 2 weeks"
+ in num weeks dofw "in 2 weeks on friday"
+ dofw num week ago "Friday 2 weeks ago"
+ num week ago dofw "2 weeks ago friday"
+ last day in mmm in YY "last day of October"
+ dofw "Friday" (Friday of current week)
+ Nth "12th", "1st" (day of current month)
+ epoch SECS seconds since the epoch (negative values
+ are supported)
+
+** Note that the formats "sunday week 22" and "22nd sunday" give very
+different bahaviors. "sunday week 22" returns the sunday of the 22nd week
+of the year based on how week 1 is defined. ISO 8601 defines week one to
+contain Jan 4, so "sunday week 1" might be the first or second sunday of
+the current year, or the last sunday of the previous year. "22nd sunday"
+gives the actual 22nd time sunday occurs in a given year, regardless of the
+definition of a week.
+
+Note that certain words such as "in", "at", "of", etc. which commonly appear
+in a date or time are ignored. Also, the year is always optional.
+
+In addition, the following strings are recognized:
+ today (exactly now OR today at a given time if a time is specified)
+ now (synonym for today)
+ yesterday (exactly 24 hours ago unless a time is specified)
+ tomorrow (exactly 24 hours from now unless a time is specifed)
+ noon (12:00:00)
+ midnight (00:00:00)
+Other languages have similar (and in some cases additional) strings.
+
+Some things to note:
+
+All strings are case insensitive. "December" and "DEceMBer" both work.
+
+When a part of the date is not given, defaults are used: year defaults
+to current year; hours, minutes, seconds to 00.
+
+The year may be entered as 2 or 4 digits. If entered as 2 digits, it will
+be converted to a 4 digit year. There are several ways to do this based on
+the value of the YYtoYYYY variable (described below). The default behavior
+it to force the 2 digit year to be in the 100 year period CurrYear-89 to
+CurrYear+10. So in 1996, the range is [1907 to 2006], and the 2 digit year
+05 would refer to 2005 but 07 would refer to 1907. See CUSTOMIZING
+DATE::MANIP below for information on YYtoYYYY for other methods.
+
+Dates are always checked to make sure they are valid.
+
+In all of the formats, the day of week ("Friday") can be entered anywhere
+in the date and it will be checked for accuracy. In other words,
+ "Tue Jul 16 1996 13:17:00"
+will work but
+ "Jul 16 1996 Wednesday 13:17:00"
+will not (because Jul 16, 1996 is Tuesday, not Wednesday). Note that
+depending on where the weekday comes, it may give unexpected results when
+used in array context (with ParseDate). For example, the date
+("Jun","25","Sun","1990") would return June 25 of the current year since
+Jun 25, 1990 is not Sunday.
+
+The times "12:00 am", "12:00 pm", and "midnight" are not well defined. For
+good or bad, I use the following convention in Date::Manip:
+ midnight = 12:00am = 00:00:00
+ noon = 12:00pm = 12:00:00
+and the day goes from 00:00:00 to 23:59:59. In other words, midnight is the
+beginning of a day rather than the end of one. The time 24:00:00 is also
+allowed (though it is automatically transformed to 00:00:00 of the following
+day).
+
+The format of the date returned is YYYYMMDDHH:MM:SS. The advantage of this
+time format is that two times can be compared using simple string comparisons
+to find out which is later. Also, it is readily understood by a human.
+Alternate forms can be used if that is more convenient. See Date_Init below
+and the config variable Internal.
+
+NOTE: The format for the date is going to change at some point in the future
+to YYYYMMDDHH:MN:SS+HHMN*FLAGS. In order to maintain compatibility, you
+should use UnixDate to extract information from a date, and Date_Cmp to compare
+two dates. The simple string comparison will only work for dates in the same
+timezone.
+
+=item UnixDate
+
+ @date = UnixDate($date,@format);
+ $date = UnixDate($date,@format);
+
+This takes a date and a list of strings containing formats roughly
+identical to the format strings used by the UNIX date(1) command. Each
+format is parsed and an array of strings corresponding to each format is
+returned.
+
+$date may be any string that can be parsed by ParseDateString.
+
+The format options are:
+
+ Year
+ %y year - 00 to 99
+ %Y year - 0001 to 9999
+ %G year - 0001 to 9999 (see below)
+ %L year - 0001 to 9999 (see below)
+ Month, Week
+ %m month of year - 01 to 12
+ %f month of year - " 1" to "12"
+ %b,%h month abbreviation - Jan to Dec
+ %B month name - January to December
+ %U week of year, Sunday
+ as first day of week - 01 to 53
+ %W week of year, Monday
+ as first day of week - 01 to 53
+ Day
+ %j day of the year - 001 to 366
+ %d day of month - 01 to 31
+
+ %e day of month - " 1" to "31"
+ %v weekday abbreviation - " S"," M"," T"," W","Th"," F","Sa"
+ %a weekday abbreviation - Sun to Sat
+ %A weekday name - Sunday to Saturday
+ %w day of week - 1 (Monday) to 7 (Sunday)
+ %E day of month with suffix - 1st, 2nd, 3rd...
+ Hour
+ %H hour - 00 to 23
+ %k hour - " 0" to "23"
+ %i hour - " 1" to "12"
+ %I hour - 01 to 12
+ %p AM or PM
+ Minute, Second, Timezone
+ %M minute - 00 to 59
+ %S second - 00 to 59
+ %s seconds from 1/1/1970 GMT- negative if before 1/1/1970
+ %o seconds from Jan 1, 1970
+ in the current time zone
+ %Z timezone - "EDT"
+ %z timezone as GMT offset - "+0100"
+ Date, Time
+ %c %a %b %e %H:%M:%S %Y - Fri Apr 28 17:23:15 1995
+ %C,%u %a %b %e %H:%M:%S %z %Y - Fri Apr 28 17:25:57 EDT 1995
+ %g %a, %d %b %Y %H:%M:%S %z - Fri, 28 Apr 1995 17:23:15 EDT
+ %D,%x %m/%d/%y - 04/28/95
+ %l date in ls(1) format
+ %b %e $H:$M - Apr 28 17:23 (if within 6 months)
+ %b %e %Y - Apr 28 1993 (otherwise)
+ %r %I:%M:%S %p - 05:39:55 PM
+ %R %H:%M - 17:40
+ %T,%X %H:%M:%S - 17:40:58
+ %V %m%d%H%M%y - 0428174095
+ %Q %Y%m%d - 19961025
+ %q %Y%m%d%H%M%S - 19961025174058
+ %P %Y%m%d%H%M%S - 1996102517:40:58
+ %F %A, %B %e, %Y - Sunday, January 1, 1996
+ %J %G-W%W-%w - 1997-W02-2
+ %K %Y-%j - 1997-045
+ Other formats
+ %n insert a newline character
+ %t insert a tab character
+ %% insert a `%' character
+ %+ insert a `+' character
+ The following formats are currently unused but may be used in the future:
+ NO 1234567890 !@#$^&*()_|-=\`[];',./~{}:<>?
+ They currently insert the character following the %, but may (and probably
+ will) change in the future as new formats are added.
+
+If a lone percent is the final character in a format, it is ignored.
+
+Note that the ls format (%l) applies to date within the past OR future 6
+months!
+
+The %U, %W, %L, and %G formats are used to support the ISO-8601 format:
+YYYY-wWW-D. In this format, a date is written as a year, the week of
+the year, and the day of the week. Technically, the week may be considered
+to start on any day of the week, but Sunday and Monday are the two most
+common choices, so both are supported.
+
+The %U and %W formats return a week-of-year number from 01 to 53, and
+%L and %G return a 4-digit year corresponding to the week. Most of the
+time, the %L and %G formats returns the same value as the %Y format,
+but there is a problem with days occuring in the first or last week of
+the year.
+
+The ISO-8601 representation of Jan 1, 1993 written in the YYYY-wWWW-D
+format is actually 1992-W53-5. In other words, Jan 1 is treates as being
+in the last week of the preceding year. Depending on the year, days in
+the first week of a year may belong to the previous year, and days in the
+final week of a year may belong to the next year.
+
+The %L and %U formats contains the year and week-of-year values treating
+weeks as starting on Sunday. The %G and %W formats are the year and
+week-of-year values treating weeks as starting on Monday.
+
+%J returns the full ISO-8601 format (%G-W%W-%w).
+
+The formats used in this routine were originally based on date.pl (version
+3.2) by Terry McGonigal, as well as a couple taken from different versions
+of the Solaris date(1) command. Also, several have been added which are
+unique to Date::Manip.
+
+=item ParseDateDelta
+
+ $delta = ParseDateDelta(\@args);
+ $delta = ParseDateDelta($string);
+ $delta = ParseDateDelta(\$string);
+
+This takes an array and shifts a valid delta date (an amount of time)
+from the array. Recognized deltas are of the form:
+ +Yy +Mm +Ww +Dd +Hh +MNmn +Ss
+ examples:
+ +4 hours +3mn -2second
+ + 4 hr 3 minutes -2
+ 4 hour + 3 min -2 s
+ +Y:+M:+W:+D:+H:+MN:+S
+ examples:
+ 0:0:0:0:4:3:-2
+ +4:3:-2
+ mixed format
+ examples:
+ 4 hour 3:-2
+
+A field in the format +Yy is a sign, a number, and a string specifying
+the type of field. The sign is "+", "-", or absent (defaults to the
+next larger element). The valid strings specifying the field type
+are:
+ y: y, yr, year, years
+ m: m, mon, month, months
+ w: w, wk, ws, wks, week, weeks
+ d: d, day, days
+ h: h, hr, hour, hours
+ mn: mn, min, minute, minutes
+ s: s, sec, second, seconds
+
+Also, the "s" string may be omitted. The sign, number, and string may
+all be separated from each other by any number of whitespaces.
+
+In the date, all fields must be given in the order: Y M W D H MN S. Any
+number of them may be omitted provided the rest remain in the correct
+order. In the 2nd (colon) format, from 2 to 7 of the fields may be given.
+For example +D:+H:+MN:+S may be given to specify only four of the fields.
+In any case, both the MN and S field may be present. No spaces may be
+present in the colon format.
+
+Deltas may also be given as a combination of the two formats. For example,
+the following is valid: +Yy +D:+H:+MN:+S. Again, all fields must be given
+in the correct order.
+
+The word "in" may be given (prepended in English) to the delta ("in 5 years")
+and the word "ago" may be given (appended in English) ("6 months ago"). The
+"in" is completely ignored. The "ago" has the affect of reversing all signs
+that appear in front of the components of the delta. I.e. "-12 yr 6 mon ago"
+is identical to "+12yr +6mon" (don't forget that there is an implied minus
+sign in front of the 6 because when no sign is explicitly given, it carries
+the previously entered sign).
+
+One thing is worth noting. The year/month and day/hour/min/sec parts are
+returned in a "normalized" form. That is, the signs are adjusted so as to
+be all positive or all negative. For example, "+ 2 day - 2hour" does not
+return "0:0:0:2:-2:0:0". It returns "+0:0:0:1:22:0:0" (1 day 22 hours
+which is equivalent). I find (and I think most others agree) that this is
+a more useful form.
+
+Since the year/month and day/hour/min/sec parts must be normalized
+separately there is the possibility that the sign of the two parts will be
+different. So, the delta "+ 2years -10 months - 2 days + 2 hours" produces
+the delta "+1:2:-0:1:22:0:0".
+
+It is possible to include a sign for all elements that is output. See the
+configuration variable DeltaSigns below.
+
+NOTE: The internal format of the delta changed in version 5.30 from
+Y:M:D:H:MN:S to Y:M:W:D:H:MN:S . Also, it is going to change again at some
+point in the future to Y:M:W:D:H:MN:S*FLAGS . Use the routine Delta_Format
+to extract information rather than parsing it yourself.
+
+=item Delta_Format
+
+ @str = Delta_Format($delta,$dec,@format);
+ $str = Delta_Format($delta,$dec,@format);
+
+This is similar to the UnixDate routine except that it extracts information
+from a delta. Unlike the UnixDate routine, most of the formats are 2
+characters instead of 1.
+
+Formats currently understood are:
+
+ %Xv : the value of the field named X
+ %Xd : the value of the field X, and all smaller fields, expressed in
+ units of X
+ %Xh : the value of field X, and all larger fields, expressed in units
+ of X
+ %Xt : the value of all fields expressed in units of X
+
+ X is one of y,M,w,d,h,m,s (case sensitive).
+
+ %% : returns a "%"
+
+NOTE: Delta_Format only understands "exact" relationships, so for any delta
+that has a month component, there can be no mixing of the Y/M and
+W/D/H/MN/S segments. In other words, the delta 1:6:1:1:1:1:1 has a month
+component, so asking for the total number of years (using the %yd format)
+will return 1.5 (which is what 1 year 6 months is). For deltas which have
+NO month component, the relationship between years and days is known
+(365.25 is used) and all formats work as expected (except that formats with
+X equal to "M" are not allowed).
+
+So, the format "%hd" means the values of H, MN, and S expressed in hours.
+So for the delta "0:0:0:0:2:30:0", this format returns 2.5. Similarly, the
+format "%yd" means the value (in years) of both the Y and M fields, or,
+if the month component is 0, it uses Y, W, D, H, MN, S.
+
+The format "%hh" returns the value of W, D, and H expressed in hours if
+the month component is non-zero, or Y, W, D, H if the month component is 0.
+
+If $dec is non-zero, the %Xd and %Xt values are formatted to contain $dec
+decimal places.
+
+=item ParseRecur
+
+ $recur = ParseRecur($string [,$base,$date0,$date1,$flags]);
+ @dates = ParseRecur($string [,$base,$date0,$date1,$flags]);
+
+A recurrence refers to a recurring event. A fully specified recurrence
+requires (in most cases) 4 items: a recur description (describing the
+frequency of the event), a base date (a date when the event occurred and
+which other occurrences are based on), and a start and end date. There may
+be one or more flags included which modify the behavior of the recur
+description. The fully specified recurrence is written as:
+
+ recur*flags*base*date0*date1
+
+Here, base, date0, and date1 are any strings (which must not contain any
+asterixes) which can be parsed by ParseDate. flags is a comma separated
+list of flags (described below), and recur is a string describing a
+recurring event.
+
+If called in scalar context, it returns a string containing a fully
+specified recurrence (or as much of it as can be determined with
+unspecified fields left blank). In list context, it returns a list of all
+dates referred to by a recurrence if enough information is given in the
+recurrence. All dates returned are in the range:
+
+ date0 <= date < date1
+
+The argument $string can contain any of the parts of a full recurrence.
+For example:
+
+ recur
+ recur*flags
+ recur**base*date0*date1
+
+The only part which is required is the recur description. Any values
+contained in $string are overridden or modified by values passed in as
+parameters to ParseRecur.
+
+A recur description is a string of the format Y:M:W:D:H:MN:S . Exactly one
+of the colons may optionally be replaced by an asterisk, or an asterisk may
+be prepended to the string.
+
+Any value "N" to the left of the asterisk refers to the "Nth" one. Any
+value to the right of the asterisk refers to a value as it appears on a
+calendar/clock. Values to the right can be listed a single values, ranges
+(2 numbers separated by a dash "-"), or a comma separated list of values
+or ranges. In a few cases, negative values are appropriate.
+
+This is best illustrated by example.
+
+ 0:0:2:1:0:0:0 every 2 weeks and 1 day
+ 0:0:0:0:5:30:0 every 5 hours and 30 minutes
+ 0:0:0:2*12:30:0 every 2 days at 12:30 (each day)
+ 3*1:0:2:12:0:0 every 3 years on Jan 2 at noon
+ 0:1*0:2:12,14:0:0 2nd of every month at 12:00 and 14:00
+ 1:0:0*45:0:0:0 45th day of every year
+ 0:1*4:2:0:0:0 4th tuesday (day 2) of every month
+ 0:1*-1:2:0:0:0 last tuesday of every month
+ 0:1:0*-2:0:0:0 2nd to last day of every month
+ 0:0:3*2:0:0:0 every 3rd tuesday (every 3 weeks on 2nd day of week)
+ 1:0*12:2:0:0:0 tuesday of the 12th week of each year
+ *1990-1995:12:0:1:0:0:0
+ Dec 1 in 1990 through 1995
+
+ 0:1*2:0:0:0:0 the start of the 2nd week of every month (see Note 2)
+ 1*1:2:0:0:0:0 the start of the 2nd week in January each year (Note 2)
+
+I realize that this looks a bit cryptic, but after a discussion on the
+CALENDAR mailing list, it looked like there was no concise, flexible
+notation for handling recurring events. ISO 8601 notations were very bulky
+and lacked the flexibility I wanted. As a result, I developed this
+notation (based on crontab formats, but with much more flexibility) which
+fits in well with this module, and which is able to express every type of
+recurring event I could think of.
+
+NOTE: If a recurrence has a date0 and date1 in it AND a date0 and date1
+are passed in to the function, both sets of criteria apply. If flags are
+passed in, they override any flags in the recurrence UNLESS the flags
+passed in start with a plus (+) character in which case they are appended
+to the flags in the recurrence.
+
+NOTE: There is no way to express the following with a single recurrence:
+
+ every day at 12:30 and 1:00
+
+You have to use two recurrences to do this.
+
+NOTE: A recurrence specifying the week of a month is NOT clearly defined
+in common usage. What is the 1st week in a month? The behavior (with
+respect to this module) is well defined (using the FDn and FIn flags
+below), but in common usage, this is so ambiguous that this form should
+probably never be used. It is included here solely for the sake of
+completeness.
+
+NOTE: Depending on whether M and W are 0 or nonzero, D means different
+things. This is given in the following table.
+
+ M W D (when right of an asterisk) refers to
+ - - -------------------------------------------
+ 0 0 day of year (1-366)
+ M 0 day of month (1-31)
+ 0 W day of week (1-7), W refers to the week of year
+ M W the Wth (1-5 or -1 to -5) occurrence of Dth (1-7) day of week in month
+
+NOTE: Base dates are only used with some types of recurrences. For example,
+
+ 0:0:3*2:0:0:0 every 3rd tuesday
+
+requires a base date. If a base date is specified which doesn't match the
+criteria (for example, if a base date falling on Monday were passed in with
+this recurrence), the base date is moved forward to the first relevant date.
+
+Other dates do not require a base date. For example:
+
+ 0:0*3:2:0:0:0 third tuesday of every month
+
+A recurrence written in the above format does NOT provide default values
+for base, date0, or date1. They must be specified in order to get a list
+of dates.
+
+A base date is not used entirely. It is only used to provide the parts
+necessary for the left part of a recurrence. For example, the recurrence:
+
+ 1:3*0:4:0:0:0 every 1 year, 3 months on the 4th day of the month
+
+would only use the year and month of the base date.
+
+
+There are a small handful of English strings which can be parsed in place
+of a numerical recur description. These include:
+
+ every 2nd day [in 1997]
+ every 2nd day in June [1997]
+ 2nd day of every month [in 1997]
+ 2nd tuesday of every month [in 1997]
+ last tuesday of every month [in 1997]
+ every tuesday [in 1997]
+ every 2nd tuesday [in 1997]
+ every 2nd tuesday in June [1997]
+
+Each of these set base, date0, and date1 to a default value (the current
+year with Jan 1 being the base date is the default if the year and month
+are missing).
+
+The following flags (case insensitive) are understood:
+
+ MWn : n is 1-7. The first week of the month is the week
+ which contains the first occurrence of day n (1=Monday).
+ MW2 means that the first week contains the first Tuesday
+ of the month.
+ MDn : n is 1-7. The first week of the month contains the
+ actual date (1st through 7th). MD4 means that the first
+ week of the month contains the 4th of that month.
+
+ PDn : n is 1-7. Means the previous day n not counting today
+ PTn : n is 1-7. Means the previous day n counting today
+ NDn : n is 1-7. Means the next day n not counting today
+ NTn : n is 1-7. Means the next day n counting today
+
+ FDn : n is any number. Means step forward n days.
+ BDn : n is any number. Means step backward n days.
+ FWn : n is any number. Means step forward n workdays.
+ BWn : n is any number. Means step backward n workdays.
+
+ CWD : the closest work day (using the TomorrowFirst config variable).
+ CWN : the closest work day (looking forward first).
+ CWP : the closest work day (looking backward first).
+
+ NWD : next work day counting today
+ PWD : previous work day counting today
+ DWD : next/previous work day (TomorrowFirst config) counting today
+
+ EASTER: select easter for this year (the M, W, D fields are ignored
+ in the recur).
+
+NOTE: only one of MWn and MDn can be set. If both are set, only the
+last one is used. The default is MW7 (i.e. the first week contains
+the first Sunday).
+
+CWD, CWN, and CWP will usually return the same value, but if you are
+starting at the middle day of a 3-day weekend (for example), it will return
+either the first work day of the following week, or the last work day of
+the previous week depending on whether it looks forward or backward first.
+
+All flags are applied AFTER the recurrence dates are calculated, and they
+may move a date outside of the date0 to date1 range. No check is made for
+this.
+
+The workday flags do not act exactly the same as a business mode calculation.
+For example, a date that is Saturday with a FW1 steps forward to the first
+workday (i.e. Monday).
+
+=item Date_Cmp
+
+ $flag = Date_Cmp($date1,$date2);
+
+This takes two dates and compares them. Almost all dates can be compared
+using the perl "cmp" command. The only time this will not work is when
+comparing dates in different timezones. This routine will take that into
+account.
+
+NOTE: This routine currently does little more than use "cmp", but once
+the internal format for storing dates is in place (where timezone information
+is kept as part of the date), this routine will become more important. You
+should use this routine in prepartation for that version.
+
+=item DateCalc
+
+ $d = DateCalc($d1,$d2 [,\$err] [,$mode]);
+
+This takes two dates, deltas, or one of each and performs the appropriate
+calculation with them. Dates must be a string that can be parsed by
+&ParseDateString. Deltas must be a string that can be parsed by
+&ParseDateDelta. Two deltas add together to form a third delta. A date
+and a delta returns a 2nd date. Two dates return a delta (the difference
+between the two dates).
+
+Note that in many cases, it is somewhat ambiguous what the delta actually
+refers to. Although it is ALWAYS known how many months in a year, hours in
+a day, etc., it is NOT known how many days form a month. As a result, the
+part of the delta containing month/year and the part with sec/min/hr/day
+must be treated separately. For example, "Mar 31, 12:00:00" plus a delta
+of 1month 2days would yield "May 2 12:00:00". The year/month is first
+handled while keeping the same date. Mar 31 plus one month is Apr 31 (but
+since Apr only has 30 days, it becomes Apr 30). Apr 30 + 2 days is May 2.
+As a result, in the case where two dates are entered, the resulting delta
+can take on two different forms. By default ($mode=0), an absolutely
+correct delta (ignoring daylight savings time) is returned in days, hours,
+minutes, and seconds.
+
+If $mode is 1, the math is done using an approximate mode where a delta is
+returned using years and months as well. The year and month part is
+calculated first followed by the rest. For example, the two dates "Mar 12
+1995" and "Apr 13 1995" would have an exact delta of "31 days" but in the
+approximate mode, it would be returned as "1 month 1 day". Also, "Mar 31"
+and "Apr 30" would have deltas of "30 days" or "1 month" (since Apr 31
+doesn't exist, it drops down to Apr 30). Approximate mode is a more human
+way of looking at things (you'd say 1 month and 2 days more often then 33
+days), but it is less meaningful in terms of absolute time. In approximate
+mode $d1 and $d2 must be dates. If either or both is a delta, the
+calculation is done in exact mode.
+
+If $mode is 2, a business mode is used. That is, the calculation is done
+using business days, ignoring holidays, weekends, etc. In order to
+correctly use this mode, a config file must exist which contains the
+section defining holidays (see documentation on the config file below).
+The config file can also define the work week and the hours of the work
+day, so it is possible to have different config files for different
+businesses.
+
+For example, if a config file defines the workday as 08:00 to 18:00, a
+work week consisting of Mon-Sat, and the standard (American) holidays, then
+from Tuesday at 12:00 to the following Monday at 14:00 is 5 days and 2
+hours. If the "end" of the day is reached in a calculation, it
+automatically switches to the next day. So, Tuesday at 12:00 plus 6 hours
+is Wednesday at 08:00 (provided Wed is not a holiday). Also, a date that
+is not during a workday automatically becomes the start of the next
+workday. So, Sunday 12:00 and Monday at 03:00 both automatically becomes
+Monday at 08:00 (provided Monday is not a holiday). In business mode, any
+combination of date and delta may be entered, but a delta should not
+contain a year or month field (weeks are fine though).
+
+See below for some additional comments about business mode calculations.
+
+Note that a business week is treated the same as an exact week (i.e. from
+Tuesday to Tuesday, regardless of holidays). Because this means that the
+relationship between days and weeks is NOT unambiguous, when a delta is
+produced from two dates, it will be in terms of d/h/mn/s (i.e. no week
+field).
+
+If $mode is 3 (which only applies when two dates are passed in), an exact
+business mode is used. In this case, it returns a delta as an exact number
+of business days/hours/etc. between the two. Weeks, months, and years are
+ignored.
+
+Any other non-nil value of $mode is treated as $mode=1 (approximate mode).
+
+The mode can be automatically set in the dates/deltas passed by including a
+key word somewhere in it. For example, in English, if the word
+"approximately" is found in either of the date/delta arguments, approximate
+mode is forced. Likewise, if the word "business" or "exactly" appears,
+business/exact mode is forced (and $mode is ignored). So, the two
+following are equivalent:
+
+ $date = DateCalc("today","+ 2 business days",\$err);
+ $date = DateCalc("today","+ 2 days",\$err,2);
+
+Note that if the keyword method is used instead of passing in $mode, it is
+important that the keyword actually appear in the argument passed in to
+DateCalc. The following will NOT work:
+
+ $delta = ParseDateDelta("+ 2 business days");
+ $today = ParseDate("today");
+ $date = DateCalc($today,$delta,\$err);
+
+because the mode keyword is removed from a date/delta by the parse routines,
+and the mode is reset each time a parse routine is called. Since DateCalc
+parses both of its arguments, whatever mode was previously set is ignored.
+
+If \$err is passed in, it is set to:
+ 1 is returned if $d1 is not a delta or date
+ 2 is returned if $d2 is not a delta or date
+ 3 is returned if the date is outside the years 1000 to 9999
+This argument is optional, but if included, it must come before $mode.
+
+Nothing is returned if an error occurs.
+
+When a delta is returned, the signs such that it is strictly positive or
+strictly negative ("1 day - 2 hours" would never be returned for example).
+The only time when this cannot be enforced is when two deltas with a
+year/month component are entered. In this case, only the signs on the
+day/hour/min/sec part are standardized.
+
+=item Date_SetTime
+
+ $date = Date_SetTime($date,$hr,$min,$sec);
+ $date = Date_SetTime($date,$time);
+
+This takes a date (any string that may be parsed by ParseDateString) and
+sets the time in that date. For example, one way to get the time for 7:30
+tomorrow would be to use the lines:
+
+ $date = ParseDate("tomorrow");
+ $date = Date_SetTime($date,"7:30");
+
+Note that in this routine (as well as the other routines below which use
+a time argument), no real parsing is done on the times. As a result,
+
+ $date = Date_SetTime($date,"13:30");
+
+works, but
+
+ $date = Date_SetTime($date,"1:30 PM");
+
+doesn't.
+
+=item Date_SetDateField
+
+ $date = Date_SetDateField($date,$field,$val [,$nocheck]);
+
+This takes a date and sets one of it's fields to a new value. $field is
+any of the strings "y", "m", "d", "h", "mn", "s" (case insensitive) and
+$val is the new value.
+
+If $nocheck is non-zero, no check is made as to the validity of the date.
+
+=item Date_GetPrev
+
+ $date = Date_GetPrev($date,$dow, $curr [,$hr,$min,$sec]);
+ $date = Date_GetPrev($date,$dow, $curr [,$time]);
+ $date = Date_GetPrev($date,undef,$curr,$hr,$min,$sec);
+ $date = Date_GetPrev($date,undef,$curr,$time);
+
+This takes a date (any string that may be parsed by ParseDateString) and finds
+the previous occurrence of either a day of the week, or a certain time of day.
+
+If $dow is defined, the previous occurrence of the day of week is returned.
+$dow may either be a string (such as "Fri" or "Friday") or a number
+(between 1 and 7). The date of the previous $dow is returned.
+
+If $date falls on the day of week given by $dow, the date returned depends
+on $curr. If $curr is 0, the date returned is a week before $date. If
+$curr is 1, the date returned is the same as $date. If $curr is 2, the date
+returned (including the time information) is required to be before $date.
+
+If a time is passed in (either as separate hours, minutes, seconds or as a
+time in HH:MM:SS or HH:MM format), the time on this date is set to it. The
+following examples should illustrate the use of Date_GetPrev:
+
+ date dow curr time returns
+ Fri Nov 22 18:15:00 Thu any 12:30 Thu Nov 21 12:30:00
+ Fri Nov 22 18:15:00 Fri 0 12:30 Fri Nov 15 12:30:00
+ Fri Nov 22 18:15:00 Fri 1/2 12:30 Fri Nov 22 12:30:00
+
+ Fri Nov 22 18:15:00 Fri 1 18:30 Fri Nov 22 18:30:00
+ Fri Nov 22 18:15:00 Fri 2 18:30 Fri Nov 15 18:30:00
+
+If $dow is undefined, then a time must be entered, and the date returned is
+the previous occurrence of this time. If $curr is non-zero, the current
+time is returned if it matches the criteria passed in. In other words, the
+time returned is the last time that a digital clock (in 24 hour mode) would
+have displayed the time you passed in. If you define hours, minutes and
+seconds default to 0 and you might jump back as much as an entire day. If
+hours are undefined, you are looking for the last time the minutes/seconds
+appeared on the digital clock, so at most, the time will jump back one hour.
+
+ date curr hr min sec returns
+ Nov 22 18:15:00 0/1 18 undef undef Nov 22 18:00:00
+ Nov 22 18:15:00 0/1 18 30 0 Nov 21 18:30:00
+ Nov 22 18:15:00 0 18 15 undef Nov 21 18:15:00
+ Nov 22 18:15:00 1 18 15 undef Nov 22 18:15:00
+ Nov 22 18:15:00 0 undef 15 undef Nov 22 17:15:00
+ Nov 22 18:15:00 1 undef 15 undef Nov 22 18:15:00
+
+=item Date_GetNext
+
+ $date = Date_GetNext($date,$dow, $curr [,$hr,$min,$sec]);
+ $date = Date_GetNext($date,$dow, $curr [,$time]);
+ $date = Date_GetNext($date,undef,$curr,$hr,$min,$sec);
+ $date = Date_GetNext($date,undef,$curr,$time);
+
+Similar to Date_GetPrev.
+
+=item Date_IsHoliday
+
+ $name = Date_IsHoliday($date);
+
+This returns undef if $date is not a holiday, or a string containing the
+name of the holiday otherwise. An empty string is returned for an unnamed
+holiday.
+
+=item Events_List
+
+ $ref = Events_List($date);
+ $ref = Events_List($date ,0 [,$flag]);
+ $ref = Events_List($date0,$date1 [,$flag]);
+
+This returns a list of events. Events are defined in the Events section
+of the config file (discussed below).
+
+In the first form (a single argument), $date is any string containing a
+date. A list of events active at that precise time will be returned.
+The format is similar to when $flag=0, except only a single time will
+be returned.
+
+In all other cases, a range of times will be used. If the 2nd argument
+evaluates to 0, the range of times will be the 24 hour period from
+midnight to midnight containing $date. Otherwise, the range is given
+by the two dates.
+
+The value of $flag determines the format of the information that is
+returned.
+
+With $flag=0, the events are returned as a reference to a list of the form:
+
+ [ date, [ list_of_events ], date, [ list_of_events ], ... ]
+
+For example, if the following events are defined (using the syntax
+discussed below in the description of the Event section of the config
+file):
+
+ 2000-01-01 ; 2000-03-21 = Winter
+ 2000-03-22 ; 2000-06-21 = Spring
+ 2000-02-01 = Event1
+ 2000-05-01 = Event2
+ 2000-04-01-12:00:00 = Event3
+
+might result in the following output:
+
+ &Events_List("2000-04-01")
+ => [ 2000040100:00:00, [ Spring ] ]
+
+ &Events_List("2000-04-01 12:30");
+ => [ 2000040112:30:00, [ Spring, Event3 ] ]
+
+ &Events_List("2000-04-01",0);
+ => [ 2000040100:00:00, [ Spring ],
+ 2000040112:00:00, [ Spring, Event3 ],
+ 2000040113:00:00, [ Spring ] ]
+
+ &Events_List("2000-03-15","2000-04-10");
+ => [ 2000031500:00:00, [ Winter ],
+ 2000032200:00:00, [ Spring ]
+ 2000040112:00:00, [ Spring, Event3 ]
+ 2000040113:00:00, [ Spring ] ]
+
+Much more complicated events can be defined using recurrences.
+
+When $flag is non-zero, the format of the output is changed. If $flag
+is 1, then a tally of the amount of time given to each event is returned.
+Time for which two or more events apply is counted for both.
+
+ &Events_List("2000-03-15","2000-04-10",1);
+ => { Winter => +0:0:1:0:0:0:0,
+ Spring => +0:0:2:5:0:0:0,
+ Event3 => +0:0:0:0:1:0:0 }
+
+When $flag is 2, a more complex tally with no event counted twice is
+returned.
+
+ &Events_List("2000-03-15","2000-04-10",2);
+ => { Winter => +0:0:1:0:0:0:0,
+ Spring => +0:0:2:4:23:0:0,
+ Event3+Spring => +0:0:0:0:1:0:0 }
+
+The hash contains one element for each combination of events.
+
+=item Date_DayOfWeek
+
+ $day = Date_DayOfWeek($m,$d,$y);
+
+Returns the day of the week (1 for Monday, 7 for Sunday).
+
+All arguments must be numeric.
+
+=item Date_SecsSince1970
+
+ $secs = Date_SecsSince1970($m,$d,$y,$h,$mn,$s);
+
+Returns the number of seconds since Jan 1, 1970 00:00 (negative if date is
+earlier).
+
+All arguments must be numeric.
+
+=item Date_SecsSince1970GMT
+
+ $secs = Date_SecsSince1970GMT($m,$d,$y,$h,$mn,$s);
+
+Returns the number of seconds since Jan 1, 1970 00:00 GMT (negative if date
+is earlier). If CurrTZ is "IGNORE", the number will be identical to
+Date_SecsSince1970 (i.e. the date given will be treated as being in GMT).
+
+All arguments must be numeric.
+
+=item Date_DaysSince1BC
+
+ $days = Date_DaysSince1BC($m,$d,$y);
+
+Returns the number of days since Dec 31, 1BC. This includes the year 0000.
+
+All arguments must be numeric.
+
+=item Date_DayOfYear
+
+ $day = Date_DayOfYear($m,$d,$y);
+
+Returns the day of the year (001 to 366)
+
+All arguments must be numeric.
+
+=item Date_NthDayOfYear
+
+ ($y,$m,$d,$h,$mn,$s) = Date_NthDayOfYear($y,$n);
+
+Returns the year, month, day, hour, minutes, and decimal seconds given
+a floating point day of the year.
+
+All arguments must be numeric. $n must be greater than or equal to 1
+and less than 366 on non-leap years and 367 on leap years.
+
+NOTE: When $n is a decimal number, the results are non-intuitive perhaps.
+Day 1 is Jan 01 00:00. Day 2 is Jan 02 00:00. Intuitively, you
+might think of day 1.5 as being 1.5 days after Jan 01 00:00, but this
+would mean that Day 1.5 was Jan 02 12:00 (which is later than Day 2).
+The best way to think of this function is a timeline starting at 1 and
+ending at 366 (in a non-leap year). In terms of a delta, think of $n
+as the number of days after Dec 31 00:00 of the previous year.
+
+=item Date_DaysInYear
+
+ $days = Date_DaysInYear($y);
+
+Returns the number of days in the year (365 or 366)
+
+=item Date_DaysInMonth
+
+ $days = Date_DaysInMonth($m,$y);
+
+Returns the number of days in the month.
+
+=item Date_WeekOfYear
+
+ $wkno = Date_WeekOfYear($m,$d,$y,$first);
+
+Figure out week number. $first is the first day of the week which is
+usually 1 (Monday) or 7 (Sunday), but could be any number between 1 and 7
+in practice.
+
+All arguments must be numeric.
+
+NOTE: This routine should only be called in rare cases. Use UnixDate with
+the %W, %U, %J, %L formats instead. This routine returns a week between 0
+and 53 which must then be "fixed" to get into the ISO-8601 weeks from 1 to
+53. A date which returns a week of 0 actually belongs to the last week of
+the previous year. A date which returns a week of 53 may belong to the
+first week of the next year.
+
+=item Date_LeapYear
+
+ $flag = Date_LeapYear($y);
+
+Returns 1 if the argument is a leap year
+Written by David Muir Sharnoff <muir@idiom.com>
+
+=item Date_DaySuffix
+
+ $day = Date_DaySuffix($d);
+
+Add `st', `nd', `rd', `th' to a date (ie 1st, 22nd, 29th). Works for
+international dates.
+
+=item Date_TimeZone
+
+ $tz = Date_TimeZone;
+
+This determines and returns the local timezone. If it is unable to determine
+the local timezone, the following error occurs:
+
+ ERROR: Date::Manip unable to determine TimeZone.
+
+See The TIMEZONES section below for more information.
+
+=item Date_ConvTZ
+
+ $date = Date_ConvTZ($date);
+ $date = Date_ConvTZ($date,$from);
+ $date = Date_ConvTZ($date,"",$to);
+ $date = Date_ConvTZ($date,$from,$to);
+
+This converts a date (which MUST be in the format returned by ParseDate)
+from one timezone to another.
+
+If it is called with no arguments, the date is converted from the local
+timezone to the timezone specified by the config variable ConvTZ (see
+documentation on ConvTZ below). If ConvTZ is set to "IGNORE", no
+conversion is done.
+
+If called with $from but no $to, the timezone is converted from the
+timezone in $from to ConvTZ (of TZ if ConvTZ is not set). Again, no
+conversion is done if ConvTZ is set to "IGNORE".
+
+If called with $to but no $from, $from defaults to ConvTZ (if set) or the
+local timezone otherwise. Although this does not seem immediately obvious,
+it actually makes sense. By default, all dates that are parsed are
+converted to ConvTZ, so most of the dates being worked with will be stored
+in that timezone.
+
+If Date_ConvTZ is called with both $from and $to, the date is converted
+from the timezone $from to $to.
+
+NOTE: As in all other cases, the $date returned from Date_ConvTZ has no
+timezone information included as part of it, so calling UnixDate with the
+"%z" format will return the timezone that Date::Manip is working in
+(usually the local timezone).
+
+Example: To convert 2/2/96 noon PST to CST (regardless of what timezone
+you are in, do the following:
+
+ $date = ParseDate("2/2/96 noon");
+ $date = Date_ConvTZ($date,"PST","CST");
+
+Both timezones MUST be in one of the formats listed below in the section
+TIMEZONES.
+
+=item Date_Init
+
+ &Date_Init();
+ &Date_Init("VAR=VAL","VAR=VAL",...);
+ @list = Date_Init();
+ @list = Date_Init("VAR=VAL","VAR=VAL",...);
+
+Normally, it is not necessary to explicitly call Date_Init. The first
+time any of the other routines are called, Date_Init will be called to set
+everything up. If for some reason you want to change the configuration of
+Date::Manip, you can pass the appropriate string or strings into Date_Init
+to reinitialize things.
+
+The strings to pass in are of the form "VAR=VAL". Any number may be
+included and they can come in any order. VAR may be any configuration
+variable. A list of all configuration variables is given in the section
+CUSTOMIZING DATE::MANIP below. VAL is any allowed value for that variable.
+For example, to switch from English to French and use non-US format (so
+that 12/10 is Oct 12), do the following:
+
+ &Date_Init("Language=French","DateFormat=non-US");
+
+If Date_Init is called in list context, it will return a list of all
+config variables and their values suitable for passing in to Date_Init
+to return Date::Manip to the current state. The only possible problem is
+that by default, holidays will not be erased, so you may need to prepend
+the "EraseHolidays=1" element to the list.
+
+=item Date_IsWorkDay
+
+ $flag = Date_IsWorkDay($date [,$flag]);
+
+This returns 1 if $date is a work day. If $flag is non-zero, the time is
+checked to see if it falls within work hours. It returns an empty string
+if $date is not valid.
+
+=item Date_NextWorkDay
+
+ $date = Date_NextWorkDay($date,$off [,$time]);
+
+Finds the day $off work days from now. If $time is passed in, we must also
+take into account the time of day.
+
+If $time is not passed in, day 0 is today (if today is a workday) or the
+next work day if it isn't. In any case, the time of day is unaffected.
+
+If $time is passed in, day 0 is now (if now is part of a workday) or the
+start of the very next work day.
+
+=item Date_PrevWorkDay
+
+ $date = Date_PrevWorkDay($date,$off [,$time]);
+
+Similar to Date_NextWorkDay.
+
+=item Date_NearestWorkDay
+
+ $date = Date_NearestWorkDay($date [,$tomorrowfirst]);
+
+This looks for the work day nearest to $date. If $date is a work day, it
+is returned. Otherwise, it will look forward or backwards in time 1 day
+at a time until a work day is found. If $tomorrowfirst is non-zero (or if
+it is omitted and the config variable TomorrowFirst is non-zero), we look
+to the future first. Otherwise, we look in the past first. In other words,
+in a normal week, if $date is Wednesday, $date is returned. If $date is
+Saturday, Friday is returned. If $date is Sunday, Monday is returned. If
+Wednesday is a holiday, Thursday is returned if $tomorrowfirst is non-nil
+or Tuesday otherwise.
+
+=item DateManipVersion
+
+ $version = DateManipVersion;
+
+Returns the version of Date::Manip.
+
+=back
+
+=head1 TIMEZONES
+
+The following timezone names are currently understood (and can be used in
+parsing dates). These are zones defined in RFC 822.
+
+ Universal: GMT, UT
+ US zones : EST, EDT, CST, CDT, MST, MDT, PST, PDT
+ Military : A to Z (except J)
+ Other : +HHMM or -HHMM
+ ISO 8601 : +HH:MM, +HH, -HH:MM, -HH
+
+In addition, the following timezone abbreviations are also accepted. In a
+few cases, the same abbreviation is used for two different timezones (for
+example, NST stands for Newfoundland Standard -0330 and North Sumatra +0630).
+In these cases, only 1 of the two is available. The one preceded by a "#"
+sign is NOT available but is documented here for completeness. This list of
+zones comes in part from the Time::Zone module by Graham Barr, David Muir
+Sharnoff, and Paul Foley (with several additions by myself).
+
+ IDLW -1200 International Date Line West
+ NT -1100 Nome
+ HST -1000 Hawaii Standard
+ CAT -1000 Central Alaska
+ AHST -1000 Alaska-Hawaii Standard
+ AKST -0900 Alaska Standard
+ YST -0900 Yukon Standard
+ HDT -0900 Hawaii Daylight
+ AKDT -0800 Alaska Daylight
+ YDT -0800 Yukon Daylight
+ PST -0800 Pacific Standard
+ PDT -0700 Pacific Daylight
+ MST -0700 Mountain Standard
+ MDT -0600 Mountain Daylight
+ CST -0600 Central Standard
+ CDT -0500 Central Daylight
+ EST -0500 Eastern Standard
+ ACT -0500 Brazil, Acre
+ SAT -0400 Chile
+ BOT -0400 Bolivia
+ EDT -0400 Eastern Daylight
+ AST -0400 Atlantic Standard
+ AMT -0400 Brazil, Amazon
+ ACST -0400 Brazil, Acre Daylight
+ #NST -0330 Newfoundland Standard nst=North Sumatra +0630
+ NFT -0330 Newfoundland
+ #GST -0300 Greenland Standard gst=Guam Standard +1000
+ #BST -0300 Brazil Standard bst=British Summer +0100
+ BRST -0300 Brazil Standard
+ BRT -0300 Brazil Standard
+ AMST -0300 Brazil, Amazon Daylight
+ ADT -0300 Atlantic Daylight
+ ART -0300 Argentina
+ NDT -0230 Newfoundland Daylight
+ AT -0200 Azores
+ BRST -0200 Brazil Daylight (official time)
+ FNT -0200 Brazil, Fernando de Noronha
+ WAT -0100 West Africa
+ FNST -0100 Brazil, Fernando de Noronha Daylight
+ GMT +0000 Greenwich Mean
+ UT +0000 Universal (Coordinated)
+ UTC +0000 Universal (Coordinated)
+ WET +0000 Western European
+ CET +0100 Central European
+ FWT +0100 French Winter
+ MET +0100 Middle European
+ MEZ +0100 Middle European
+ MEWT +0100 Middle European Winter
+ SWT +0100 Swedish Winter
+ BST +0100 British Summer bst=Brazil standard -0300
+ GB +0100 GMT with daylight savings
+ WEST +0000 Western European Daylight
+ CEST +0200 Central European Summer
+ EET +0200 Eastern Europe, USSR Zone 1
+ FST +0200 French Summer
+ MEST +0200 Middle European Summer
+ MESZ +0200 Middle European Summer
+ METDST +0200 An alias for MEST used by HP-UX
+ SAST +0200 South African Standard
+ SST +0200 Swedish Summer sst=South Sumatra +0700
+ EEST +0300 Eastern Europe Summer
+ BT +0300 Baghdad, USSR Zone 2
+ MSK +0300 Moscow
+ EAT +0300 East Africa
+ IT +0330 Iran
+ ZP4 +0400 USSR Zone 3
+ MSD +0300 Moscow Daylight
+ ZP5 +0500 USSR Zone 4
+ IST +0530 Indian Standard
+ ZP6 +0600 USSR Zone 5
+ NOVST +0600 Novosibirsk time zone, Russia
+ NST +0630 North Sumatra nst=Newfoundland Std -0330
+ #SST +0700 South Sumatra, USSR Zone 6 sst=Swedish Summer +0200
+ JAVT +0700 Java
+ CCT +0800 China Coast, USSR Zone 7
+ AWST +0800 Australian Western Standard
+ WST +0800 West Australian Standard
+ PHT +0800 Asia Manila
+ JST +0900 Japan Standard, USSR Zone 8
+ ROK +0900 Republic of Korea
+ ACST +0930 Australian Central Standard
+ CAST +0930 Central Australian Standard
+ AEST +1000 Australian Eastern Standard
+ EAST +1000 Eastern Australian Standard
+ GST +1000 Guam Standard, USSR Zone 9 gst=Greenland Std -0300
+ ACDT +1030 Australian Central Daylight
+ CADT +1030 Central Australian Daylight
+ AEDT +1100 Australian Eastern Daylight
+ EADT +1100 Eastern Australian Daylight
+ IDLE +1200 International Date Line East
+ NZST +1200 New Zealand Standard
+ NZT +1200 New Zealand
+ NZDT +1300 New Zealand Daylight
+
+Others can be added in the future upon request.
+
+Date::Manip must be able to determine the timezone the user is in. It does
+this by looking in the following places:
+
+ $Date::Manip::TZ (set with Date_Init or in Manip.pm)
+ $ENV{TZ}
+ the unix `date` command (if available)
+ $main::TZ
+ /etc/TIMEZONE
+ /etc/timezone
+
+At least one of these should contain a timezone in one of the supported
+forms. If none do by default, the TZ variable must be set with Date_Init.
+
+The timezone may be in the STD#DST format (in which case both abbreviations
+must be in the table above) or any of the formats described above. The
+STD#DST format is NOT available when parsing a date however. The following
+forms are also available and are treated similar to the STD#DST forms:
+
+ US/Pacific
+ US/Mountain
+ US/Central
+ US/Eastern
+ Canada/Pacific
+ Canada/Mountain
+ Canada/Central
+ Canada/Eastern
+
+=head1 BUSINESS MODE
+
+Anyone using business mode is going to notice a few quirks about it which
+should be explained. When I designed business mode, I had in mind what UPS
+tells me when they say 2 day delivery, or what the local business which
+promises 1 business day turnaround really means.
+
+If you do a business day calculation (with the workday set to 9:00-5:00),
+you will get the following:
+
+ Saturday at noon + 1 business day = Tuesday at 9:00
+ Saturday at noon - 1 business day = Friday at 9:00
+
+What does this mean?
+
+We have a business that works 9-5 and they have a drop box so I can drop
+things off over the weekend and they promise 1 business day turnaround. If
+I drop something off Friday night, Saturday, or Sunday, it doesn't matter.
+They're going to get started on it Monday morning. It'll be 1 business day
+to finish the job, so the earliest I can expect it to be done is around
+17:00 Monday or 9:00 Tuesday morning. Unfortunately, there is some
+ambiguity as to what day 17:00 really falls on, similar to the ambiguity
+that occurs when you ask what day midnight falls on. Although it's not the
+only answer, Date::Manip treats midnight as the beginning of a day rather
+than the end of one. In the same way, 17:00 is equivalent to 9:00 the next
+day and any time the date calculations encounter 17:00, it automatically
+switch to 9:00 the next day. Although this introduces some quirks, I think
+this is justified. You just have to treat 17:00/9:00 as being ambiguous
+(in the same way you treat midnight as being ambiguous).
+
+Equivalently, if I want a job to be finished on Saturday (despite the fact
+that I cannot pick it up since the business is closed), I have to drop it
+off no later than Friday at 9:00. That gives them a full business day to
+finish it off. Of course, I could just as easily drop it off at 17:00
+Thursday, or any time between then and 9:00 Friday. Again, it's a matter
+of treating 9:00 as ambiguous.
+
+So, in case the business date calculations ever produce results that you
+find confusing, I believe the solution is to write a wrapper which,
+whenever it sees a date with the time of exactly 9:00, it treats it
+specially (depending on what you want.
+
+So Saturday + 1 business day = Tuesday at 9:00 (which means anything
+from Monday 17:00 to Tuesday 9:00), but Monday at 9:01 + 1 business
+day = Tuesday at 9:01 which is exact.
+
+If this is not exactly what you have in mind, don't use the DateCalc
+routine. You can probably get whatever behavior you want using the
+routines Date_IsWorkDay, Date_NextWorkDay, and Date_PrevWorkDay described
+above.
+
+=head1 CUSTOMIZING DATE::MANIP
+
+There are a number of variables which can be used to customize the way
+Date::Manip behaves. There are also several ways to set these variables.
+
+At the top of the Manip.pm file, there is a section which contains all
+customization variables. These provide the default values.
+
+These can be overridden in a global config file if one is present (this
+file is optional). If the GlobalCnf variable is set in the Manip.pm file,
+it contains the full path to a config file. If the file exists, it's
+values will override those set in the Manip.pm file. A sample config file
+is included with the Date::Manip distribution. Modify it as appropriate
+and copy it to some appropriate directory and set the GlobalCnf variable in
+the Manip.pm file.
+
+Each user can have a personal config file which is of the same form as the
+global config file. The variables PersonalCnf and PersonalCnfPath set the
+name and search path for the personal config file. This file is also
+optional. If present, it overrides any values set in the global file.
+
+NOTE: if you use business mode calculations, you must have a config file
+(either global or personal) since this is the only place where you can
+define holidays.
+
+Finally, any variables passed in through Date_Init override all other
+values.
+
+A config file can be composed of several sections. The first section sets
+configuration variables. Lines in this section are of the form:
+
+ VARIABLE = VALUE
+
+For example, to make the default language French, include the line:
+
+ Language = French
+
+Only variables described below may be used. Blank lines and lines beginning
+with a pound sign (#) are ignored. All spaces are optional and strings are
+case insensitive.
+
+A line which starts with an asterisk (*) designates a new section. For
+example, the HOLIDAY section starts with a line:
+
+ *Holiday
+
+The various sections are defined below.
+
+=head1 DATE::MANIP VARIABLES
+
+All Date::Manip variables which can be used are described in the following
+section.
+
+=over 4
+
+=item IgnoreGlobalCnf
+
+If this variable is used (any value is ignored), the global config file
+is not read. It must be present in the initial call to Date_Init or the
+global config file will be read.
+
+=item EraseHolidays
+
+If this variable is used (any value is ignored), the current list of
+defined holidays is erased. A new set will be set the next time a
+config file is read in. This can be set in either the global config file
+or as a Date_Init argument (in which case holidays can be read in from
+both the global and personal config files) or in the personal config file
+(in which case, only holidays in the personal config file are counted).
+
+=item PathSep
+
+This is a regular expression used to separate multiple paths. For example,
+on Unix, it defaults to a colon (:) so that multiple paths can be written
+PATH1:PATH2 . For Win32 platforms, it defaults to a semicolon (;) so that
+paths such as "c:\;d:\" will work.
+
+=item GlobalCnf
+
+This variable can be passed into Date_Init to point to a global
+configuration file. The value must be the complete path to a config file.
+
+By default, no global config file is read. Any time a global config file
+is read, the holidays are erased.
+
+Paths may have a tilde (~) expansion on platforms where this is supported
+(currently Unix and VMS).
+
+=item PersonalCnf
+
+This variable can be passed into Date_Init or set in a global config file
+to set the name of the personal configuration file.
+
+The default name for the config file is .DateManip.cnf on all Unix
+platforms and Manip.cnf on all non-Unix platforms (because some of them
+insist on 8.3 character filenames :-).
+
+=item PersonalCnfPath
+
+This is a list of paths separated by the separator specified by the PathSep
+variable. These paths are each checked for the PersonalCnf config file.
+
+Paths may have a tilde (~) expansion on platforms where this is supported
+(currently Unix and VMS).
+
+=item Language
+
+Date::Manip can be used to parse dates in many different languages.
+Currently, it is configured to read the following languages (the version
+in which they added is included for historical interest):
+
+ English (default)
+ French (5.02)
+ Swedish (5.05)
+ German (5.31)
+ Dutch (5.32) aka Nederlands
+ Polish (5.32)
+ Spanish (5.33)
+ Portuguese (5.34)
+ Romanian (5.35)
+ Italian (5.35)
+ Russian (5.41)
+ Turkish (5.41)
+ Danish (5.41)
+
+Others can be added easily. Language is set to the language used to parse
+dates. If you are interested in providing a translation for a new
+language, email me (see the AUTHOR section below) and I'll send you a list
+of things that I need.
+
+=item DateFormat
+
+Different countries look at the date 12/10 as Dec 10 or Oct 12. In the
+United States, the first is most common, but this certainly doesn't hold
+true for other countries. Setting DateFormat to "US" forces the first
+behavior (Dec 10). Setting DateFormat to anything else forces the second
+behavior (Oct 12).
+
+=item TZ
+
+If set, this defines the local timezone. See the TIMEZONES section above
+for information on it's format.
+
+=item ConvTZ
+
+All date comparisons and calculations must be done in a single time zone in
+order for them to work correctly. So, when a date is parsed, it should be
+converted to a specific timezone. This allows dates to easily be compared
+and manipulated as if they are all in a single timezone.
+
+The ConvTZ variable determines which timezone should be used to store dates
+in. If it is left blank, all dates are converted to the local timezone
+(see the TZ variable above). If it is set to one of the timezones listed
+above, all dates are converted to this timezone. Finally, if it is set to
+the string "IGNORE", all timezone information is ignored as the dates are
+read in (in this case, the two dates "1/1/96 12:00 GMT" and "1/1/96 12:00
+EST" would be treated as identical).
+
+=item Internal
+
+When a date is parsed using ParseDate, that date is stored in an internal
+format which is understood by the Date::Manip routines UnixDate and
+DateCalc. Originally, the format used to store the date internally was:
+
+ YYYYMMDDHH:MN:SS
+
+It has been suggested that I remove the colons (:) to shorten this to:
+
+ YYYYMMDDHHMNSS
+
+The main advantage of this is that some databases are colon delimited which
+makes storing a date from Date::Manip tedious.
+
+In order to maintain backwards compatibility, the Internal variable was
+introduced. Set it to 0 (to use the old format) or 1 (to use the new
+format).
+
+=item FirstDay
+
+It is sometimes necessary to know what day of week is regarded as first.
+By default, this is set to Monday, but many countries and people will
+prefer Sunday (and in a few cases, a different day may be desired). Set
+the FirstDay variable to be the first day of the week (1=Monday, 7=Sunday)
+Monday should be chosen to to comply with ISO 8601.
+
+=item WorkWeekBeg, WorkWeekEnd
+
+The first and last days of the work week. By default, Monday and Friday.
+WorkWeekBeg must come before WorkWeekEnd numerically. The days are
+numbered from 1 (Monday) to 7 (Sunday).
+
+There is no way to handle an odd work week of Thu to Mon for example or 10
+days on, 4 days off.
+
+=item WorkDay24Hr
+
+If this is non-nil, a work day is treated as being 24 hours long. The
+WorkDayBeg and WorkDayEnd variables are ignored in this case.
+
+=item WorkDayBeg, WorkDayEnd
+
+The times when the work day starts and ends. WorkDayBeg must come before
+WorkDayEnd (i.e. there is no way to handle the night shift where the work
+day starts one day and ends another). Also, the workday MUST be more than
+one hour long (of course, if this isn't the case, let me know... I want a
+job there!).
+
+The time in both can be in any valid time format (including international
+formats), but seconds will be ignored.
+
+=item TomorrowFirst
+
+Periodically, if a day is not a business day, we need to find the nearest
+business day to it. By default, we'll look to "tomorrow" first, but if this
+variable is set to 0, we'll look to "yesterday" first. This is only used in
+the Date_NearestWorkDay and is easily overridden (see documentation for that
+function).
+
+=item DeltaSigns
+
+Prior to Date::Manip version 5.07, a negative delta would put negative
+signs in front of every component (i.e. "0:0:-1:-3:0:-4"). By default,
+5.07 changes this behavior to print only 1 or two signs in front of the
+year and day elements (even if these elements might be zero) and the sign
+for year/month and day/hour/minute/second are the same. Setting this
+variable to non-zero forces deltas to be stored with a sign in front of
+every element (including elements equal to 0).
+
+=item Jan1Week1
+
+ISO 8601 states that the first week of the year is the one which contains
+Jan 4 (i.e. it is the first week in which most of the days in that week
+fall in that year). This means that the first 3 days of the year may
+be treated as belonging to the last week of the previous year. If this
+is set to non-nil, the ISO 8601 standard will be ignored and the first
+week of the year contains Jan 1.
+
+=item YYtoYYYY
+
+By default, a 2 digit year is treated as falling in the 100 year period of
+CURR-89 to CURR+10. YYtoYYYY may be set to any integer N to force a 2
+digit year into the period CURR-N to CURR+(99-N). A value of 0 forces
+the year to be the current year or later. A value of 99 forces the year
+to be the current year or earlier. Since I do no checking on the value of
+YYtoYYYY, you can actually have it any positive or negative value to force
+it into any century you want.
+
+YYtoYYYY can also be set to "C" to force it into the current century, or
+to "C##" to force it into a specific century. So, no (1998), "C" forces
+2 digit years to be 1900-1999 and "C18" would force it to be 1800-1899.
+
+It can also be set to the form "C####" to force it into a specific 100
+year period. C1950 refers to 1950-2049.
+
+=item UpdateCurrTZ
+
+If a script is running over a long period of time, the timezone may change
+during the course of running it (i.e. when daylight savings time starts or
+ends). As a result, parsing dates may start putting them in the wrong time
+zone. Since a lot of overhead can be saved if we don't have to check the
+current timezone every time a date is parsed, by default checking is turned
+off. Setting this to non-nil will force timezone checking to be done every
+time a date is parsed... but this will result in a considerable performance
+penalty.
+
+A better solution would be to restart the process on the two days per year
+where the timezone switch occurs.
+
+=item IntCharSet
+
+If set to 0, use the US character set (7-bit ASCII) to return strings such
+as the month name. If set to 1, use the appropriate international character
+set. For example, If you want your French representation of Decemeber to
+have the accent over the first "e", you'll want to set this to 1.
+
+=item ForceDate
+
+This variable can be set to a date in the format: YYYY-MM-DD-HH:MN:SS
+to force the current date to be interpreted as this date. Since the current
+date is used in parsing, this string will not be parsed and MUST be in the
+format given above.
+
+=back
+
+=head1 HOLIDAY SECTION
+
+The holiday section of the config file is used to define holidays. Each
+line is of the form:
+
+ DATE = HOLIDAY
+
+HOLIDAY is the name of the holiday (or it can be blank in which case the
+day will still be treated as a holiday... for example the day after
+Thanksgiving or Christmas is often a work holiday though neither are
+named).
+
+DATE is a string which can be parsed to give a valid date in any year. It
+can be of the form
+
+ Date
+ Date + Delta
+ Date - Delta
+ Recur
+
+A valid holiday section would be:
+
+ *Holiday
+
+ 1/1 = New Year's Day
+ third Monday in Feb = Presidents' Day
+ fourth Thu in Nov = Thanksgiving
+
+ # The Friday after Thanksgiving is an unnamed holiday most places
+ fourth Thu in Nov + 1 day =
+
+ 1*0:0:0:0:0:0*EASTER = Easter
+ 1*11:0:11:0:0:0*CWD = Veteran's Day (observed)
+ 1*0:0:0:0:0:0*EASTER,PD5 = Good Friday
+
+In a Date + Delta or Date - Delta string, you can use business mode by
+including the appropriate string (see documentation on DateCalc) in the
+Date or Delta. So (in English), the first workday before Christmas could
+be defined as:
+
+ 12/25 - 1 business day =
+
+The date's may optionally contain the year. For example, the dates
+
+ 1/1
+ 1/1/1999
+
+refers to Jan 1 in any year or in only 1999 respectively. For dates that
+refer to any year, the date must be written such that by simply appending
+the year (separated by spaces) it can be correctly interpreted. This
+will work for everything except ISO 8601 dates, so ISO 8601 dates may
+not be used in this case.
+
+In cases where you are interested in business type calculations, you'll
+want to define most holidays using recurrences, since they can define
+when a holiday is celebrated in the financial world. For example,
+Christmas chould be defined as:
+
+ 1*12:0:24:0:0:0*FW1 = Christmas
+
+NOTE: It was pointed out to me that using a similar type recurrence to
+define New Years does not work. The recurrence:
+
+ 1*12:0:31:0:0:0*FW1
+
+fails (worse, it goes into an infinite loop). The problem is that each
+holiday definition is applied to a specific year and it expects to find
+the holiday for that year. When this recurrence is applied to the year
+1995, it returns the holiday for 1996 and fails.
+
+Use the recurrence:
+
+ 1*1:0:1:0:0:0*NWD
+
+instead.
+
+If you wanted to define both Christmas and Boxing days (Boxing is the
+day after Christmas, and is celebrated in some parts of the world), you
+could do it in one of the following ways:
+
+ 1*12:0:24:0:0:0*FW1 = Christmas
+ 1*12:0:25:0:0:0*FW1 = Boxing
+
+ 1*12:0:24:0:0:0*FW1 = Christmas
+ 01*12:0:24:0:0:0*FW1 = Boxing
+
+ 1*12:0:24:0:0:0*FW1 = Christmas
+ 1*12:0:25:0:0:0*FW1,a = Boxing
+
+The following examples will NOT work:
+
+ 1*12:0:24:0:0:0*FW1 = Christmas
+ 1*12:0:24:0:0:0*FW2 = Boxing
+
+ 1*12:0:24:0:0:0*FW1 = Christmas
+ 1*12:0:24:0:0:0*FW1 = Boxing
+
+The reasoning behind all this is as follows:
+
+Holidays go into affect the minute they are parsed. So, in the case of:
+
+ 1*12:0:24:0:0:0*FW1 = Christmas
+ 1*12:0:24:0:0:0*FW2 = Boxing
+
+the minute the first line is parsed, Christmas is defined as a holiday.
+The second line then steps forward 2 work days (skipping Christmas since
+that's no longer a work day) and define the work day two days after
+Christmas, NOT the day after Christmas.
+
+An good alternative would appear to be:
+
+ 1*12:0:24:0:0:0*FW1 = Christmas
+ 1*12:0:24:0:0:0*FW1 = Boxing
+
+This unfortunately fails because the recurrences are currently stored in a
+hash. Since these two recurrences are identical, they fail (the first one
+is overwritten by the second and in essense, Christmas is never defined).
+
+To fix this, make them unique with either a fake flag (which is ignored):
+
+ 1*12:0:24:0:0:0*FW1,a = Boxing
+
+or adding an innocuous 0 somewhere:
+
+ 01*12:0:24:0:0:0*FW1 = Boxing
+
+The other good alternative would be to make two completely different
+recurrences such as:
+
+ 1*12:0:24:0:0:0*FW1 = Christmas
+ 1*12:0:25:0:0:0*FW1 = Boxing
+
+At times, you may want to switch back and forth between two holiday files.
+This can be done by calling the following:
+
+ &Date_Init("EraseHolidays=1","PersonalCnf=FILE1");
+ ...
+ &Date_Init("EraseHolidays=1","PersonalCnf=FILE2");
+ ...
+
+=head1 EVENTS SECTION
+
+The Events section of the config file is similar to the Holiday section.
+It is used to name certain days or times, but there are a few important
+differences:
+
+=over 4
+
+=item Events can be assigned to any time and duration
+
+All holidays are exactly 1 day long. They are assigned to a period
+of time from midnight to midnight.
+
+Events can be based at any time of the day, and may be of any duration.
+
+=item Events don't affect business mode calculations
+
+Unlike holidays, events are completely ignored when doing business
+mode calculations.
+
+=back
+
+Whereas holidays were added with business mode math in mind, events
+were added with calendar and scheduling applications in mind.
+
+Every line in the events section is of the form:
+
+ EVENT = NAME
+
+where NAME is the name of the event, and EVENT defines when it occurs
+and it's duration. An EVENT can be defined in the following ways:
+
+ Date
+ Date*
+ Recur [NYI]
+ Recur* [NYI]
+
+ Date ; Date
+ Date ; Delta
+ Recur ; Delta [NYI]
+
+ Date ; Delta ; Delta [NYI]
+ Recur ; Delta ; Delta [NYI]
+
+Here, Date* refers to a string containing a Date with NO TIME fields
+(Jan 12, 1/1/2000, 2010-01-01) while Date does contain time fields.
+Similarily, Recur* stands for a recurrence with the time fields all
+equal to 0) while Recur stands for a recurrence with at least one
+non-zero time field.
+
+Both Date* and Recur* refer to an event very similar to a holiday which
+goes from midnight to midnight.
+
+Date and Recur refer to events which occur at the time given and with
+a duration of 1 hour.
+
+Events given by "Date ; Date", "Date ; Delta", and "Recur ; Delta"
+contain both the starting date and either ending date or duration.
+
+Events given as three elements "Date ; Delta ; Delta" or "Recur ; Delta ;
+Delta" take a date and add both deltas to it to give the starting and
+ending time of the event. The order and sign of the deltas is
+unimportant (and both can be the same sign to give a range of times
+which does not contain the base date).
+
+Items marked with [NYI] are not yet implemented but will be by the
+time this is released.
+
+=head1 BACKWARDS INCOMPATIBILITIES
+
+For the most part, Date::Manip has remained backward compatible at every
+release. There have been a few minor incompatibilities introduced at
+various stages. Major differences are marked with bullets.
+
+=over 4
+
+=item VERSION 5.41
+
+=item Changed path separator for VMS
+
+Since ":" is used in some VMS paths, it should not have been used as
+the path separator. It has been changed to a newline ("\n") character.
+
+=item Delta_Format behavior changed
+
+The entire delta is exact if no month component is present (previously,
+no year or month component could be present).
+
+=item VERSION 5.38
+
+=item Removed Date_DaysSince999
+
+The Date_DaysSince999 function (deprecated in 5.35) has been removed.
+
+=item VERSION 5.35
+
+=over 4
+
+=item Deprected Date_DaysSince999
+
+In fixing support for the years 0000-0999, I rewrote Date_DaysSince999 to
+be Date_DaysSince1BC. The Date_DaysSince999 function will be removed.
+
+=item * Added PathSep variable
+
+In order to better support Win32 platforms, I added the PathSep config
+variable. This will allow the use of paths such as "c:\date" on Win32
+platforms. Old config files on Win32 platforms (which were not working
+correctly in many cases) may not work if they contain path information to
+the personal config file.
+
+=back
+
+=item VERSION 5.34
+
+=over 4
+
+=item * All Date::Manip variables are no longer accessible
+
+Previously, Date::Manip variables were declared using a full package name.
+Now, they are declared with the my() function. This means that internal
+variables are no longer accessible outside of the module.
+
+=item Week interpretation in business mode deltas
+
+A business mode delta containing a week value used to be treated as 7 days.
+A much more likely interpretation of a week is Monday to Monday, regardless
+of holidays, so this is now the behavior.
+
+=item %z UnixDate format
+
+The %z UnixDate format used to return the Timezone abbreviation. It now
+returns it as a GMT offset (i.e. -0500). %Z still returns the Timezone
+abbreviation.
+
+=item Formats "22nd sunday" returns the intuitive value
+
+The date "22nd sunday" used to return the Sunday of the 22nd week of the
+year (which could be the 21st, 22nd, or 23rd Sunday of the year depending
+on how weeks were defined). Now, it returns the 22nd Sunday of the year
+regardless.
+
+=item Separator in DD/YYmmm and mmmDD/YY formats no longer optional
+
+Previously, the date "Dec1065" would return Dec 10, 1965. After adding
+the YYYYmmm and mmmYYYY formats, this was no longer possible. The separator
+between DD and YY is no longer optional, so
+
+ Dec1065 returns December 1, 1065
+ Dec10/65 returns December 10, 1965
+
+=item * Date_Cmp added
+
+This is not a backwards incompatibility... but is added to help prepare for
+a future incompatibility. In one of the next versions of Date::Manip, the
+internal format of the date will change to include timezone information.
+All date comparisons should be made using Date_Cmp (which currently does
+nothing more than call the perl "cmp" command, but which will important
+when comparing dates that include the timezone).
+
+=back
+
+=item VERSION 5.32
+
+=over 4
+
+=item Date_Init arguments
+
+The old style Date_Init arguments that were deprecated in version 5.07
+have been removed.
+
+=item * DateManip.cnf change
+
+Changed .DateManip.cnf to Manip.cnf (to get rid of problems on OS's
+that insist on 8.3 filenames) for all non-Unix platforms (Wintel, VMS,
+Mac). For all Unix platforms, it's still .DateManip.cnf . It will only
+look in the user's home directory on VMS and Unix.
+
+=back
+
+=item VERSION 5.30
+
+=over 4
+
+=item * Delta format changed
+
+A week field has been added to the internal format of the delta. It now
+reads "Y:M:W:D:H:MN:S" instead of "Y:M:D:H:MN:S".
+
+=back
+
+=item VERSION 5.21
+
+=over 4
+
+=item Long running processes may give incorrect timezone
+
+A process that runs during a timezone change (Daylight Saving Time
+specifically) may report the wrong timezone. See the UpdateCurrTZ variable
+for more information.
+
+=item UnixDate "%J", "%W", and "%U" formats fixed
+
+The %J, %W, and %U will no longer report a week 0 or a week 53 if it should
+really be week 1 of the following year. They now report the correct week
+number according to ISO 8601.
+
+=back
+
+=item VERSION 5.20
+
+=over 4
+
+=item * ParseDate formats removed (ISO 8601 compatibility)
+
+Full support for ISO 8601 formats was added. As a result, some formats
+which previously worked may no longer be parsed since they conflict with an
+ISO 8601 format. These include MM-DD-YY (conflicts with YY-MM-DD) and
+YYMMDD (conflicts with YYYYMM). MM/DD/YY still works, so the first form
+can be kept easily by changing "-" to "/". YYMMDD can be changed to
+YY-MM-DD before being parsed. Whenever parsing dates using dashes as
+separators, they will be treated as ISO 8601 dates. You can get around
+this by converting all dashes to slashes.
+
+=item * Week day numbering
+
+The day numbering was changed from 0-6 (sun-sat) to 1-7 (mon-sun) to be
+ISO 8601 compatible. Weeks start on Monday (though this can be overridden
+using the FirstDay config variable) and the 1st week of the year contains
+Jan 4 (though it can be forced to contain Jan 1 with the Jan1Week1 config
+variable).
+
+=back
+
+=item VERSION 5.07
+
+=over 4
+
+=item UnixDate "%s" format
+
+Used to return the number of seconds since 1/1/1970 in the current
+timezone. It now returns the number of seconds since 1/1/1970 GMT.
+The "%o" format was added which returns what "%s" previously did.
+
+=item Internal format of delta
+
+The format for the deltas returned by ParseDateDelta changed. Previously,
+each element of a delta had a sign attached to it (+1:+2:+3:+4:+5:+6). The
+new format removes all unnecessary signs by default (+1:2:3:4:5:6). Also,
+because of the way deltas are normalized (see documentation on
+ParseDateDelta), at most two signs are included. For backwards
+compatibility, the config variable DeltaSigns was added. If set to 1, all
+deltas include all 6 signs.
+
+=item Date_Init arguments
+
+The format of the Date_Init calling arguments changed. The
+old method
+
+ &Date_Init($language,$format,$tz,$convtz);
+
+is still supported , but this support will likely disappear in the future.
+Use the new calling format instead:
+
+ &Date_Init("var=val","var=val",...);
+
+NOTE: The old format is no longer supported as of version 5.32 .
+
+=back
+
+=back
+
+=head1 KNOWN PROBLEMS
+
+The following are not bugs in Date::Manip, but they may give some people
+problems.
+
+=over 4
+
+=item Unable to determine TimeZone
+
+Perhaps the most common problem occurs when you get the error:
+
+ Error: Date::Manip unable to determine TimeZone.
+
+Date::Manip tries hard to determine the local timezone, but on some
+machines, it cannot do this (especially non-unix systems). To fix this,
+just set the TZ variable, either at the top of the Manip.pm file,, in the
+DateManip.cnf file, or in a call to Date_Init. I suggest using the form
+"EST5EDT" so you don't have to change it every 6 months when going to or
+from daylight savings time.
+
+Windows NT does not seem to set the TimeZone by default. From the
+Perl-Win32-Users mailing list:
+
+ > How do I get the TimeZone on my NT?
+ >
+ > $time_zone = $ENV{'TZ'};
+ >
+ You have to set the variable before, WinNT doesn't set it by
+ default. Open the properties of "My Computer" and set a SYSTEM
+ variable TZ to your timezone. Jenda@Krynicky.cz
+
+This might help out some NT users.
+
+A minor (false) assumption that some users might make is that since
+Date::Manip passed all of it's tests at install time, this should not occur
+and are surprised when it does.
+
+Some of the tests are timezone dependent. Since the tests all include
+input and expected output, I needed to know in advance what timezone they
+would be run in. So, the tests all explicitly set the timezone using the
+TZ configuration variable passed into Date_Init. Since this overrides any
+other method of determining the timezone, Date::Manip uses this and doesn't
+have to look elsewhere for the timezone.
+
+When running outside the tests, Date::Manip has to rely on it's other
+methods for determining the timezone.
+
+=item Complaining about getpwnam/getpwuid
+
+Another problem is when running on Micro$oft OS'es. I have added many
+tests to catch them, but they still slip through occasionally. If any ever
+complain about getpwnam/getpwuid, simply add one of the lines:
+
+ $ENV{OS} = Windows_NT
+ $ENV{OS} = Windows_95
+
+to your script before
+
+ use Date::Manip
+
+=item Date::Manip is slow
+
+The reasons for this are covered in the SHOULD I USE DATE::MANIP section
+above.
+
+Some things that will definitely help:
+
+Version 5.21 does run noticeably faster than earlier versions due to
+rethinking some of the initialization, so at the very least, make sure you
+are running this version or later.
+
+ISO-8601 dates are parsed first and fastest. Use them whenever possible.
+
+Avoid parsing dates that are referenced against the current time (in 2
+days, today at noon, etc.). These take a lot longer to parse.
+
+ Example: parsing 1065 dates with version 5.11 took 48.6 seconds, 36.2
+ seconds with version 5.21, and parsing 1065 ISO-8601 dates with version
+ 5.21 took 29.1 seconds (these were run on a slow, overloaded computer with
+ little memory... but the ratios should be reliable on a faster computer).
+
+Business date calculations are extremely slow. You should consider
+alternatives if possible (i.e. doing the calculation in exact mode and then
+multiplying by 5/7). There will be an approximate business mode in one of
+the next versions which will be much faster (though less accurate) which
+will do something like this. Whenever possible, use this mode. And who
+needs a business date more accurate than "6 to 8 weeks" anyway huh :-)
+
+Never call Date_Init more than once. Unless you're doing something very
+strange, there should never be a reason to anyway.
+
+=item Sorting Problems
+
+If you use Date::Manip to sort a number of dates, you must call Date_Init
+either explicitly, or by way of some other Date::Manip routine before it
+is used in the sort. For example, the following code fails:
+
+ use Date::Manip;
+ # &Date_Init;
+ sub sortDate {
+ my($date1, $date2);
+ $date1 = &ParseDate($a);
+ $date2 = &ParseDate($b);
+ return (&Date_Cmp($date1,$date2));
+ }
+ @dates = ("Fri 16 Aug 96",
+ "Mon 19 Aug 96",
+ "Thu 15 Aug 96");
+ @i=sort sortDate @dates;
+
+but if you uncomment the Date_Init line, it works. The reason for this is
+that the first time you call Date_Init, it initializes a number of items
+used by Date::Manip. Some of these have to be sorted (regular expressions
+sorted by length to ensure the longest match). It turns out that perl
+has a bug in it which does not allow a sort within a sort. At some point,
+this should be fixed, but for now, the best thing to do is to call Date_Init
+explicitly. The bug exists in all versions up to 5.005 (I haven't
+tested 5.6.0 yet).
+
+NOTE: This is an EXTREMELY inefficient way to sort data. Instead, you
+should parse the dates with ParseDate, sort them using a normal string
+comparison, and then convert them back to the format desired using
+UnixDate.
+
+=item RCS Control
+
+If you try to put Date::Manip under RCS control, you are going to have
+problems. Apparently, RCS replaces strings of the form "$Date...$" with
+the current date. This form occurs all over in Date::Manip. To prevent the
+RCS keyword expansion, checkout files using "co -ko". Since very few people
+will ever have a desire to do this (and I don't use RCS), I have not worried
+about it.
+
+=back
+
+=head1 KNOWN BUGS
+
+=over 4
+
+=item Daylight Savings Times
+
+Date::Manip does not handle daylight savings time, though it does handle
+timezones to a certain extent. Converting from EST to PST works fine.
+Going from EST to PDT is unreliable.
+
+The following examples are run in the winter of the US East coast (i.e.
+in the EST timezone).
+
+ print UnixDate(ParseDate("6/1/97 noon"),"%u"),"\n";
+ => Sun Jun 1 12:00:00 EST 1997
+
+June 1 EST does not exist. June 1st is during EDT. It should print:
+
+ => Sun Jun 1 00:00:00 EDT 1997
+
+Even explicitly adding the timezone doesn't fix things (if anything, it
+makes them worse):
+
+ print UnixDate(ParseDate("6/1/97 noon EDT"),"%u"),"\n";
+ => Sun Jun 1 11:00:00 EST 1997
+
+Date::Manip converts everything to the current timezone (EST in this case).
+
+Related problems occur when trying to do date calculations over a timezone
+change. These calculations may be off by an hour.
+
+Also, if you are running a script which uses Date::Manip over a period of
+time which starts in one time zone and ends in another (i.e. it switches
+form Daylight Savings Time to Standard Time or vice versa), many things may
+be wrong (especially elapsed time).
+
+I hope to fix these problems in a future release so that it would convert
+everything to the current zones (EST or EDT).
+
+=back
+
+=head1 BUGS AND QUESTIONS
+
+If you find a bug in Date::Manip, please send it directly to me (see the
+AUTHOR section below) rather than posting it to one of the newsgroups.
+Although I try to keep up with the comp.lang.perl.* groups, all too often I
+miss news (flaky news server, articles expiring before I caught them, 1200
+articles to wade through and I missed one that I was interested in, etc.).
+
+When filing a bug report, please include the following information:
+
+ o The version of Date::Manip you are using. You can get this by using
+ the script:
+
+ use Date::Manip;
+ print &DateManipVersion(),"\n";
+
+ o The output from "perl -V"
+
+If you have a problem using Date::Manip that perhaps isn't a bug (can't
+figure out the syntax, etc.), you're in the right place. Go right back to
+the top of this man page and start reading. If this still doesn't answer
+your question, mail me (again, please mail me rather than post to the
+newsgroup).
+
+=head1 YEAR 2000
+
+In hindsight, the fact that I've only been asked once (so far) if Date::Manip
+is year 2000 compliant surprises me a bit. Still, as 2000 approaches and
+this buzzword starts flying around more and more frantically, other's might
+follow suit, so this section answers the question.
+
+Is Date::Manip year 2000 compliant?
+
+This question is largely meaningless. Date::Manip is basically just a
+parser. You give it a date and it'll manipulate it. Date::Manip does
+store the date internally as a 4 digit year, and performs all operations
+using this internal representation, so I will state that Date::Manip is
+CAPABLE of writing Y2K compliant code.
+
+But Date::Manip is simply a library. If you use it correctly, your code
+can be Y2K compliant. If you don't, your code may not be Y2K compliant.
+
+The bottom line is this:
+
+ Date::Manip is a library that is capable of being used to write Y2K
+ compliant code. It may also be used to write non-Y2K compliant code.
+
+ If your code is NOT Y2K compliant, it is NOT due to any deficiency in
+ Date::Manip. Rather, it is due to poor programming on the part of the
+ person using Date::Manip.
+
+For an excellent treatment of the Y2K problem, see the article by Tom
+Christiansen at:
+
+ http://language.perl.com/news/y2k.html
+
+A slightly better question is "Is Perl year 2000 compliant"? This is
+covered in the perl FAQ (section 4) and in the article by Tom Crhistiansen.
+
+The best question is "For what dates is Date::Manip useful?" It definitely
+can't handle BC dates, or dates past Dec 31, 9999. So Date::Manip works
+during the years 1000 to 9999.
+
+In practical terms however, Date::Manip deals with the Gregorian calendar,
+and is therefore useful in the period that that calendar has been, or will
+be, in effect. The Gregorian calendar was first adopted by the Catholic
+church in 1582, but some countries were still using the Julian calendar as
+late as the early part of the 20th century. Also, at some point (probably
+no earlier than the year 3000 and possibly much later), the Gregorian
+system is going to have to be modified slightly since the current system of
+leap years is off by a few seconds a year. So... in practical terms,
+Date::Manip is _probably_ useful from 1900 to 3000.
+
+One other note is that Date::Manip will NOT handle 3 digit years. So, if
+you store the year as an offset from 1900 (which is 2 digits now, but will
+become 3 digits in 2000), these will NOT be parsable by Date::Manip.
+
+=head1 VERSION NUMBERS
+
+A note about version numbers.
+
+Prior to version 5.00, Date::Manip was distributed as a perl4 library.
+There were no numbering conventions in place, so I used a simple
+MAJOR.MINOR numbering scheme.
+
+With version 5.00, I switched to a perl5 module and at that time switched
+to the perl5 numbering convention of a major version followed by a 2 digit
+minor version.
+
+As of 5.41/5.42, all versions released to CPAN will be even numbered. Odd
+numbered will be development versions available from my web site. For
+example, after 5.40 was released, I started making changes, and called
+the development version 5.41. When released to CPAN, it was called 5.42.
+I may add a third digit to development versions (i.e. 5.41.9) to keep
+track of important changes in the development version.
+
+=head1 ACKNOWLEDGMENTS
+
+There are many people who have contributed to Date::Manip over the years
+that I'd like to thank. The most important contributions have come in the
+form of suggestions and bug reports by users. I have tried to include the
+name of every person who first suggested each improvement or first reported
+each bug. These are included in the HISTORY file in the Date::Manip
+distribution in the order the changes are made. The list is simply too
+long to appear here, but I appreciate their help.
+
+A number of people have made suggestions or reported bugs which are not
+mentioned in the HISTORY file. These include suggestions which have not
+been implemented and people who have made a suggestion or bug report which
+has already been suggested/reported by someone else. For those who's
+suggestions have not yet been implemented, they will be added to the
+HISTORY file when (if) their suggestions are implemented. For everyone
+else, thank you too. I'd much rather have a suggestion made twice than not
+at all.
+
+Thanks to Alan Cezar and Greg Schiedler for paying me to implement the
+Events_List routine. They gave me the idea, and were then willing to pay
+me for my time to get it implemented quickly.
+
+I'd also like a couple of authors. Date::Manip has recently been getting
+some really good press in a couple of books. Since no one's paying me to
+write Date::Manip, seeing my module get a good review in a book written by
+someone else really makes my day. My thanks to Nate Padwardhan and Clay
+Irving (Programming with Perl Modules -- part of the O'Reilly Perl Resource
+Kit); and Tom Christiansen and Nathan Torkington (The Perl Cookbook).
+Also, thanks to any other authors who've written about Date::Manip who's
+books I haven't seen.
+
+=head1 AUTHOR
+
+Sullivan Beck (sbeck@cpan.org)
+
+You can always get the newest beta version of Date::Manip (which may fix
+problems in the current CPAN version... and may add others) from my home
+page:
+
+http://www.cise.ufl.edu/~sbeck/
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/Parse/Yapp.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,512 @@
+#
+# Module Parse::Yapp.pm.
+#
+# Copyright (c) 1998-2001, Francois Desarmenien, all right reserved.
+#
+# See the Copyright section at the end of the Parse/Yapp.pm pod section
+# for usage and distribution rights.
+#
+#
+package Parse::Yapp;
+
+use strict;
+use vars qw($VERSION @ISA);
+@ISA = qw(Parse::Yapp::Output);
+
+use Parse::Yapp::Output;
+
+# $VERSION is in Parse/Yapp/Driver.pm
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Parse::Yapp - Perl extension for generating and using LALR parsers.
+
+=head1 SYNOPSIS
+
+ yapp -m MyParser grammar_file.yp
+
+ ...
+
+ use MyParser;
+
+ $parser=new MyParser();
+ $value=$parser->YYParse(yylex => \&lexer_sub, yyerror => \&error_sub);
+
+ $nberr=$parser->YYNberr();
+
+ $parser->YYData->{DATA}= [ 'Anything', 'You Want' ];
+
+ $data=$parser->YYData->{DATA}[0];
+
+=head1 DESCRIPTION
+
+Parse::Yapp (Yet Another Perl Parser compiler) is a collection of modules
+that let you generate and use yacc like thread safe (reentrant) parsers with
+perl object oriented interface.
+
+The script yapp is a front-end to the Parse::Yapp module and let you
+easily create a Perl OO parser from an input grammar file.
+
+=head2 The Grammar file
+
+=over 4
+
+=item C<Comments>
+
+Through all your files, comments are either Perl style, introduced by I<#>
+up to the end of line, or C style, enclosed between I</*> and I<*/>.
+
+
+=item C<Tokens and string literals>
+
+
+Through all the grammar files, two kind of symbols may appear:
+I<Non-terminal> symbols, called also I<left-hand-side> symbols,
+which are the names of your rules, and I<Terminal> symbols, called
+also I<Tokens>.
+
+Tokens are the symbols your lexer function will feed your parser with
+(see below). They are of two flavours: symbolic tokens and string
+literals.
+
+Non-terminals and symbolic tokens share the same identifier syntax:
+
+ [A-Za-z][A-Za-z0-9_]*
+
+String literals are enclosed in single quotes and can contain almost
+anything. They will be output to your parser file double-quoted, making
+any special character as such. '"', '$' and '@' will be automatically
+quoted with '\', making their writing more natural. On the other hand,
+if you need a single quote inside your literal, just quote it with '\'.
+
+You cannot have a literal I<'error'> in your grammar as it would
+confuse the driver with the I<error> token. Use a symbolic token instead.
+In case you inadvertently use it, this will produce a warning telling you
+you should have written it I<error> and will treat it as if it were the
+I<error> token, which is certainly NOT what you meant.
+
+
+=item C<Grammar file syntax>
+
+It is very close to yacc syntax (in fact, I<Parse::Yapp> should compile
+a clean I<yacc> grammar without any modification, whereas the opposite
+is not true).
+
+This file is divided in three sections, separated by C<%%>:
+
+ header section
+ %%
+ rules section
+ %%
+ footer section
+
+=over 4
+
+=item B<The Header Section> section may optionally contain:
+
+=item *
+
+One or more code blocks enclosed inside C<%{> and C<%}> just like in
+yacc. They may contain any valid Perl code and will be copied verbatim
+at the very beginning of the parser module. They are not as useful as
+they are in yacc, but you can use them, for example, for global variable
+declarations, though you will notice later that such global variables can
+be avoided to make a reentrant parser module.
+
+=item *
+
+Precedence declarations, introduced by C<%left>, C<%right> and C<%nonassoc>
+specifying associativity, followed by the list of tokens or litterals
+having the same precedence and associativity.
+The precedence beeing the latter declared will be having the highest level.
+(see the yacc or bison manuals for a full explanation of how they work,
+as they are implemented exactly the same way in Parse::Yapp)
+
+=item *
+
+C<%start> followed by a rule's left hand side, declaring this rule to
+be the starting rule of your grammar. The default, when C<%start> is not
+used, is the first rule in your grammar section.
+
+=item *
+
+C<%token> followed by a list of symbols, forcing them to be recognized
+as tokens, generating a syntax error if used in the left hand side of
+a rule declaration.
+Note that in Parse::Yapp, you I<don't> need to declare tokens as in yacc: any
+symbol not appearing as a left hand side of a rule is considered to be
+a token.
+Other yacc declarations or constructs such as C<%type> and C<%union> are
+parsed but (almost) ignored.
+
+=item *
+
+C<%expect> followed by a number, suppress warnings about number of Shift/Reduce
+conflicts when both numbers match, a la bison.
+
+
+=item B<The Rule Section> contains your grammar rules:
+
+A rule is made of a left-hand-side symbol, followed by a C<':'> and one
+or more right-hand-sides separated by C<'|'> and terminated by a C<';'>:
+
+ exp: exp '+' exp
+ | exp '-' exp
+ ;
+
+A right hand side may be empty:
+
+ input: #empty
+ | input line
+ ;
+
+(if you have more than one empty rhs, Parse::Yapp will issue a warning,
+as this is usually a mistake, and you will certainly have a reduce/reduce
+conflict)
+
+
+A rhs may be followed by an optional C<%prec> directive, followed
+by a token, giving the rule an explicit precedence (see yacc manuals
+for its precise meaning) and optionnal semantic action code block (see
+below).
+
+ exp: '-' exp %prec NEG { -$_[1] }
+ | exp '+' exp { $_[1] + $_[3] }
+ | NUM
+ ;
+
+Note that in Parse::Yapp, a lhs I<cannot> appear more than once as
+a rule name (This differs from yacc).
+
+
+=item C<The footer section>
+
+may contain any valid Perl code and will be appended at the very end
+of your parser module. Here you can write your lexer, error report
+subs and anything relevant to you parser.
+
+=item C<Semantic actions>
+
+Semantic actions are run every time a I<reduction> occurs in the
+parsing flow and they must return a semantic value.
+
+They are (usually, but see below C<In rule actions>) written at
+the very end of the rhs, enclosed with C<{ }>, and are copied verbatim
+to your parser file, inside of the rules table.
+
+Be aware that matching braces in Perl is much more difficult than
+in C: inside strings they don't need to match. While in C it is
+very easy to detect the beginning of a string construct, or a
+single character, it is much more difficult in Perl, as there
+are so many ways of writing such literals. So there is no check
+for that today. If you need a brace in a double-quoted string, just
+quote it (C<\{> or C<\}>). For single-quoted strings, you will need
+to make a comment matching it I<in th right order>.
+Sorry for the inconvenience.
+
+ {
+ "{ My string block }".
+ "\{ My other string block \}".
+ qq/ My unmatched brace \} /.
+ # Force the match: {
+ q/ for my closing brace } /
+ q/ My opening brace { /
+ # must be closed: }
+ }
+
+All of these constructs should work.
+
+
+In Parse::Yapp, semantic actions are called like normal Perl sub calls,
+with their arguments passed in C<@_>, and their semantic value are
+their return values.
+
+$_[1] to $_[n] are the parameters just as $1 to $n in yacc, while
+$_[0] is the parser object itself.
+
+Having $_[0] beeing the parser object itself allows you to call
+parser methods. Thats how the yacc macros are implemented:
+
+ yyerrok is done by calling $_[0]->YYErrok
+ YYERROR is done by calling $_[0]->YYError
+ YYACCEPT is done by calling $_[0]->YYAccept
+ YYABORT is done by calling $_[0]->YYAbort
+
+All those methods explicitly return I<undef>, for convenience.
+
+ YYRECOVERING is done by calling $_[0]->YYRecovering
+
+Four useful methods in error recovery sub
+
+ $_[0]->YYCurtok
+ $_[0]->YYCurval
+ $_[0]->YYExpect
+ $_[0]->YYLexer
+
+return respectivly the current input token that made the parse fail,
+its semantic value (both can be used to modify their values too, but
+I<know what you are doing> ! See I<Error reporting routine> section for
+an example), a list which contains the tokens the parser expected when
+the failure occured and a reference to the lexer routine.
+
+Note that if C<$_[0]-E<gt>YYCurtok> is declared as a C<%nonassoc> token,
+it can be included in C<$_[0]-E<gt>YYExpect> list whenever the input
+try to use it in an associative way. This is not a bug: the token
+IS expected to report an error if encountered.
+
+To detect such a thing in your error reporting sub, the following
+example should do the trick:
+
+ grep { $_[0]->YYCurtok eq $_ } $_[0]->YYExpect
+ and do {
+ #Non-associative token used in an associative expression
+ };
+
+Accessing semantics values on the left of your reducing rule is done
+through the method
+
+ $_[0]->YYSemval( index )
+
+where index is an integer. Its value being I<1 .. n> returns the same values
+than I<$_[1] .. $_[n]>, but I<-n .. 0> returns values on the left of the rule
+beeing reduced (It is related to I<$-n .. $0 .. $n> in yacc, but you
+cannot use I<$_[0]> or I<$_[-n]> constructs in Parse::Yapp for obvious reasons)
+
+
+There is also a provision for a user data area in the parser object,
+accessed by the method:
+
+ $_[0]->YYData
+
+which returns a reference to an anonymous hash, which let you have
+all of your parsing data held inside the object (see the Calc.yp
+or ParseYapp.yp files in the distribution for some examples).
+That's how you can make you parser module reentrant: all of your
+module states and variables are held inside the parser object.
+
+Note: unfortunatly, method calls in Perl have a lot of overhead,
+ and when YYData is used, it may be called a huge number
+ of times. If your are not a *real* purist and efficiency
+ is your concern, you may access directly the user-space
+ in the object: $parser->{USER} wich is a reference to an
+ anonymous hash array, and then benchmark.
+
+If no action is specified for a rule, the equivalant of a default
+action is run, which returns the first parameter:
+
+ { $_[1] }
+
+=item C<In rule actions>
+
+It is also possible to embed semantic actions inside of a rule:
+
+ typedef: TYPE { $type = $_[1] } identlist { ... } ;
+
+When the Parse::Yapp's parser encounter such an embedded action, it modifies
+the grammar as if you wrote (although @x-1 is not a legal lhs value):
+
+ @x-1: /* empty */ { $type = $_[1] };
+ typedef: TYPE @x-1 identlist { ... } ;
+
+where I<x> is a sequential number incremented for each "in rule" action,
+and I<-1> represents the "dot position" in the rule where the action arises.
+
+In such actions, you can use I<$_[1]..$_[n]> variables, which are the
+semantic values on the left of your action.
+
+Be aware that the way Parse::Yapp modifies your grammar because of
+I<in rule actions> can produce, in some cases, spurious conflicts
+that wouldn't happen otherwise.
+
+=item C<Generating the Parser Module>
+
+Now that you grammar file is written, you can use yapp on it
+to generate your parser module:
+
+ yapp -v Calc.yp
+
+will create two files F<Calc.pm>, your parser module, and F<Calc.output>
+a verbose output of your parser rules, conflicts, warnings, states
+and summary.
+
+What your are missing now is a lexer routine.
+
+=item C<The Lexer sub>
+
+is called each time the parser need to read the next token.
+
+It is called with only one argument that is the parser object itself,
+so you can access its methods, specially the
+
+ $_[0]->YYData
+
+data area.
+
+It is its duty to return the next token and value to the parser.
+They C<must> be returned as a list of two variables, the first one
+is the token known by the parser (symbolic or literal), the second
+one beeing anything you want (usualy the content of the token, or the
+literal value) from a simple scalar value to any complex reference,
+as the parsing driver never use it but to call semantic actions:
+
+ ( 'NUMBER', $num )
+or
+ ( '>=', '>=' )
+or
+ ( 'ARRAY', [ @values ] )
+
+When the lexer reach the end of input, it must return the C<''>
+empty token with an undef value:
+
+ ( '', undef )
+
+Note that your lexer should I<never> return C<'error'> as token
+value: for the driver, this is the error token used for error
+recovery and would lead to odd reactions.
+
+Now that you have your lexer written, maybe you will need to output
+meaningful error messages, instead of the default which is to print
+'Parse error.' on STDERR.
+
+So you will need an Error reporting sub.
+
+item C<Error reporting routine>
+
+If you want one, write it knowing that it is passed as parameter
+the parser object. So you can share information whith the lexer
+routine quite easily.
+
+You can also use the C<$_[0]-E<gt>YYErrok> method in it, which will
+resume parsing as if no error occured. Of course, since the invalid
+token is still invalid, you're supposed to fix the problem by
+yourself.
+
+The method C<$_[0]-E<gt>YYLexer> may help you, as it returns a reference
+to the lexer routine, and can be called as
+
+ ($tok,$val)=&{$_[0]->Lexer}
+
+to get the next token and semantic value from the input stream. To
+make them current for the parser, use:
+
+ ($_[0]->YYCurtok, $_[0]->YYCurval) = ($tok, $val)
+
+and know what you're doing...
+
+=item C<Parsing>
+
+Now you've got everything to do the parsing.
+
+First, use the parser module:
+
+ use Calc;
+
+Then create the parser object:
+
+ $parser=new Calc;
+
+Now, call the YYParse method, telling it where to find the lexer
+and error report subs:
+
+ $result=$parser->YYParse(yylex => \&Lexer,
+ yyerror => \&ErrorReport);
+
+(assuming Lexer and ErrorReport subs have been written in your current
+package)
+
+The order in which parameters appear is unimportant.
+
+Et voila.
+
+The YYParse method will do the parse, then return the last semantic
+value returned, or undef if error recovery cannot recover.
+
+If you need to be sure the parse has been successful (in case your
+last returned semantic value I<is> undef) make a call to:
+
+ $parser->YYNberr()
+
+which returns the total number of time the error reporting sub has been called.
+
+=item C<Error Recovery>
+
+in Parse::Yapp is implemented the same way it is in yacc.
+
+=item C<Debugging Parser>
+
+To debug your parser, you can call the YYParse method with a debug parameter:
+
+ $parser->YYParse( ... , yydebug => value, ... )
+
+where value is a bitfield, each bit representing a specific debug output:
+
+ Bit Value Outputs
+ 0x01 Token reading (useful for Lexer debugging)
+ 0x02 States information
+ 0x04 Driver actions (shifts, reduces, accept...)
+ 0x08 Parse Stack dump
+ 0x10 Error Recovery tracing
+
+To have a full debugging ouput, use
+
+ debug => 0x1F
+
+Debugging output is sent to STDERR, and be aware that it can produce
+C<huge> outputs.
+
+=item C<Standalone Parsers>
+
+By default, the parser modules generated will need the Parse::Yapp
+module installed on the system to run. They use the Parse::Yapp::Driver
+which can be safely shared between parsers in the same script.
+
+In the case you'd prefer to have a standalone module generated, use
+the C<-s> switch with yapp: this will automagically copy the driver
+code into your module so you can use/distribute it without the need
+of the Parse::Yapp module, making it really a C<Standalone Parser>.
+
+If you do so, please remember to include Parse::Yapp's copyright notice
+in your main module copyright, so others can know about Parse::Yapp module.
+
+=item C<Source file line numbers>
+
+by default will be included in the generated parser module, which will help
+to find the guilty line in your source file in case of a syntax error.
+You can disable this feature by compiling your grammar with yapp using
+the C<-n> switch.
+
+=back
+
+=head1 BUGS AND SUGGESTIONS
+
+If you find bugs, think of anything that could improve Parse::Yapp
+or have any questions related to it, feel free to contact the author.
+
+=head1 AUTHOR
+
+Francois Desarmenien <francois@fdesar.net>
+
+=head1 SEE ALSO
+
+yapp(1) perl(1) yacc(1) bison(1).
+
+=head1 COPYRIGHT
+
+The Parse::Yapp module and its related modules and shell scripts are copyright
+(c) 1998-2001 Francois Desarmenien, France. All rights reserved.
+
+You may use and distribute them under the terms of either
+the GNU General Public License or the Artistic License,
+as specified in the Perl README file.
+
+If you use the "standalone parser" option so people don't need to install
+Parse::Yapp on their systems in order to run you software, this copyright
+noticed should be included in your software copyright too, and the copyright
+notice in the embedded driver should be left untouched.
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/Parse/Yapp/Driver.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,471 @@
+#
+# Module Parse::Yapp::Driver
+#
+# This module is part of the Parse::Yapp package available on your
+# nearest CPAN
+#
+# Any use of this module in a standalone parser make the included
+# text under the same copyright as the Parse::Yapp module itself.
+#
+# This notice should remain unchanged.
+#
+# (c) Copyright 1998-2001 Francois Desarmenien, all rights reserved.
+# (see the pod text in Parse::Yapp module for use and distribution rights)
+#
+
+package Parse::Yapp::Driver;
+
+require 5.004;
+
+use strict;
+
+use vars qw ( $VERSION $COMPATIBLE $FILENAME );
+
+$VERSION = '1.05';
+$COMPATIBLE = '0.07';
+$FILENAME=__FILE__;
+
+use Carp;
+
+#Known parameters, all starting with YY (leading YY will be discarded)
+my(%params)=(YYLEX => 'CODE', 'YYERROR' => 'CODE', YYVERSION => '',
+ YYRULES => 'ARRAY', YYSTATES => 'ARRAY', YYDEBUG => '');
+#Mandatory parameters
+my(@params)=('LEX','RULES','STATES');
+
+sub new {
+ my($class)=shift;
+ my($errst,$nberr,$token,$value,$check,$dotpos);
+ my($self)={ ERROR => \&_Error,
+ ERRST => \$errst,
+ NBERR => \$nberr,
+ TOKEN => \$token,
+ VALUE => \$value,
+ DOTPOS => \$dotpos,
+ STACK => [],
+ DEBUG => 0,
+ CHECK => \$check };
+
+ _CheckParams( [], \%params, \@_, $self );
+
+ exists($$self{VERSION})
+ and $$self{VERSION} < $COMPATIBLE
+ and croak "Yapp driver version $VERSION ".
+ "incompatible with version $$self{VERSION}:\n".
+ "Please recompile parser module.";
+
+ ref($class)
+ and $class=ref($class);
+
+ bless($self,$class);
+}
+
+sub YYParse {
+ my($self)=shift;
+ my($retval);
+
+ _CheckParams( \@params, \%params, \@_, $self );
+
+ if($$self{DEBUG}) {
+ _DBLoad();
+ $retval = eval '$self->_DBParse()';#Do not create stab entry on compile
+ $@ and die $@;
+ }
+ else {
+ $retval = $self->_Parse();
+ }
+ $retval
+}
+
+sub YYData {
+ my($self)=shift;
+
+ exists($$self{USER})
+ or $$self{USER}={};
+
+ $$self{USER};
+
+}
+
+sub YYErrok {
+ my($self)=shift;
+
+ ${$$self{ERRST}}=0;
+ undef;
+}
+
+sub YYNberr {
+ my($self)=shift;
+
+ ${$$self{NBERR}};
+}
+
+sub YYRecovering {
+ my($self)=shift;
+
+ ${$$self{ERRST}} != 0;
+}
+
+sub YYAbort {
+ my($self)=shift;
+
+ ${$$self{CHECK}}='ABORT';
+ undef;
+}
+
+sub YYAccept {
+ my($self)=shift;
+
+ ${$$self{CHECK}}='ACCEPT';
+ undef;
+}
+
+sub YYError {
+ my($self)=shift;
+
+ ${$$self{CHECK}}='ERROR';
+ undef;
+}
+
+sub YYSemval {
+ my($self)=shift;
+ my($index)= $_[0] - ${$$self{DOTPOS}} - 1;
+
+ $index < 0
+ and -$index <= @{$$self{STACK}}
+ and return $$self{STACK}[$index][1];
+
+ undef; #Invalid index
+}
+
+sub YYCurtok {
+ my($self)=shift;
+
+ @_
+ and ${$$self{TOKEN}}=$_[0];
+ ${$$self{TOKEN}};
+}
+
+sub YYCurval {
+ my($self)=shift;
+
+ @_
+ and ${$$self{VALUE}}=$_[0];
+ ${$$self{VALUE}};
+}
+
+sub YYExpect {
+ my($self)=shift;
+
+ keys %{$self->{STATES}[$self->{STACK}[-1][0]]{ACTIONS}}
+}
+
+sub YYLexer {
+ my($self)=shift;
+
+ $$self{LEX};
+}
+
+
+#################
+# Private stuff #
+#################
+
+
+sub _CheckParams {
+ my($mandatory,$checklist,$inarray,$outhash)=@_;
+ my($prm,$value);
+ my($prmlst)={};
+
+ while(($prm,$value)=splice(@$inarray,0,2)) {
+ $prm=uc($prm);
+ exists($$checklist{$prm})
+ or croak("Unknow parameter '$prm'");
+ ref($value) eq $$checklist{$prm}
+ or croak("Invalid value for parameter '$prm'");
+ $prm=unpack('@2A*',$prm);
+ $$outhash{$prm}=$value;
+ }
+ for (@$mandatory) {
+ exists($$outhash{$_})
+ or croak("Missing mandatory parameter '".lc($_)."'");
+ }
+}
+
+sub _Error {
+ print "Parse error.\n";
+}
+
+sub _DBLoad {
+ {
+ no strict 'refs';
+
+ exists(${__PACKAGE__.'::'}{_DBParse})#Already loaded ?
+ and return;
+ }
+ my($fname)=__FILE__;
+ my(@drv);
+ open(DRV,"<$fname") or die "Report this as a BUG: Cannot open $fname";
+ while(<DRV>) {
+ /^\s*sub\s+_Parse\s*{\s*$/ .. /^\s*}\s*#\s*_Parse\s*$/
+ and do {
+ s/^#DBG>//;
+ push(@drv,$_);
+ }
+ }
+ close(DRV);
+
+ $drv[0]=~s/_P/_DBP/;
+ eval join('',@drv);
+}
+
+#Note that for loading debugging version of the driver,
+#this file will be parsed from 'sub _Parse' up to '}#_Parse' inclusive.
+#So, DO NOT remove comment at end of sub !!!
+sub _Parse {
+ my($self)=shift;
+
+ my($rules,$states,$lex,$error)
+ = @$self{ 'RULES', 'STATES', 'LEX', 'ERROR' };
+ my($errstatus,$nberror,$token,$value,$stack,$check,$dotpos)
+ = @$self{ 'ERRST', 'NBERR', 'TOKEN', 'VALUE', 'STACK', 'CHECK', 'DOTPOS' };
+
+#DBG> my($debug)=$$self{DEBUG};
+#DBG> my($dbgerror)=0;
+
+#DBG> my($ShowCurToken) = sub {
+#DBG> my($tok)='>';
+#DBG> for (split('',$$token)) {
+#DBG> $tok.= (ord($_) < 32 or ord($_) > 126)
+#DBG> ? sprintf('<%02X>',ord($_))
+#DBG> : $_;
+#DBG> }
+#DBG> $tok.='<';
+#DBG> };
+
+ $$errstatus=0;
+ $$nberror=0;
+ ($$token,$$value)=(undef,undef);
+ @$stack=( [ 0, undef ] );
+ $$check='';
+
+ while(1) {
+ my($actions,$act,$stateno);
+
+ $stateno=$$stack[-1][0];
+ $actions=$$states[$stateno];
+
+#DBG> print STDERR ('-' x 40),"\n";
+#DBG> $debug & 0x2
+#DBG> and print STDERR "In state $stateno:\n";
+#DBG> $debug & 0x08
+#DBG> and print STDERR "Stack:[".
+#DBG> join(',',map { $$_[0] } @$stack).
+#DBG> "]\n";
+
+
+ if (exists($$actions{ACTIONS})) {
+
+ defined($$token)
+ or do {
+ ($$token,$$value)=&$lex($self);
+#DBG> $debug & 0x01
+#DBG> and print STDERR "Need token. Got ".&$ShowCurToken."\n";
+ };
+
+ $act= exists($$actions{ACTIONS}{$$token})
+ ? $$actions{ACTIONS}{$$token}
+ : exists($$actions{DEFAULT})
+ ? $$actions{DEFAULT}
+ : undef;
+ }
+ else {
+ $act=$$actions{DEFAULT};
+#DBG> $debug & 0x01
+#DBG> and print STDERR "Don't need token.\n";
+ }
+
+ defined($act)
+ and do {
+
+ $act > 0
+ and do { #shift
+
+#DBG> $debug & 0x04
+#DBG> and print STDERR "Shift and go to state $act.\n";
+
+ $$errstatus
+ and do {
+ --$$errstatus;
+
+#DBG> $debug & 0x10
+#DBG> and $dbgerror
+#DBG> and $$errstatus == 0
+#DBG> and do {
+#DBG> print STDERR "**End of Error recovery.\n";
+#DBG> $dbgerror=0;
+#DBG> };
+ };
+
+
+ push(@$stack,[ $act, $$value ]);
+
+ $$token ne '' #Don't eat the eof
+ and $$token=$$value=undef;
+ next;
+ };
+
+ #reduce
+ my($lhs,$len,$code,@sempar,$semval);
+ ($lhs,$len,$code)=@{$$rules[-$act]};
+
+#DBG> $debug & 0x04
+#DBG> and $act
+#DBG> and print STDERR "Reduce using rule ".-$act." ($lhs,$len): ";
+
+ $act
+ or $self->YYAccept();
+
+ $$dotpos=$len;
+
+ unpack('A1',$lhs) eq '@' #In line rule
+ and do {
+ $lhs =~ /^\@[0-9]+\-([0-9]+)$/
+ or die "In line rule name '$lhs' ill formed: ".
+ "report it as a BUG.\n";
+ $$dotpos = $1;
+ };
+
+ @sempar = $$dotpos
+ ? map { $$_[1] } @$stack[ -$$dotpos .. -1 ]
+ : ();
+
+ $semval = $code ? &$code( $self, @sempar )
+ : @sempar ? $sempar[0] : undef;
+
+ splice(@$stack,-$len,$len);
+
+ $$check eq 'ACCEPT'
+ and do {
+
+#DBG> $debug & 0x04
+#DBG> and print STDERR "Accept.\n";
+
+ return($semval);
+ };
+
+ $$check eq 'ABORT'
+ and do {
+
+#DBG> $debug & 0x04
+#DBG> and print STDERR "Abort.\n";
+
+ return(undef);
+
+ };
+
+#DBG> $debug & 0x04
+#DBG> and print STDERR "Back to state $$stack[-1][0], then ";
+
+ $$check eq 'ERROR'
+ or do {
+#DBG> $debug & 0x04
+#DBG> and print STDERR
+#DBG> "go to state $$states[$$stack[-1][0]]{GOTOS}{$lhs}.\n";
+
+#DBG> $debug & 0x10
+#DBG> and $dbgerror
+#DBG> and $$errstatus == 0
+#DBG> and do {
+#DBG> print STDERR "**End of Error recovery.\n";
+#DBG> $dbgerror=0;
+#DBG> };
+
+ push(@$stack,
+ [ $$states[$$stack[-1][0]]{GOTOS}{$lhs}, $semval ]);
+ $$check='';
+ next;
+ };
+
+#DBG> $debug & 0x04
+#DBG> and print STDERR "Forced Error recovery.\n";
+
+ $$check='';
+
+ };
+
+ #Error
+ $$errstatus
+ or do {
+
+ $$errstatus = 1;
+ &$error($self);
+ $$errstatus # if 0, then YYErrok has been called
+ or next; # so continue parsing
+
+#DBG> $debug & 0x10
+#DBG> and do {
+#DBG> print STDERR "**Entering Error recovery.\n";
+#DBG> ++$dbgerror;
+#DBG> };
+
+ ++$$nberror;
+
+ };
+
+ $$errstatus == 3 #The next token is not valid: discard it
+ and do {
+ $$token eq '' # End of input: no hope
+ and do {
+#DBG> $debug & 0x10
+#DBG> and print STDERR "**At eof: aborting.\n";
+ return(undef);
+ };
+
+#DBG> $debug & 0x10
+#DBG> and print STDERR "**Dicard invalid token ".&$ShowCurToken.".\n";
+
+ $$token=$$value=undef;
+ };
+
+ $$errstatus=3;
+
+ while( @$stack
+ and ( not exists($$states[$$stack[-1][0]]{ACTIONS})
+ or not exists($$states[$$stack[-1][0]]{ACTIONS}{error})
+ or $$states[$$stack[-1][0]]{ACTIONS}{error} <= 0)) {
+
+#DBG> $debug & 0x10
+#DBG> and print STDERR "**Pop state $$stack[-1][0].\n";
+
+ pop(@$stack);
+ }
+
+ @$stack
+ or do {
+
+#DBG> $debug & 0x10
+#DBG> and print STDERR "**No state left on stack: aborting.\n";
+
+ return(undef);
+ };
+
+ #shift the error token
+
+#DBG> $debug & 0x10
+#DBG> and print STDERR "**Shift \$error token and go to state ".
+#DBG> $$states[$$stack[-1][0]]{ACTIONS}{error}.
+#DBG> ".\n";
+
+ push(@$stack, [ $$states[$$stack[-1][0]]{ACTIONS}{error}, undef ]);
+
+ }
+
+ #never reached
+ croak("Error in driver logic. Please, report it as a BUG");
+
+}#_Parse
+#DO NOT remove comment
+
+1;
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/Parse/Yapp/Grammar.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,381 @@
+#
+# Module Parse::Yapp::Grammar
+#
+# (c) Copyright 1998-2001 Francois Desarmenien, all rights reserved.
+# (see the pod text in Parse::Yapp module for use and distribution rights)
+#
+package Parse::Yapp::Grammar;
+@ISA=qw( Parse::Yapp::Options );
+
+require 5.004;
+
+use Carp;
+use strict;
+use Parse::Yapp::Options;
+use Parse::Yapp::Parse;
+
+###############
+# Constructor #
+###############
+sub new {
+ my($class)=shift;
+ my($values);
+
+ my($self)=$class->SUPER::new(@_);
+
+ my($parser)=new Parse::Yapp::Parse;
+
+ defined($self->Option('input'))
+ or croak "No input grammar";
+
+ $values = $parser->Parse($self->Option('input'));
+
+ undef($parser);
+
+ $$self{GRAMMAR}=_ReduceGrammar($values);
+
+ ref($class)
+ and $class=ref($class);
+
+ bless($self, $class);
+}
+
+###########
+# Methods #
+###########
+##########################
+# Method To View Grammar #
+##########################
+sub ShowRules {
+ my($self)=shift;
+ my($rules)=$$self{GRAMMAR}{RULES};
+ my($ruleno)=-1;
+ my($text);
+
+ for (@$rules) {
+ my($lhs,$rhs)=@$_;
+
+ $text.=++$ruleno.":\t".$lhs." -> ";
+ if(@$rhs) {
+ $text.=join(' ',map { $_ eq chr(0) ? '$end' : $_ } @$rhs);
+ }
+ else {
+ $text.="/* empty */";
+ }
+ $text.="\n";
+ }
+ $text;
+}
+
+###########################
+# Method To View Warnings #
+###########################
+sub Warnings {
+ my($self)=shift;
+ my($text);
+ my($grammar)=$$self{GRAMMAR};
+
+ exists($$grammar{UUTERM})
+ and do {
+ $text="Unused terminals:\n\n";
+ for (@{$$grammar{UUTERM}}) {
+ $text.="\t$$_[0], declared line $$_[1]\n";
+ }
+ $text.="\n";
+ };
+ exists($$grammar{UUNTERM})
+ and do {
+ $text.="Useless non-terminals:\n\n";
+ for (@{$$grammar{UUNTERM}}) {
+ $text.="\t$$_[0], declared line $$_[1]\n";
+ }
+ $text.="\n";
+ };
+ exists($$grammar{UURULES})
+ and do {
+ $text.="Useless rules:\n\n";
+ for (@{$$grammar{UURULES}}) {
+ $text.="\t$$_[0] -> ".join(' ',@{$$_[1]})."\n";
+ }
+ $text.="\n";
+ };
+ $text;
+}
+
+######################################
+# Method to get summary about parser #
+######################################
+sub Summary {
+ my($self)=shift;
+ my($text);
+
+ $text ="Number of rules : ".
+ scalar(@{$$self{GRAMMAR}{RULES}})."\n";
+ $text.="Number of terminals : ".
+ scalar(keys(%{$$self{GRAMMAR}{TERM}}))."\n";
+ $text.="Number of non-terminals : ".
+ scalar(keys(%{$$self{GRAMMAR}{NTERM}}))."\n";
+ $text;
+}
+
+###############################
+# Method to Ouput rules table #
+###############################
+sub RulesTable {
+ my($self)=shift;
+ my($inputfile)=$self->Option('inputfile');
+ my($linenums)=$self->Option('linenumbers');
+ my($rules)=$$self{GRAMMAR}{RULES};
+ my($ruleno);
+ my($text);
+
+ defined($inputfile)
+ or $inputfile = 'unkown';
+
+ $text="[\n\t";
+
+ $text.=join(",\n\t",
+ map {
+ my($lhs,$rhs,$code)=@$_[0,1,3];
+ my($len)=scalar(@$rhs);
+ my($text);
+
+ $text.="[#Rule ".$ruleno++."\n\t\t '$lhs', $len,";
+ if($code) {
+ $text.= "\nsub".
+ ( $linenums
+ ? qq(\n#line $$code[1] "$inputfile"\n)
+ : " ").
+ "{$$code[0]}";
+ }
+ else {
+ $text.=' undef';
+ }
+ $text.="\n\t]";
+
+ $text;
+ } @$rules);
+
+ $text.="\n]";
+
+ $text;
+}
+
+################################
+# Methods to get HEAD and TAIL #
+################################
+sub Head {
+ my($self)=shift;
+ my($inputfile)=$self->Option('inputfile');
+ my($linenums)=$self->Option('linenumbers');
+ my($text);
+
+ $$self{GRAMMAR}{HEAD}[0]
+ or return '';
+
+ defined($inputfile)
+ or $inputfile = 'unkown';
+
+ for (@{$$self{GRAMMAR}{HEAD}}) {
+ $linenums
+ and $text.=qq(#line $$_[1] "$inputfile"\n);
+ $text.=$$_[0];
+ }
+ $text
+}
+
+sub Tail {
+ my($self)=shift;
+ my($inputfile)=$self->Option('inputfile');
+ my($linenums)=$self->Option('linenumbers');
+ my($text);
+
+ $$self{GRAMMAR}{TAIL}[0]
+ or return '';
+
+ defined($inputfile)
+ or $inputfile = 'unkown';
+
+ $linenums
+ and $text=qq(#line $$self{GRAMMAR}{TAIL}[1] "$inputfile"\n);
+ $text.=$$self{GRAMMAR}{TAIL}[0];
+
+ $text
+}
+
+
+#################
+# Private Stuff #
+#################
+
+sub _UsefulRules {
+ my($rules,$nterm) = @_;
+ my($ufrules,$ufnterm);
+ my($done);
+
+ $ufrules=pack('b'.@$rules);
+ $ufnterm={};
+
+ vec($ufrules,0,1)=1; #start rules IS always useful
+
+ RULE:
+ for (1..$#$rules) { # Ignore start rule
+ for my $sym (@{$$rules[$_][1]}) {
+ exists($$nterm{$sym})
+ and next RULE;
+ }
+ vec($ufrules,$_,1)=1;
+ ++$$ufnterm{$$rules[$_][0]};
+ }
+
+ do {
+ $done=1;
+
+ RULE:
+ for (grep { vec($ufrules,$_,1) == 0 } 1..$#$rules) {
+ for my $sym (@{$$rules[$_][1]}) {
+ exists($$nterm{$sym})
+ and not exists($$ufnterm{$sym})
+ and next RULE;
+ }
+ vec($ufrules,$_,1)=1;
+ exists($$ufnterm{$$rules[$_][0]})
+ or do {
+ $done=0;
+ ++$$ufnterm{$$rules[$_][0]};
+ };
+ }
+
+ }until($done);
+
+ ($ufrules,$ufnterm)
+
+}#_UsefulRules
+
+sub _Reachable {
+ my($rules,$nterm,$term,$ufrules,$ufnterm)=@_;
+ my($reachable);
+ my(@fifo)=( 0 );
+
+ $reachable={ '$start' => 1 }; #$start is always reachable
+
+ while(@fifo) {
+ my($ruleno)=shift(@fifo);
+
+ for my $sym (@{$$rules[$ruleno][1]}) {
+
+ exists($$term{$sym})
+ and do {
+ ++$$reachable{$sym};
+ next;
+ };
+
+ ( not exists($$ufnterm{$sym})
+ or exists($$reachable{$sym}) )
+ and next;
+
+ ++$$reachable{$sym};
+ push(@fifo, grep { vec($ufrules,$_,1) } @{$$nterm{$sym}});
+ }
+ }
+
+ $reachable
+
+}#_Reachable
+
+sub _SetNullable {
+ my($rules,$term,$nullable) = @_;
+ my(@nrules);
+ my($done);
+
+ RULE:
+ for (@$rules) {
+ my($lhs,$rhs)=@$_;
+
+ exists($$nullable{$lhs})
+ and next;
+
+ for (@$rhs) {
+ exists($$term{$_})
+ and next RULE;
+ }
+ push(@nrules,[$lhs,$rhs]);
+ }
+
+ do {
+ $done=1;
+
+ RULE:
+ for (@nrules) {
+ my($lhs,$rhs)=@$_;
+
+ exists($$nullable{$lhs})
+ and next;
+
+ for (@$rhs) {
+ exists($$nullable{$_})
+ or next RULE;
+ }
+ $done=0;
+ ++$$nullable{$lhs};
+ }
+
+ }until($done);
+}
+
+sub _ReduceGrammar {
+ my($values)=@_;
+ my($ufrules,$ufnterm,$reachable);
+ my($grammar)={ HEAD => $values->{HEAD},
+ TAIL => $values->{TAIL},
+ EXPECT => $values->{EXPECT} };
+ my($rules,$nterm,$term) = @$values {'RULES', 'NTERM', 'TERM'};
+
+ ($ufrules,$ufnterm) = _UsefulRules($rules,$nterm);
+
+ exists($$ufnterm{$values->{START}})
+ or die "*Fatal* Start symbol $values->{START} derives nothing, at eof\n";
+
+ $reachable = _Reachable($rules,$nterm,$term,$ufrules,$ufnterm);
+
+ $$grammar{TERM}{chr(0)}=undef;
+ for my $sym (keys %$term) {
+ ( exists($$reachable{$sym})
+ or exists($values->{PREC}{$sym}) )
+ and do {
+ $$grammar{TERM}{$sym}
+ = defined($$term{$sym}[0]) ? $$term{$sym} : undef;
+ next;
+ };
+ push(@{$$grammar{UUTERM}},[ $sym, $values->{SYMS}{$sym} ]);
+ }
+
+ $$grammar{NTERM}{'$start'}=[];
+ for my $sym (keys %$nterm) {
+ exists($$reachable{$sym})
+ and do {
+ exists($values->{NULL}{$sym})
+ and ++$$grammar{NULLABLE}{$sym};
+ $$grammar{NTERM}{$sym}=[];
+ next;
+ };
+ push(@{$$grammar{UUNTERM}},[ $sym, $values->{SYMS}{$sym} ]);
+ }
+
+ for my $ruleno (0..$#$rules) {
+ vec($ufrules,$ruleno,1)
+ and exists($$grammar{NTERM}{$$rules[$ruleno][0]})
+ and do {
+ push(@{$$grammar{RULES}},$$rules[$ruleno]);
+ push(@{$$grammar{NTERM}{$$rules[$ruleno][0]}},$#{$$grammar{RULES}});
+ next;
+ };
+ push(@{$$grammar{UURULES}},[ @{$$rules[$ruleno]}[0,1] ]);
+ }
+
+ _SetNullable(@$grammar{'RULES', 'TERM', 'NULLABLE'});
+
+ $grammar;
+}#_ReduceGrammar
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/Parse/Yapp/Lalr.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,939 @@
+#
+# Module Parse::Yapp::Lalr
+#
+# (c) Copyright 1998-2001 Francois Desarmenien, all rights reserved.
+# (see the pod text in Parse::Yapp module for use and distribution rights)
+#
+package Parse::Yapp::Lalr;
+@ISA=qw( Parse::Yapp::Grammar );
+
+require 5.004;
+
+use Parse::Yapp::Grammar;
+
+=for nobody
+
+Parse::Yapp::Compile Object Structure:
+--------------------------------------
+{
+ GRAMMAR => Parse::Yapp::Grammar,
+ STATES => [ { CORE => [ items... ],
+ ACTIONS => { term => action }
+ GOTOS => { nterm => stateno }
+ }... ]
+ CONFLICTS=>{ SOLVED => { stateno => [ ruleno, token, solved ] },
+ FORCED => { TOTAL => [ nbsr, nbrr ],
+ DETAIL => { stateno => { TOTAL => [ nbsr, nbrr ] }
+ LIST => [ ruleno, token ]
+ }
+ }
+ }
+}
+
+'items' are of form: [ ruleno, dotpos ]
+'term' in ACTIONS is '' means default action
+'action' may be:
+ undef: explicit error (nonassociativity)
+ 0 : accept
+ >0 : shift and go to state 'action'
+ <0 : reduce using rule -'action'
+'solved' may have values of:
+ 'shift' if solved as Shift
+ 'reduce' if solved as Reduce
+ 'error' if solved by discarding both Shift and Reduce (nonassoc)
+
+SOLVED is a set of states containing Solved conflicts
+FORCED are forced conflict resolutions
+
+nbsr and nbrr are number of shift/reduce and reduce/reduce conflicts
+
+TOTAL is the total number of SR/RR conflicts for the parser
+
+DETAIL is the detail of conflicts for each state
+TOTAL is the total number of SR/RR conflicts for a state
+LIST is the list of discarded reductions (for display purpose only)
+
+
+=cut
+
+use strict;
+
+use Carp;
+
+###############
+# Constructor #
+###############
+sub new {
+ my($class)=shift;
+
+ ref($class)
+ and $class=ref($class);
+
+ my($self)=$class->SUPER::new(@_);
+ $self->_Compile();
+ bless($self,$class);
+}
+###########
+# Methods #
+###########
+
+###########################
+# Method To View Warnings #
+###########################
+sub Warnings {
+ my($self)=shift;
+ my($text);
+ my($nbsr,$nbrr)=@{$$self{CONFLICTS}{FORCED}{TOTAL}};
+
+ $text=$self->SUPER::Warnings();
+
+ $nbsr != $$self{GRAMMAR}{EXPECT}
+ and $text.="$nbsr shift/reduce conflict".($nbsr > 1 ? "s" : "");
+
+ $nbrr
+ and do {
+ $nbsr
+ and $text.=" and ";
+ $text.="$nbrr reduce/reduce conflict".($nbrr > 1 ? "s" : "");
+ };
+
+ ( $nbsr != $$self{GRAMMAR}{EXPECT}
+ or $nbrr)
+ and $text.="\n";
+
+ $text;
+}
+#############################
+# Method To View DFA States #
+#############################
+sub ShowDfa {
+ my($self)=shift;
+ my($text);
+ my($grammar,$states)=($$self{GRAMMAR}, $$self{STATES});
+
+ for my $stateno (0..$#$states) {
+ my(@shifts,@reduces,@errors,$default);
+
+ $text.="State $stateno:\n\n";
+
+ #Dump Kernel Items
+ for (sort { $$a[0] <=> $$b[0]
+ or $$a[1] <=> $$b[1] } @{$$states[$stateno]{'CORE'}}) {
+ my($ruleno,$pos)=@$_;
+ my($lhs,$rhs)=@{$$grammar{RULES}[$ruleno]}[0,1];
+ my(@rhscopy)=@$rhs;
+
+ $ruleno
+ or $rhscopy[-1] = '$end';
+
+ splice(@rhscopy,$pos,0,'.');
+ $text.= "\t$lhs -> ".join(' ',@rhscopy)."\t(Rule $ruleno)\n";
+ }
+
+ #Prepare Actions
+ for (keys(%{$$states[$stateno]{ACTIONS}})) {
+ my($term,$action)=($_,$$states[$stateno]{ACTIONS}{$_});
+
+ $term eq chr(0)
+ and $term = '$end';
+
+ not defined($action)
+ and do {
+ push(@errors,$term);
+ next;
+ };
+
+ $action > 0
+ and do {
+ push(@shifts,[ $term, $action ]);
+ next;
+ };
+
+ $action = -$action;
+
+ $term
+ or do {
+ $default= [ '$default', $action ];
+ next;
+ };
+
+ push(@reduces,[ $term, $action ]);
+ }
+
+ #Dump shifts
+ @shifts
+ and do {
+ $text.="\n";
+ for (sort { $$a[0] cmp $$b[0] } @shifts) {
+ my($term,$shift)=@$_;
+
+ $text.="\t$term\tshift, and go to state $shift\n";
+ }
+ };
+
+ #Dump errors
+ @errors
+ and do {
+ $text.="\n";
+ for my $term (sort { $a cmp $b } @errors) {
+ $text.="\t$term\terror (nonassociative)\n";
+ }
+ };
+
+ #Prepare reduces
+ exists($$self{CONFLICTS}{FORCED}{DETAIL}{$stateno})
+ and push(@reduces,@{$$self{CONFLICTS}{FORCED}{DETAIL}{$stateno}{LIST}});
+
+ @reduces=sort { $$a[0] cmp $$b[0] or $$a[1] <=> $$b[1] } @reduces;
+
+ defined($default)
+ and push(@reduces,$default);
+
+ #Dump reduces
+ @reduces
+ and do {
+ $text.="\n";
+ for (@reduces) {
+ my($term,$ruleno)=@$_;
+ my($discard);
+
+ $ruleno < 0
+ and do {
+ ++$discard;
+ $ruleno = -$ruleno;
+ };
+
+ $text.= "\t$term\t".($discard ? "[" : "");
+ if($ruleno) {
+ $text.= "reduce using rule $ruleno ".
+ "($$grammar{RULES}[$ruleno][0])";
+ }
+ else {
+ $text.='accept';
+ }
+ $text.=($discard ? "]" : "")."\n";
+ }
+ };
+
+ #Dump gotos
+ exists($$states[$stateno]{GOTOS})
+ and do {
+ $text.= "\n";
+ for (keys(%{$$states[$stateno]{GOTOS}})) {
+ $text.= "\t$_\tgo to state $$states[$stateno]{GOTOS}{$_}\n";
+ }
+ };
+
+ $text.="\n";
+ }
+ $text;
+}
+
+######################################
+# Method to get summary about parser #
+######################################
+sub Summary {
+ my($self)=shift;
+ my($text);
+
+ $text=$self->SUPER::Summary();
+ $text.="Number of states : ".
+ scalar(@{$$self{STATES}})."\n";
+ $text;
+}
+
+#######################################
+# Method To Get Infos about conflicts #
+#######################################
+sub Conflicts {
+ my($self)=shift;
+ my($states)=$$self{STATES};
+ my($conflicts)=$$self{CONFLICTS};
+ my($text);
+
+ for my $stateno ( sort { $a <=> $b } keys(%{$$conflicts{SOLVED}})) {
+
+ for (@{$$conflicts{SOLVED}{$stateno}}) {
+ my($ruleno,$token,$how)=@$_;
+
+ $token eq chr(0)
+ and $token = '$end';
+
+ $text.="Conflict in state $stateno between rule ".
+ "$ruleno and token $token resolved as $how.\n";
+ }
+ };
+
+ for my $stateno ( sort { $a <=> $b } keys(%{$$conflicts{FORCED}{DETAIL}})) {
+ my($nbsr,$nbrr)=@{$$conflicts{FORCED}{DETAIL}{$stateno}{TOTAL}};
+
+ $text.="State $stateno contains ";
+
+ $nbsr
+ and $text.="$nbsr shift/reduce conflict".
+ ($nbsr > 1 ? "s" : "");
+
+ $nbrr
+ and do {
+ $nbsr
+ and $text.=" and ";
+
+ $text.="$nbrr reduce/reduce conflict".
+ ($nbrr > 1 ? "s" : "");
+ };
+ $text.="\n";
+ };
+
+ $text;
+}
+
+#################################
+# Method to dump parsing tables #
+#################################
+sub DfaTable {
+ my($self)=shift;
+ my($states)=$$self{STATES};
+ my($stateno);
+ my($text);
+
+ $text="[\n\t{";
+
+ $text.=join("\n\t},\n\t{",
+ map {
+ my($state)=$_;
+ my($text);
+
+ $text="#State ".$stateno++."\n\t\t";
+
+ ( not exists($$state{ACTIONS}{''})
+ or keys(%{$$state{ACTIONS}}) > 1)
+ and do {
+
+ $text.="ACTIONS => {\n\t\t\t";
+
+ $text.=join(",\n\t\t\t",
+ map {
+ my($term,$action)=($_,$$state{ACTIONS}{$_});
+ my($text);
+
+ if(substr($term,0,1) eq "'") {
+ $term=~s/([\@\$\"])/\\$1/g;
+ $term=~s/^'|'$/"/g;
+ }
+ else {
+ $term= $term eq chr(0)
+ ? "''"
+ : "'$term'";
+ }
+
+ if(defined($action)) {
+ $action=int($action);
+ }
+ else {
+ $action='undef';
+ }
+
+ "$term => $action";
+
+ } grep { $_ } keys(%{$$state{ACTIONS}}));
+
+ $text.="\n\t\t}";
+ };
+
+ exists($$state{ACTIONS}{''})
+ and do {
+ keys(%{$$state{ACTIONS}}) > 1
+ and $text.=",\n\t\t";
+
+ $text.="DEFAULT => $$state{ACTIONS}{''}";
+ };
+
+ exists($$state{GOTOS})
+ and do {
+ $text.=",\n\t\tGOTOS => {\n\t\t\t";
+ $text.=join(",\n\t\t\t",
+ map {
+ my($nterm,$stateno)=($_,$$state{GOTOS}{$_});
+ my($text);
+
+ "'$nterm' => $stateno";
+
+ } keys(%{$$state{GOTOS}}));
+ $text.="\n\t\t}";
+ };
+
+ $text;
+
+ }@$states);
+
+ $text.="\n\t}\n]";
+
+ $text;
+
+}
+
+
+####################################
+# Method to build Dfa from Grammar #
+####################################
+sub _Compile {
+ my($self)=shift;
+ my($grammar,$states);
+
+ $grammar=$self->{GRAMMAR};
+
+ $states = _LR0($grammar);
+
+ $self->{CONFLICTS} = _LALR($grammar,$states);
+
+ $self->{STATES}=$states;
+}
+
+#########################
+# LR0 States Generation #
+#########################
+#
+###########################
+# General digraph routine #
+###########################
+sub _Digraph {
+ my($rel,$F)=@_;
+ my(%N,@S);
+ my($infinity)=(~(1<<31));
+ my($Traverse);
+
+ $Traverse = sub {
+ my($x,$d)=@_;
+ my($y);
+
+ push(@S,$x);
+ $N{$x}=$d;
+
+ exists($$rel{$x})
+ and do {
+ for $y (keys(%{$$rel{$x}})) {
+ exists($N{$y})
+ or &$Traverse($y,$d+1);
+
+ $N{$y} < $N{$x}
+ and $N{$x} = $N{$y};
+
+ $$F{$x}|=$$F{$y};
+ }
+ };
+
+ $N{$x} == $d
+ and do {
+ for(;;) {
+ $y=pop(@S);
+ $N{$y}=$infinity;
+ $y eq $x
+ and last;
+ $$F{$y}=$$F{$x};
+ }
+ };
+ };
+
+ for (keys(%$rel)) {
+ exists($N{$_})
+ or &$Traverse($_,1);
+ }
+}
+#######################
+# Generate LR0 states #
+#######################
+=for nobody
+Formula used for closures:
+
+ CLOSE(A) = DCLOSE(A) u U (CLOSE(B) | A close B)
+
+where:
+
+ DCLOSE(A) = { [ A -> alpha ] in P }
+
+ A close B iff [ A -> B gamma ] in P
+
+=cut
+sub _SetClosures {
+ my($grammar)=@_;
+ my($rel,$closures);
+
+ for my $symbol (keys(%{$$grammar{NTERM}})) {
+ $closures->{$symbol}=pack('b'.@{$$grammar{RULES}});
+
+ for my $ruleno (@{$$grammar{NTERM}{$symbol}}) {
+ my($rhs)=$$grammar{RULES}[$ruleno][1];
+
+ vec($closures->{$symbol},$ruleno,1)=1;
+
+ @$rhs > 0
+ and exists($$grammar{NTERM}{$$rhs[0]})
+ and ++$rel->{$symbol}{$$rhs[0]};
+ }
+ }
+ _Digraph($rel,$closures);
+
+ $closures
+}
+
+sub _Closures {
+ my($grammar,$core,$closures)=@_;
+ my($ruleset)=pack('b'.@{$$grammar{RULES}});
+
+ for (@$core) {
+ my($ruleno,$pos)=@$_;
+ my($rhs)=$$grammar{RULES}[$ruleno][1];
+
+ $pos < @$rhs
+ and exists($closures->{$$rhs[$pos]})
+ and $ruleset|=$closures->{$$rhs[$pos]};
+ }
+ [ @$core, map { [ $_, 0 ] }
+ grep { vec($ruleset,$_,1) }
+ 0..$#{$$grammar{RULES}} ];
+}
+
+sub _Transitions {
+ my($grammar,$cores,$closures,$states,$stateno)=@_;
+ my($core)=$$states[$stateno]{'CORE'};
+ my(%transitions);
+
+ for (@{_Closures($grammar,$core,$closures)}) {
+ my($ruleno,$pos)=@$_;
+ my($rhs)=$$grammar{RULES}[$ruleno][1];
+
+ $pos == @$rhs
+ and do {
+ push(@{$$states[$stateno]{ACTIONS}{''}},$ruleno);
+ next;
+ };
+ push(@{$transitions{$$rhs[$pos]}},[ $ruleno, $pos+1 ]);
+ }
+
+ for (keys(%transitions)) {
+ my($symbol,$core)=($_,$transitions{$_});
+ my($corekey)=join(',',map { join('.',@$_) }
+ sort { $$a[0] <=> $$b[0]
+ or $$a[1] <=> $$b[1] }
+ @$core);
+ my($tostateno);
+
+ exists($cores->{$corekey})
+ or do {
+ push(@$states,{ 'CORE' => $core });
+ $cores->{$corekey}=$#$states;
+ };
+
+ $tostateno=$cores->{$corekey};
+ push(@{$$states[$tostateno]{FROM}},$stateno);
+
+ exists($$grammar{TERM}{$_})
+ and do {
+ $$states[$stateno]{ACTIONS}{$_} = [ $tostateno ];
+ next;
+ };
+ $$states[$stateno]{GOTOS}{$_} = $tostateno;
+ }
+}
+
+sub _LR0 {
+ my($grammar)=@_;
+ my($states) = [];
+ my($stateno);
+ my($closures); #$closures={ nterm => ruleset,... }
+ my($cores)={}; # { "itemlist" => stateno, ... }
+ # where "itemlist" has the form:
+ # "ruleno.pos,ruleno.pos" ordered by ruleno,pos
+
+ $closures = _SetClosures($grammar);
+ push(@$states,{ 'CORE' => [ [ 0, 0 ] ] });
+ for($stateno=0;$stateno<@$states;++$stateno) {
+ _Transitions($grammar,$cores,$closures,$states,$stateno);
+ }
+
+ $states
+}
+
+#########################################################
+# Add Lookahead tokens where needed to make LALR states #
+#########################################################
+=for nobody
+ Compute First sets for non-terminal using the following formula:
+
+ FIRST(A) = { a in T u { epsilon } | A l a }
+ u
+ U { FIRST(B) | B in V and A l B }
+
+ where:
+
+ A l x iff [ A -> X1 X2 .. Xn x alpha ] in P and Xi =>* epsilon, 1 <= i <= n
+=cut
+sub _SetFirst {
+ my($grammar,$termlst,$terminx)=@_;
+ my($rel,$first)=( {}, {} );
+
+ for my $symbol (keys(%{$$grammar{NTERM}})) {
+ $first->{$symbol}=pack('b'.@$termlst);
+
+ RULE:
+ for my $ruleno (@{$$grammar{NTERM}{$symbol}}) {
+ my($rhs)=$$grammar{RULES}[$ruleno][1];
+
+ for (@$rhs) {
+ exists($terminx->{$_})
+ and do {
+ vec($first->{$symbol},$terminx->{$_},1)=1;
+ next RULE;
+ };
+ ++$rel->{$symbol}{$_};
+ exists($$grammar{NULLABLE}{$_})
+ or next RULE;
+ }
+ vec($first->{$symbol},0,1)=1;
+ }
+ }
+ _Digraph($rel,$first);
+
+ $first
+}
+
+sub _Preds {
+ my($states,$stateno,$len)=@_;
+ my($queue, $preds);
+
+ $len
+ or return [ $stateno ];
+
+ $queue=[ [ $stateno, $len ] ];
+ while(@$queue) {
+ my($pred) = shift(@$queue);
+ my($stateno, $len) = @$pred;
+
+ $len == 1
+ and do {
+ push(@$preds,@{$states->[$stateno]{FROM}});
+ next;
+ };
+
+ push(@$queue, map { [ $_, $len - 1 ] }
+ @{$states->[$stateno]{FROM}});
+ }
+
+ # Pass @$preds through a hash to ensure unicity
+ [ keys( %{ +{ map { ($_,1) } @$preds } } ) ];
+}
+
+sub _FirstSfx {
+ my($grammar,$firstset,$termlst,$terminx,$ruleno,$pos,$key)=@_;
+ my($first)=pack('b'.@$termlst);
+ my($rhs)=$$grammar{RULES}[$ruleno][1];
+
+ for (;$pos < @$rhs;++$pos) {
+ exists($terminx->{$$rhs[$pos]})
+ and do {
+ vec($first,$terminx->{$$rhs[$pos]},1)=1;
+ return($first);
+ };
+ $first|=$firstset->{$$rhs[$pos]};
+
+ vec($first,0,1)
+ and vec($first,0,1)=0;
+
+ exists($$grammar{NULLABLE}{$$rhs[$pos]})
+ or return($first);
+
+ }
+ vec($first,0,1)=1;
+ $first;
+}
+
+=for noboby
+ Compute Follow sets using following formula:
+
+ FOLLOW(p,A) = READ(p,A)
+ u
+ U { FOLLOW(q,B) | (p,A) include (q,B)
+
+ where:
+
+ READ(p,A) = U { FIRST(beta) | [ A -> alpha A . beta ] in KERNEL(GOTO(p,A))
+ } - { epsilon }
+
+ (p,a) include (q,B) iff [ B -> alpha A . beta ] in KERNEL(GOTO(p,A),
+ epsilon in FIRST(beta) and
+ q in PRED(p,alpha)
+=cut
+sub _ComputeFollows {
+ my($grammar,$states,$termlst)=@_;
+ my($firstset,$terminx);
+ my($inconsistent, $rel, $follows, $sfx)= ( {}, {}, {}, {} );
+
+ %$terminx= map { ($termlst->[$_],$_) } 0..$#$termlst;
+
+ $firstset=_SetFirst($grammar,$termlst,$terminx);
+
+ for my $stateno (0..$#$states) {
+ my($state)=$$states[$stateno];
+
+ exists($$state{ACTIONS}{''})
+ and ( @{$$state{ACTIONS}{''}} > 1
+ or keys(%{$$state{ACTIONS}}) > 1 )
+ and do {
+ ++$inconsistent->{$stateno};
+
+ for my $ruleno (@{$$state{ACTIONS}{''}}) {
+ my($lhs,$rhs)=@{$$grammar{RULES}[$ruleno]}[0,1];
+
+ for my $predno (@{_Preds($states,$stateno,scalar(@$rhs))}) {
+ ++$rel->{"$stateno.$ruleno"}{"$predno.$lhs"};
+ }
+ }
+ };
+
+ exists($$state{GOTOS})
+ or next;
+
+ for my $symbol (keys(%{$$state{GOTOS}})) {
+ my($tostate)=$$states[$$state{GOTOS}{$symbol}];
+ my($goto)="$stateno.$symbol";
+
+ $follows->{$goto}=pack('b'.@$termlst);
+
+ for my $item (@{$$tostate{'CORE'}}) {
+ my($ruleno,$pos)=@$item;
+ my($key)="$ruleno.$pos";
+
+ exists($sfx->{$key})
+ or $sfx->{$key} = _FirstSfx($grammar,$firstset,
+ $termlst,$terminx,
+ $ruleno,$pos,$key);
+
+ $follows->{$goto}|=$sfx->{$key};
+
+ vec($follows->{$goto},0,1)
+ and do {
+ my($lhs)=$$grammar{RULES}[$ruleno][0];
+
+ vec($follows->{$goto},0,1)=0;
+
+ for my $predno (@{_Preds($states,$stateno,$pos-1)}) {
+ ++$rel->{$goto}{"$predno.$lhs"};
+ }
+ };
+ }
+ }
+ }
+ _Digraph($rel,$follows);
+
+ ($follows,$inconsistent)
+}
+
+sub _ComputeLA {
+ my($grammar,$states)=@_;
+ my($termlst)= [ '',keys(%{$$grammar{TERM}}) ];
+
+ my($follows,$inconsistent) = _ComputeFollows($grammar,$states,$termlst);
+
+ for my $stateno ( keys(%$inconsistent ) ) {
+ my($state)=$$states[$stateno];
+ my($conflict);
+
+ #NB the sort is VERY important for conflicts resolution order
+ for my $ruleno (sort { $a <=> $b }
+ @{$$state{ACTIONS}{''}}) {
+ for my $term ( map { $termlst->[$_] } grep {
+ vec($follows->{"$stateno.$ruleno"},$_,1) }
+ 0..$#$termlst) {
+ exists($$state{ACTIONS}{$term})
+ and ++$conflict;
+ push(@{$$state{ACTIONS}{$term}},-$ruleno);
+ }
+ }
+ delete($$state{ACTIONS}{''});
+ $conflict
+ or delete($inconsistent->{$stateno});
+ }
+
+ $inconsistent
+}
+
+#############################
+# Solve remaining conflicts #
+#############################
+
+sub _SolveConflicts {
+ my($grammar,$states,$inconsistent)=@_;
+ my(%rulesprec,$RulePrec);
+ my($conflicts)={ SOLVED => {},
+ FORCED => { TOTAL => [ 0, 0 ],
+ DETAIL => {}
+ }
+ };
+
+ $RulePrec = sub {
+ my($ruleno)=@_;
+ my($rhs,$rprec)=@{$$grammar{RULES}[$ruleno]}[1,2];
+ my($lastterm);
+
+ defined($rprec)
+ and return($rprec);
+
+ exists($rulesprec{$ruleno})
+ and return($rulesprec{$ruleno});
+
+ $lastterm=(grep { exists($$grammar{TERM}{$_}) } @$rhs)[-1];
+
+ defined($lastterm)
+ and ref($$grammar{TERM}{$lastterm})
+ and do {
+ $rulesprec{$ruleno}=$$grammar{TERM}{$lastterm}[1];
+ return($rulesprec{$ruleno});
+ };
+
+ undef;
+ };
+
+ for my $stateno (keys(%$inconsistent)) {
+ my($state)=$$states[$stateno];
+ my($actions)=$$state{ACTIONS};
+ my($nbsr,$nbrr);
+
+ for my $term ( keys(%$actions) ) {
+ my($act)=$$actions{$term};
+
+ @$act > 1
+ or next;
+
+ $$act[0] > 0
+ and ref($$grammar{TERM}{$term})
+ and do {
+ my($assoc,$tprec)=@{$$grammar{TERM}{$term}};
+ my($k,$error);
+
+ for ($k=1;$k<@$act;++$k) {
+ my($ruleno)=-$$act[$k];
+ my($rprec)=&$RulePrec($ruleno);
+
+ defined($rprec)
+ or next;
+
+ ( $tprec > $rprec
+ or ( $tprec == $rprec and $assoc eq 'RIGHT'))
+ and do {
+ push(@{$$conflicts{SOLVED}{$stateno}},
+ [ $ruleno, $term, 'shift' ]);
+ splice(@$act,$k--,1);
+ next;
+ };
+ ( $tprec < $rprec
+ or $assoc eq 'LEFT')
+ and do {
+ push(@{$$conflicts{SOLVED}{$stateno}},
+ [ $ruleno, $term, 'reduce' ]);
+ $$act[0] > 0
+ and do {
+ splice(@$act,0,1);
+ --$k;
+ };
+ next;
+ };
+ push(@{$$conflicts{SOLVED}{$stateno}},
+ [ $ruleno, $term, 'error' ]);
+ splice(@$act,$k--,1);
+ $$act[0] > 0
+ and do {
+ splice(@$act,0,1);
+ ++$error;
+ --$k;
+ };
+ }
+ $error
+ and unshift(@$act,undef);
+ };
+
+ @$act > 1
+ and do {
+ $nbrr += @$act - 2;
+ ($$act[0] > 0 ? $nbsr : $nbrr) += 1;
+ push(@{$$conflicts{FORCED}{DETAIL}{$stateno}{LIST}},
+ map { [ $term, $_ ] } splice(@$act,1));
+ };
+ }
+
+ $nbsr
+ and do {
+ $$conflicts{FORCED}{TOTAL}[0]+=$nbsr;
+ $$conflicts{FORCED}{DETAIL}{$stateno}{TOTAL}[0]+=$nbsr;
+ };
+
+ $nbrr
+ and do {
+ $$conflicts{FORCED}{TOTAL}[1]+=$nbrr;
+ $$conflicts{FORCED}{DETAIL}{$stateno}{TOTAL}[1]+=$nbrr;
+ };
+
+ }
+
+ $conflicts
+}
+
+###############################
+# Make default reduce actions #
+###############################
+sub _SetDefaults {
+ my($states)=@_;
+
+ for my $state (@$states) {
+ my($actions)=$$state{ACTIONS};
+ my(%reduces,$default,$nodefault);
+
+ exists($$actions{''})
+ and do {
+ $$actions{''}[0] = -$$actions{''}[0];
+ ++$nodefault;
+ };
+
+ #shift error token => no default
+ exists($$actions{error})
+ and $$actions{error}[0] > 0
+ and ++$nodefault;
+
+ for my $term (keys(%$actions)) {
+
+ $$actions{$term}=$$actions{$term}[0];
+
+ ( not defined($$actions{$term})
+ or $$actions{$term} > 0
+ or $nodefault)
+ and next;
+
+ push(@{$reduces{$$actions{$term}}},$term);
+ }
+
+ keys(%reduces) > 0
+ or next;
+
+ $default=( map { $$_[0] }
+ sort { $$b[1] <=> $$a[1] or $$b[0] <=> $$a[0] }
+ map { [ $_, scalar(@{$reduces{$_}}) ] }
+ keys(%reduces))[0];
+
+ delete(@$actions{ @{$reduces{$default}} });
+ $$state{ACTIONS}{''}=$default;
+ }
+}
+
+sub _LALR {
+ my($grammar,$states) = @_;
+ my($conflicts,$inconsistent);
+
+ $inconsistent = _ComputeLA($grammar,$states);
+
+ $conflicts = _SolveConflicts($grammar,$states,$inconsistent);
+ _SetDefaults($states);
+
+ $conflicts
+}
+
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/Parse/Yapp/Options.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,186 @@
+#
+# Module Parse::Yapp::Options
+#
+# (c) Copyright 1999-2001 Francois Desarmenien, all rights reserved.
+# (see the pod text in Parse::Yapp module for use and distribution rights)
+#
+package Parse::Yapp::Options;
+
+use strict;
+use Carp;
+
+############################################################################
+#Definitions of options
+#
+# %known_options allowed options
+#
+# %default_options default
+#
+# %actions sub refs to execute if option is set with ($self,$value)
+# as parameters
+############################################################################
+#
+#A value of '' means any value can do
+#
+my(%known_options)= (
+ language => {
+ perl => "Ouput parser for Perl language",
+# for future use...
+# 'c++' => "Output parser for C++ language",
+# c => "Output parser for C language"
+ },
+ linenumbers => {
+ 0 => "Don't embbed line numbers in parser",
+ 1 => "Embbed source line numbers in parser"
+ },
+ inputfile => {
+ '' => "Input file name: will automagically fills input"
+ },
+ classname => {
+ '' => "Class name of parser object (Perl and C++)"
+ },
+ standalone => {
+ 0 => "Don't create a standalone parser (Perl and C++)",
+ 1 => "Create a standalone parser"
+ },
+ input => {
+ '' => "Input text of grammar"
+ },
+ template => {
+ '' => "Template text for generating grammar file"
+ },
+);
+
+my(%default_options)= (
+ language => 'perl',
+ linenumbers => 1,
+ inputfile => undef,
+ classname => 'Parser',
+ standalone => 0,
+ input => undef,
+ template => undef,
+ shebang => undef,
+);
+
+my(%actions)= (
+ inputfile => \&__LoadFile
+);
+
+#############################################################################
+#
+# Actions
+#
+# These are NOT a method, although they look like...
+#
+# They are super-private routines (that's why I prepend __ to their names)
+#
+#############################################################################
+sub __LoadFile {
+ my($self,$filename)=@_;
+
+ open(IN,"<$filename")
+ or croak "Cannot open input file '$filename' for reading";
+ $self->{OPTIONS}{input}=join('',<IN>);
+ close(IN);
+}
+
+#############################################################################
+#
+# Private methods
+#
+#############################################################################
+
+sub _SetOption {
+ my($self)=shift;
+ my($key,$value)=@_;
+
+ $key=lc($key);
+
+ @_ == 2
+ or croak "Invalid number of arguments";
+
+ exists($known_options{$key})
+ or croak "Unknown option: '$key'";
+
+ if(exists($known_options{$key}{lc($value)})) {
+ $value=lc($value);
+ }
+ elsif(not exists($known_options{$key}{''})) {
+ croak "Invalid value '$value' for option '$key'";
+ }
+
+ exists($actions{$key})
+ and &{$actions{$key}}($self,$value);
+
+ $self->{OPTIONS}{$key}=$value;
+}
+
+sub _GetOption {
+ my($self)=shift;
+ my($key)=map { lc($_) } @_;
+
+ @_ == 1
+ or croak "Invalid number of arguments";
+
+ exists($known_options{$key})
+ or croak "Unknown option: '$key'";
+
+ $self->{OPTIONS}{$key};
+}
+
+#############################################################################
+#
+# Public methods
+#
+#############################################################################
+
+#
+# Constructor
+#
+sub new {
+ my($class)=shift;
+ my($self)={ OPTIONS => { %default_options } };
+
+ ref($class)
+ and $class=ref($class);
+
+ bless($self,$class);
+
+ $self->Options(@_);
+
+ $self;
+}
+
+#
+# Specify one or more options to set
+#
+sub Options {
+ my($self)=shift;
+ my($key,$value);
+
+ @_ % 2 == 0
+ or croak "Invalid number of arguments";
+
+ while(($key,$value)=splice(@_,0,2)) {
+ $self->_SetOption($key,$value);
+ }
+}
+
+#
+# Set (2 parameters) or Get (1 parameter) values for one option
+#
+sub Option {
+ my($self)=shift;
+ my($key,$value)=@_;
+
+ @_ == 1
+ and return $self->_GetOption($key);
+
+ @_ == 2
+ and return $self->_SetOption($key,$value);
+
+ croak "Invalid number of arguments";
+
+}
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/Parse/Yapp/Output.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,92 @@
+#
+# Module Parse::Yapp::Output
+#
+# (c) Copyright 1998-2001 Francois Desarmenien, all rights reserved.
+# (see the pod text in Parse::Yapp module for use and distribution rights)
+#
+package Parse::Yapp::Output;
+@ISA=qw ( Parse::Yapp::Lalr );
+
+require 5.004;
+
+use Parse::Yapp::Lalr;
+use Parse::Yapp::Driver;
+
+use strict;
+
+use Carp;
+
+sub _CopyDriver {
+ my($text)='#Included Parse/Yapp/Driver.pm file'.('-' x 40)."\n";
+ open(DRV,$Parse::Yapp::Driver::FILENAME)
+ or die "BUG: could not open $Parse::Yapp::Driver::FILENAME";
+ $text.="{\n".join('',<DRV>)."}\n";
+ close(DRV);
+ $text.='#End of include'.('-' x 50)."\n";
+}
+
+sub Output {
+ my($self)=shift;
+
+ $self->Options(@_);
+
+ my($package)=$self->Option('classname');
+ my($head,$states,$rules,$tail,$driver);
+ my($version)=$Parse::Yapp::Driver::VERSION;
+ my($datapos);
+ my($text)=$self->Option('template') ||<<'EOT';
+####################################################################
+#
+# This file was generated using Parse::Yapp version <<$version>>.
+#
+# Don't edit this file, use source file instead.
+#
+# ANY CHANGE MADE HERE WILL BE LOST !
+#
+####################################################################
+package <<$package>>;
+use vars qw ( @ISA );
+use strict;
+
+@ISA= qw ( Parse::Yapp::Driver );
+<<$driver>>
+
+<<$head>>
+
+sub new {
+ my($class)=shift;
+ ref($class)
+ and $class=ref($class);
+
+ my($self)=$class->SUPER::new( yyversion => '<<$version>>',
+ yystates =>
+<<$states>>,
+ yyrules =>
+<<$rules>>,
+ @_);
+ bless($self,$class);
+}
+
+<<$tail>>
+1;
+EOT
+
+ $driver='use Parse::Yapp::Driver;';
+
+ defined($package)
+ or $package='Parse::Yapp::Default';
+
+ $head= $self->Head();
+ $rules=$self->RulesTable();
+ $states=$self->DfaTable();
+ $tail= $self->Tail();
+
+ $self->Option('standalone')
+ and $driver=_CopyDriver();
+
+ $text=~s/<<(\$.+)>>/$1/gee;
+
+ $text;
+}
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/Parse/Yapp/Parse.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1093 @@
+####################################################################
+#
+# This file was generated using Parse::Yapp version 1.05.
+#
+# Don't edit this file, use source file instead.
+#
+# ANY CHANGE MADE HERE WILL BE LOST !
+#
+####################################################################
+package Parse::Yapp::Parse;
+use vars qw ( @ISA );
+use strict;
+
+@ISA= qw ( Parse::Yapp::Driver );
+use Parse::Yapp::Driver;
+
+#line 1 "YappParse.yp"
+# (c) Copyright Francois Desarmenien 1998-2001, all rights reserved.
+# (see COPYRIGHT in Parse::Yapp.pm pod section for use and distribution rights)
+#
+# Parse/Yapp/Parser.yp: Parse::Yapp::Parser.pm source file
+#
+# Use: yapp -m 'Parse::Yapp::Parse' -o Parse/Yapp/Parse.pm YappParse.yp
+#
+# to generate the Parser module.
+#
+#line 12 "YappParse.yp"
+
+require 5.004;
+
+use Carp;
+
+my($input,$lexlevel,@lineno,$nberr,$prec,$labelno);
+my($syms,$head,$tail,$token,$term,$nterm,$rules,$precterm,$start,$nullable);
+my($expect);
+
+
+
+sub new {
+ my($class)=shift;
+ ref($class)
+ and $class=ref($class);
+
+ my($self)=$class->SUPER::new( yyversion => '1.05',
+ yystates =>
+[
+ {#State 0
+ ACTIONS => {
+ "%%" => -6,
+ 'HEADCODE' => 3,
+ 'UNION' => 2,
+ 'TOKEN' => 5,
+ 'ASSOC' => 7,
+ 'START' => 6,
+ 'error' => 9,
+ 'TYPE' => 10,
+ "\n" => 11,
+ 'EXPECT' => 13
+ },
+ GOTOS => {
+ 'head' => 1,
+ 'decls' => 12,
+ 'yapp' => 4,
+ 'decl' => 14,
+ 'headsec' => 8
+ }
+ },
+ {#State 1
+ ACTIONS => {
+ 'error' => 19,
+ "%%" => 16,
+ 'IDENT' => 18
+ },
+ GOTOS => {
+ 'rules' => 15,
+ 'rulesec' => 20,
+ 'body' => 17
+ }
+ },
+ {#State 2
+ ACTIONS => {
+ 'CODE' => 21
+ }
+ },
+ {#State 3
+ ACTIONS => {
+ "\n" => 22
+ }
+ },
+ {#State 4
+ ACTIONS => {
+ '' => 23
+ }
+ },
+ {#State 5
+ ACTIONS => {
+ "<" => 25
+ },
+ DEFAULT => -19,
+ GOTOS => {
+ 'typedecl' => 24
+ }
+ },
+ {#State 6
+ ACTIONS => {
+ 'IDENT' => 26
+ },
+ GOTOS => {
+ 'ident' => 27
+ }
+ },
+ {#State 7
+ ACTIONS => {
+ "<" => 25
+ },
+ DEFAULT => -19,
+ GOTOS => {
+ 'typedecl' => 28
+ }
+ },
+ {#State 8
+ ACTIONS => {
+ "%%" => 29
+ }
+ },
+ {#State 9
+ ACTIONS => {
+ "\n" => 30
+ }
+ },
+ {#State 10
+ ACTIONS => {
+ "<" => 25
+ },
+ DEFAULT => -19,
+ GOTOS => {
+ 'typedecl' => 31
+ }
+ },
+ {#State 11
+ DEFAULT => -10
+ },
+ {#State 12
+ ACTIONS => {
+ "%%" => -7,
+ 'HEADCODE' => 3,
+ 'UNION' => 2,
+ 'TOKEN' => 5,
+ 'ASSOC' => 7,
+ 'START' => 6,
+ 'error' => 9,
+ 'TYPE' => 10,
+ "\n" => 11,
+ 'EXPECT' => 13
+ },
+ GOTOS => {
+ 'decl' => 32
+ }
+ },
+ {#State 13
+ ACTIONS => {
+ 'NUMBER' => 33
+ }
+ },
+ {#State 14
+ DEFAULT => -9
+ },
+ {#State 15
+ DEFAULT => -28
+ },
+ {#State 16
+ DEFAULT => -26
+ },
+ {#State 17
+ ACTIONS => {
+ 'TAILCODE' => 34
+ },
+ DEFAULT => -45,
+ GOTOS => {
+ 'tail' => 35
+ }
+ },
+ {#State 18
+ ACTIONS => {
+ ":" => 36
+ }
+ },
+ {#State 19
+ ACTIONS => {
+ ";" => 37
+ }
+ },
+ {#State 20
+ ACTIONS => {
+ 'error' => 19,
+ "%%" => 39,
+ 'IDENT' => 18
+ },
+ GOTOS => {
+ 'rules' => 38
+ }
+ },
+ {#State 21
+ ACTIONS => {
+ "\n" => 40
+ }
+ },
+ {#State 22
+ DEFAULT => -14
+ },
+ {#State 23
+ DEFAULT => -0
+ },
+ {#State 24
+ ACTIONS => {
+ 'LITERAL' => 41,
+ 'IDENT' => 26
+ },
+ GOTOS => {
+ 'symlist' => 43,
+ 'ident' => 44,
+ 'symbol' => 42
+ }
+ },
+ {#State 25
+ ACTIONS => {
+ 'IDENT' => 45
+ }
+ },
+ {#State 26
+ DEFAULT => -4
+ },
+ {#State 27
+ ACTIONS => {
+ "\n" => 46
+ }
+ },
+ {#State 28
+ ACTIONS => {
+ 'LITERAL' => 41,
+ 'IDENT' => 26
+ },
+ GOTOS => {
+ 'symlist' => 47,
+ 'ident' => 44,
+ 'symbol' => 42
+ }
+ },
+ {#State 29
+ DEFAULT => -5
+ },
+ {#State 30
+ DEFAULT => -18
+ },
+ {#State 31
+ ACTIONS => {
+ 'IDENT' => 26
+ },
+ GOTOS => {
+ 'ident' => 48,
+ 'identlist' => 49
+ }
+ },
+ {#State 32
+ DEFAULT => -8
+ },
+ {#State 33
+ ACTIONS => {
+ "\n" => 50
+ }
+ },
+ {#State 34
+ DEFAULT => -46
+ },
+ {#State 35
+ DEFAULT => -1
+ },
+ {#State 36
+ ACTIONS => {
+ 'CODE' => 57,
+ 'LITERAL' => 41,
+ 'IDENT' => 26
+ },
+ DEFAULT => -35,
+ GOTOS => {
+ 'rhselts' => 56,
+ 'rule' => 51,
+ 'code' => 52,
+ 'rhs' => 53,
+ 'ident' => 44,
+ 'rhselt' => 58,
+ 'rhss' => 55,
+ 'symbol' => 54
+ }
+ },
+ {#State 37
+ DEFAULT => -30
+ },
+ {#State 38
+ DEFAULT => -27
+ },
+ {#State 39
+ DEFAULT => -25
+ },
+ {#State 40
+ DEFAULT => -15
+ },
+ {#State 41
+ DEFAULT => -2
+ },
+ {#State 42
+ DEFAULT => -22
+ },
+ {#State 43
+ ACTIONS => {
+ "\n" => 60,
+ 'LITERAL' => 41,
+ 'IDENT' => 26
+ },
+ GOTOS => {
+ 'ident' => 44,
+ 'symbol' => 59
+ }
+ },
+ {#State 44
+ DEFAULT => -3
+ },
+ {#State 45
+ ACTIONS => {
+ ">" => 61
+ }
+ },
+ {#State 46
+ DEFAULT => -13
+ },
+ {#State 47
+ ACTIONS => {
+ "\n" => 62,
+ 'LITERAL' => 41,
+ 'IDENT' => 26
+ },
+ GOTOS => {
+ 'ident' => 44,
+ 'symbol' => 59
+ }
+ },
+ {#State 48
+ DEFAULT => -24
+ },
+ {#State 49
+ ACTIONS => {
+ "\n" => 63,
+ 'IDENT' => 26
+ },
+ GOTOS => {
+ 'ident' => 64
+ }
+ },
+ {#State 50
+ DEFAULT => -17
+ },
+ {#State 51
+ DEFAULT => -32
+ },
+ {#State 52
+ DEFAULT => -40
+ },
+ {#State 53
+ ACTIONS => {
+ 'PREC' => 66
+ },
+ DEFAULT => -34,
+ GOTOS => {
+ 'prec' => 65
+ }
+ },
+ {#State 54
+ DEFAULT => -39
+ },
+ {#State 55
+ ACTIONS => {
+ "|" => 68,
+ ";" => 67
+ }
+ },
+ {#State 56
+ ACTIONS => {
+ 'CODE' => 57,
+ 'LITERAL' => 41,
+ 'IDENT' => 26
+ },
+ DEFAULT => -36,
+ GOTOS => {
+ 'code' => 52,
+ 'ident' => 44,
+ 'rhselt' => 69,
+ 'symbol' => 54
+ }
+ },
+ {#State 57
+ DEFAULT => -44
+ },
+ {#State 58
+ DEFAULT => -38
+ },
+ {#State 59
+ DEFAULT => -21
+ },
+ {#State 60
+ DEFAULT => -11
+ },
+ {#State 61
+ DEFAULT => -20
+ },
+ {#State 62
+ DEFAULT => -12
+ },
+ {#State 63
+ DEFAULT => -16
+ },
+ {#State 64
+ DEFAULT => -23
+ },
+ {#State 65
+ ACTIONS => {
+ 'CODE' => 57
+ },
+ DEFAULT => -42,
+ GOTOS => {
+ 'code' => 70,
+ 'epscode' => 71
+ }
+ },
+ {#State 66
+ ACTIONS => {
+ 'LITERAL' => 41,
+ 'IDENT' => 26
+ },
+ GOTOS => {
+ 'ident' => 44,
+ 'symbol' => 72
+ }
+ },
+ {#State 67
+ DEFAULT => -29
+ },
+ {#State 68
+ ACTIONS => {
+ 'CODE' => 57,
+ 'LITERAL' => 41,
+ 'IDENT' => 26
+ },
+ DEFAULT => -35,
+ GOTOS => {
+ 'rhselts' => 56,
+ 'rule' => 73,
+ 'code' => 52,
+ 'rhs' => 53,
+ 'ident' => 44,
+ 'rhselt' => 58,
+ 'symbol' => 54
+ }
+ },
+ {#State 69
+ DEFAULT => -37
+ },
+ {#State 70
+ DEFAULT => -43
+ },
+ {#State 71
+ DEFAULT => -33
+ },
+ {#State 72
+ DEFAULT => -41
+ },
+ {#State 73
+ DEFAULT => -31
+ }
+],
+ yyrules =>
+[
+ [#Rule 0
+ '$start', 2, undef
+ ],
+ [#Rule 1
+ 'yapp', 3, undef
+ ],
+ [#Rule 2
+ 'symbol', 1,
+sub
+#line 30 "YappParse.yp"
+{
+ exists($$syms{$_[1][0]})
+ or do {
+ $$syms{$_[1][0]} = $_[1][1];
+ $$term{$_[1][0]} = undef;
+ };
+ $_[1]
+ }
+ ],
+ [#Rule 3
+ 'symbol', 1, undef
+ ],
+ [#Rule 4
+ 'ident', 1,
+sub
+#line 41 "YappParse.yp"
+{
+ exists($$syms{$_[1][0]})
+ or do {
+ $$syms{$_[1][0]} = $_[1][1];
+ $$term{$_[1][0]} = undef;
+ };
+ $_[1]
+ }
+ ],
+ [#Rule 5
+ 'head', 2, undef
+ ],
+ [#Rule 6
+ 'headsec', 0, undef
+ ],
+ [#Rule 7
+ 'headsec', 1, undef
+ ],
+ [#Rule 8
+ 'decls', 2, undef
+ ],
+ [#Rule 9
+ 'decls', 1, undef
+ ],
+ [#Rule 10
+ 'decl', 1, undef
+ ],
+ [#Rule 11
+ 'decl', 4,
+sub
+#line 66 "YappParse.yp"
+{
+ for (@{$_[3]}) {
+ my($symbol,$lineno)=@$_;
+
+ exists($$token{$symbol})
+ and do {
+ _SyntaxError(0,
+ "Token $symbol redefined: ".
+ "Previously defined line $$syms{$symbol}",
+ $lineno);
+ next;
+ };
+ $$token{$symbol}=$lineno;
+ $$term{$symbol} = [ ];
+ }
+ undef
+ }
+ ],
+ [#Rule 12
+ 'decl', 4,
+sub
+#line 84 "YappParse.yp"
+{
+ for (@{$_[3]}) {
+ my($symbol,$lineno)=@$_;
+
+ defined($$term{$symbol}[0])
+ and do {
+ _SyntaxError(1,
+ "Precedence for symbol $symbol redefined: ".
+ "Previously defined line $$syms{$symbol}",
+ $lineno);
+ next;
+ };
+ $$token{$symbol}=$lineno;
+ $$term{$symbol} = [ $_[1][0], $prec ];
+ }
+ ++$prec;
+ undef
+ }
+ ],
+ [#Rule 13
+ 'decl', 3,
+sub
+#line 102 "YappParse.yp"
+{ $start=$_[2][0]; undef }
+ ],
+ [#Rule 14
+ 'decl', 2,
+sub
+#line 103 "YappParse.yp"
+{ push(@$head,$_[1]); undef }
+ ],
+ [#Rule 15
+ 'decl', 3,
+sub
+#line 104 "YappParse.yp"
+{ undef }
+ ],
+ [#Rule 16
+ 'decl', 4,
+sub
+#line 106 "YappParse.yp"
+{
+ for ( @{$_[3]} ) {
+ my($symbol,$lineno)=@$_;
+
+ exists($$nterm{$symbol})
+ and do {
+ _SyntaxError(0,
+ "Non-terminal $symbol redefined: ".
+ "Previously defined line $$syms{$symbol}",
+ $lineno);
+ next;
+ };
+ delete($$term{$symbol}); #not a terminal
+ $$nterm{$symbol}=undef; #is a non-terminal
+ }
+ }
+ ],
+ [#Rule 17
+ 'decl', 3,
+sub
+#line 122 "YappParse.yp"
+{ $expect=$_[2][0]; undef }
+ ],
+ [#Rule 18
+ 'decl', 2,
+sub
+#line 123 "YappParse.yp"
+{ $_[0]->YYErrok }
+ ],
+ [#Rule 19
+ 'typedecl', 0, undef
+ ],
+ [#Rule 20
+ 'typedecl', 3, undef
+ ],
+ [#Rule 21
+ 'symlist', 2,
+sub
+#line 130 "YappParse.yp"
+{ push(@{$_[1]},$_[2]); $_[1] }
+ ],
+ [#Rule 22
+ 'symlist', 1,
+sub
+#line 131 "YappParse.yp"
+{ [ $_[1] ] }
+ ],
+ [#Rule 23
+ 'identlist', 2,
+sub
+#line 134 "YappParse.yp"
+{ push(@{$_[1]},$_[2]); $_[1] }
+ ],
+ [#Rule 24
+ 'identlist', 1,
+sub
+#line 135 "YappParse.yp"
+{ [ $_[1] ] }
+ ],
+ [#Rule 25
+ 'body', 2,
+sub
+#line 140 "YappParse.yp"
+{
+ $start
+ or $start=$$rules[1][0];
+
+ ref($$nterm{$start})
+ or _SyntaxError(2,"Start symbol $start not found ".
+ "in rules section",$_[2][1]);
+
+ $$rules[0]=[ '$start', [ $start, chr(0) ], undef, undef ];
+ }
+ ],
+ [#Rule 26
+ 'body', 1,
+sub
+#line 150 "YappParse.yp"
+{ _SyntaxError(2,"No rules in input grammar",$_[1][1]); }
+ ],
+ [#Rule 27
+ 'rulesec', 2, undef
+ ],
+ [#Rule 28
+ 'rulesec', 1, undef
+ ],
+ [#Rule 29
+ 'rules', 4,
+sub
+#line 157 "YappParse.yp"
+{ _AddRules($_[1],$_[3]); undef }
+ ],
+ [#Rule 30
+ 'rules', 2,
+sub
+#line 158 "YappParse.yp"
+{ $_[0]->YYErrok }
+ ],
+ [#Rule 31
+ 'rhss', 3,
+sub
+#line 161 "YappParse.yp"
+{ push(@{$_[1]},$_[3]); $_[1] }
+ ],
+ [#Rule 32
+ 'rhss', 1,
+sub
+#line 162 "YappParse.yp"
+{ [ $_[1] ] }
+ ],
+ [#Rule 33
+ 'rule', 3,
+sub
+#line 165 "YappParse.yp"
+{ push(@{$_[1]}, $_[2], $_[3]); $_[1] }
+ ],
+ [#Rule 34
+ 'rule', 1,
+sub
+#line 166 "YappParse.yp"
+{
+ my($code)=undef;
+
+ defined($_[1])
+ and $_[1][-1][0] eq 'CODE'
+ and $code = ${pop(@{$_[1]})}[1];
+
+ push(@{$_[1]}, undef, $code);
+
+ $_[1]
+ }
+ ],
+ [#Rule 35
+ 'rhs', 0, undef
+ ],
+ [#Rule 36
+ 'rhs', 1, undef
+ ],
+ [#Rule 37
+ 'rhselts', 2,
+sub
+#line 183 "YappParse.yp"
+{ push(@{$_[1]},$_[2]); $_[1] }
+ ],
+ [#Rule 38
+ 'rhselts', 1,
+sub
+#line 184 "YappParse.yp"
+{ [ $_[1] ] }
+ ],
+ [#Rule 39
+ 'rhselt', 1,
+sub
+#line 187 "YappParse.yp"
+{ [ 'SYMB', $_[1] ] }
+ ],
+ [#Rule 40
+ 'rhselt', 1,
+sub
+#line 188 "YappParse.yp"
+{ [ 'CODE', $_[1] ] }
+ ],
+ [#Rule 41
+ 'prec', 2,
+sub
+#line 192 "YappParse.yp"
+{
+ defined($$term{$_[2][0]})
+ or do {
+ _SyntaxError(1,"No precedence for symbol $_[2][0]",
+ $_[2][1]);
+ return undef;
+ };
+
+ ++$$precterm{$_[2][0]};
+ $$term{$_[2][0]}[1];
+ }
+ ],
+ [#Rule 42
+ 'epscode', 0,
+sub
+#line 205 "YappParse.yp"
+{ undef }
+ ],
+ [#Rule 43
+ 'epscode', 1,
+sub
+#line 206 "YappParse.yp"
+{ $_[1] }
+ ],
+ [#Rule 44
+ 'code', 1,
+sub
+#line 209 "YappParse.yp"
+{ $_[1] }
+ ],
+ [#Rule 45
+ 'tail', 0, undef
+ ],
+ [#Rule 46
+ 'tail', 1,
+sub
+#line 215 "YappParse.yp"
+{ $tail=$_[1] }
+ ]
+],
+ @_);
+ bless($self,$class);
+}
+
+#line 218 "YappParse.yp"
+
+sub _Error {
+ my($value)=$_[0]->YYCurval;
+
+ my($what)= $token ? "input: '$$value[0]'" : "end of input";
+
+ _SyntaxError(1,"Unexpected $what",$$value[1]);
+}
+
+sub _Lexer {
+
+ #At EOF
+ pos($$input) >= length($$input)
+ and return('',[ undef, -1 ]);
+
+ #In TAIL section
+ $lexlevel > 1
+ and do {
+ my($pos)=pos($$input);
+
+ $lineno[0]=$lineno[1];
+ $lineno[1]=-1;
+ pos($$input)=length($$input);
+ return('TAILCODE',[ substr($$input,$pos), $lineno[0] ]);
+ };
+
+ #Skip blanks
+ $lexlevel == 0
+ ? $$input=~m{\G((?:
+ [\t\ ]+ # Any white space char but \n
+ | \#[^\n]* # Perl like comments
+ | /\*.*?\*/ # C like comments
+ )+)}xsgc
+ : $$input=~m{\G((?:
+ \s+ # any white space char
+ | \#[^\n]* # Perl like comments
+ | /\*.*?\*/ # C like comments
+ )+)}xsgc
+ and do {
+ my($blanks)=$1;
+
+ #Maybe At EOF
+ pos($$input) >= length($$input)
+ and return('',[ undef, -1 ]);
+
+ $lineno[1]+= $blanks=~tr/\n//;
+ };
+
+ $lineno[0]=$lineno[1];
+
+ $$input=~/\G([A-Za-z_][A-Za-z0-9_]*)/gc
+ and return('IDENT',[ $1, $lineno[0] ]);
+
+ $$input=~/\G('(?:[^'\\]|\\\\|\\'|\\)+?')/gc
+ and do {
+ $1 eq "'error'"
+ and do {
+ _SyntaxError(0,"Literal 'error' ".
+ "will be treated as error token",$lineno[0]);
+ return('IDENT',[ 'error', $lineno[0] ]);
+ };
+ return('LITERAL',[ $1, $lineno[0] ]);
+ };
+
+ $$input=~/\G(%%)/gc
+ and do {
+ ++$lexlevel;
+ return($1, [ $1, $lineno[0] ]);
+ };
+
+ $$input=~/\G{/gc
+ and do {
+ my($level,$from,$code);
+
+ $from=pos($$input);
+
+ $level=1;
+ while($$input=~/([{}])/gc) {
+ substr($$input,pos($$input)-1,1) eq '\\' #Quoted
+ and next;
+ $level += ($1 eq '{' ? 1 : -1)
+ or last;
+ }
+ $level
+ and _SyntaxError(2,"Unmatched { opened line $lineno[0]",-1);
+ $code = substr($$input,$from,pos($$input)-$from-1);
+ $lineno[1]+= $code=~tr/\n//;
+ return('CODE',[ $code, $lineno[0] ]);
+ };
+
+ if($lexlevel == 0) {# In head section
+ $$input=~/\G%(left|right|nonassoc)/gc
+ and return('ASSOC',[ uc($1), $lineno[0] ]);
+ $$input=~/\G%(start)/gc
+ and return('START',[ undef, $lineno[0] ]);
+ $$input=~/\G%(expect)/gc
+ and return('EXPECT',[ undef, $lineno[0] ]);
+ $$input=~/\G%{/gc
+ and do {
+ my($code);
+
+ $$input=~/\G(.*?)%}/sgc
+ or _SyntaxError(2,"Unmatched %{ opened line $lineno[0]",-1);
+
+ $code=$1;
+ $lineno[1]+= $code=~tr/\n//;
+ return('HEADCODE',[ $code, $lineno[0] ]);
+ };
+ $$input=~/\G%(token)/gc
+ and return('TOKEN',[ undef, $lineno[0] ]);
+ $$input=~/\G%(type)/gc
+ and return('TYPE',[ undef, $lineno[0] ]);
+ $$input=~/\G%(union)/gc
+ and return('UNION',[ undef, $lineno[0] ]);
+ $$input=~/\G([0-9]+)/gc
+ and return('NUMBER',[ $1, $lineno[0] ]);
+
+ }
+ else {# In rule section
+ $$input=~/\G%(prec)/gc
+ and return('PREC',[ undef, $lineno[0] ]);
+ }
+
+ #Always return something
+ $$input=~/\G(.)/sg
+ or die "Parse::Yapp::Grammar::Parse: Match (.) failed: report as a BUG";
+
+ $1 eq "\n"
+ and ++$lineno[1];
+
+ ( $1 ,[ $1, $lineno[0] ]);
+
+}
+
+sub _SyntaxError {
+ my($level,$message,$lineno)=@_;
+
+ $message= "*".
+ [ 'Warning', 'Error', 'Fatal' ]->[$level].
+ "* $message, at ".
+ ($lineno < 0 ? "eof" : "line $lineno").
+ ".\n";
+
+ $level > 1
+ and die $message;
+
+ warn $message;
+
+ $level > 0
+ and ++$nberr;
+
+ $nberr == 20
+ and die "*Fatal* Too many errors detected.\n"
+}
+
+sub _AddRules {
+ my($lhs,$lineno)=@{$_[0]};
+ my($rhss)=$_[1];
+
+ ref($$nterm{$lhs})
+ and do {
+ _SyntaxError(1,"Non-terminal $lhs redefined: ".
+ "Previously declared line $$syms{$lhs}",$lineno);
+ return;
+ };
+
+ ref($$term{$lhs})
+ and do {
+ my($where) = exists($$token{$lhs}) ? $$token{$lhs} : $$syms{$lhs};
+ _SyntaxError(1,"Non-terminal $lhs previously ".
+ "declared as token line $where",$lineno);
+ return;
+ };
+
+ ref($$nterm{$lhs}) #declared through %type
+ or do {
+ $$syms{$lhs}=$lineno; #Say it's declared here
+ delete($$term{$lhs}); #No more a terminal
+ };
+ $$nterm{$lhs}=[]; #It's a non-terminal now
+
+ my($epsrules)=0; #To issue a warning if more than one epsilon rule
+
+ for my $rhs (@$rhss) {
+ my($tmprule)=[ $lhs, [ ], splice(@$rhs,-2) ]; #Init rule
+
+ @$rhs
+ or do {
+ ++$$nullable{$lhs};
+ ++$epsrules;
+ };
+
+ for (0..$#$rhs) {
+ my($what,$value)=@{$$rhs[$_]};
+
+ $what eq 'CODE'
+ and do {
+ my($name)='@'.++$labelno."-$_";
+ push(@$rules,[ $name, [], undef, $value ]);
+ push(@{$$tmprule[1]},$name);
+ next;
+ };
+ push(@{$$tmprule[1]},$$value[0]);
+ }
+ push(@$rules,$tmprule);
+ push(@{$$nterm{$lhs}},$#$rules);
+ }
+
+ $epsrules > 1
+ and _SyntaxError(0,"More than one empty rule for symbol $lhs",$lineno);
+}
+
+sub Parse {
+ my($self)=shift;
+
+ @_ > 0
+ or croak("No input grammar\n");
+
+ my($parsed)={};
+
+ $input=\$_[0];
+
+ $lexlevel=0;
+ @lineno=(1,1);
+ $nberr=0;
+ $prec=0;
+ $labelno=0;
+
+ $head=();
+ $tail="";
+
+ $syms={};
+ $token={};
+ $term={};
+ $nterm={};
+ $rules=[ undef ]; #reserve slot 0 for start rule
+ $precterm={};
+
+ $start="";
+ $nullable={};
+ $expect=0;
+
+ pos($$input)=0;
+
+
+ $self->YYParse(yylex => \&_Lexer, yyerror => \&_Error);
+
+ $nberr
+ and _SyntaxError(2,"Errors detected: No output",-1);
+
+ @$parsed{ 'HEAD', 'TAIL', 'RULES', 'NTERM', 'TERM',
+ 'NULL', 'PREC', 'SYMS', 'START', 'EXPECT' }
+ = ( $head, $tail, $rules, $nterm, $term,
+ $nullable, $precterm, $syms, $start, $expect);
+
+ undef($input);
+ undef($lexlevel);
+ undef(@lineno);
+ undef($nberr);
+ undef($prec);
+ undef($labelno);
+
+ undef($head);
+ undef($tail);
+
+ undef($syms);
+ undef($token);
+ undef($term);
+ undef($nterm);
+ undef($rules);
+ undef($precterm);
+
+ undef($start);
+ undef($nullable);
+ undef($expect);
+
+ $parsed
+}
+
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Checker.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,2006 @@
+#
+#
+# TO DO
+# - update docs regarding PerlSAX interface
+# - add current node to error context when checking DOM subtrees
+# - add parsed Entity to test XML files
+# - free circular references
+# - Implied handler?
+# - Notation, Entity, Unparsed checks, Default handler?
+# - check no root element (it's checked by expat) ?
+
+package XML::Checker::Term;
+use strict;
+
+sub new
+{
+ my ($class, %h) = @_;
+ bless \%h, $class;
+}
+
+sub str
+{
+ '<' . $_[0]->{C} . $_[0]->{N} . '>'
+}
+
+sub re
+{
+ $_[0]->{S}
+}
+
+sub rel
+{
+ my $self = shift;
+ defined $self->{SL} ? @{ $self->{SL} } : ( $self->{S} );
+}
+
+sub debug
+{
+ my $t = shift;
+ my ($c, $n, $s) = ($t->{C}, $t->{N}, $t->{S});
+ my @sl = $t->rel;
+ "{C=$c N=$n S=$s SL=@sl}";
+}
+
+#-------------------------------------------------------------------------
+
+package XML::Checker::Context;
+
+sub new
+{
+ my ($class) = @_;
+ my $scalar;
+ bless \$scalar, $class;
+}
+
+sub Start {}
+sub End {}
+sub Char {}
+
+#
+# The initial Context when checking an entire XML Document
+#
+package XML::Checker::DocContext;
+use vars qw( @ISA );
+@ISA = qw( XML::Checker::Context );
+
+sub new
+{
+#??checker not used
+ my ($class, $checker) = @_;
+ bless { }, $class;
+}
+
+sub setRootElement
+{
+ $_[0]->{RootElement} = $_[1];
+}
+
+sub Start
+{
+ my ($self, $checker, $tag) = @_;
+ if (exists $self->{Elem})
+ {
+ my $tags = join (", ", @{$self->{Elem}});
+ $checker->fail (155, "more than one root Element [$tags]");
+ push @{$self->{Elem}}, $tag;
+ }
+ else
+ {
+ $self->{Elem} = [ $tag ];
+ }
+
+ my $exp_root = $self->{RootElement};
+ $checker->fail (156, "unexpected root Element [$tag], expected [$exp_root]")
+ if defined ($exp_root) and $tag ne $exp_root;
+}
+
+sub debug
+{
+ my $self = shift;
+ "DocContext[Count=" . $self->{Count} . ",Root=" .
+ $self->{RootElement} . "]";
+}
+
+package XML::Checker::Context::ANY;
+use vars qw( @ISA );
+@ISA = qw( XML::Checker::Context );
+
+# No overrides, because everything is accepted
+
+sub debug { "XML::Checker::Context::ANY" }
+
+package XML::Checker::Context::EMPTY;
+use vars qw( @ISA $ALLOW_WHITE_SPACE );
+@ISA = qw( XML::Checker::Context );
+
+$ALLOW_WHITE_SPACE = 0;
+
+sub debug { "XML::Checker::Context::EMPTY" }
+
+sub Start
+{
+ my ($self, $checker, $tag) = @_;
+ $checker->fail (152, "Element should be EMPTY, found Element [$tag]");
+}
+
+sub Char
+{
+ my ($self, $checker, $str) = @_;
+ $checker->fail (153, "Element should be EMPTY, found text [$str]")
+ unless ($ALLOW_WHITE_SPACE and $checker->isWS ($str));
+
+ # NOTE: if $ALLOW_WHITE_SPACE = 1, the isWS call does not only check
+ # whether it is whitespace, but it also informs the checker that this
+ # might be insignificant whitespace
+}
+
+#?? what about Comments
+
+package XML::Checker::Context::Children;
+use vars qw( @ISA );
+@ISA = qw( XML::Checker::Context );
+
+sub new
+{
+ my ($class, $rule) = @_;
+ bless { Name => $rule->{Name}, RE => $rule->{RE}, Buf => "", N => 0 }, $class;
+}
+
+sub phash
+{
+ my $href = shift;
+ my $str = "";
+ for (keys %$href)
+ {
+ $str .= ' ' if $str;
+ $str .= $_ . '=' . $href->{$_};
+ }
+ $str;
+}
+
+sub debug
+{
+ my $self = shift;
+ "Context::Children[Name=(" . phash ($self->{Name}) . ",N=" . $self->{N} .
+ ",RE=" . $self->{RE} . ",Buf=[" . $self->{Buf} . "]";
+}
+
+sub Start
+{
+ my ($self, $checker, $tag) = @_;
+
+#print "Children.Start tag=$tag rule=$checker drule=" . $checker->debug . "\n";
+
+ if (exists $self->{Name}->{$tag})
+ {
+#print "Buf=[".$self->{Buf}. "] tag=[" . $self->{Name}->{$tag}->{S} . "]\n";
+ $self->{Buf} .= $self->{Name}->{$tag}->{S};
+ }
+ else
+ {
+ $checker->fail (157, "unexpected Element [$tag]",
+ ChildElementIndex => $self->{N})
+ }
+ $self->{N}++;
+}
+
+sub decode
+{
+ my ($self) = @_;
+ my $re = $self->{RE};
+ my $name = $self->{Name};
+ my $buf = $self->{Buf};
+
+ my %s = ();
+ while (my ($key, $val) = each %$name)
+ {
+ $s{$val->{S}} = $key;
+ }
+
+ my ($len) = scalar (keys %$name);
+ $len = length $len;
+ my $dots = "[^()*+?]" x $len;
+
+ $buf =~ s/($dots)/$s{$1} . ","/ge;
+ chop $buf;
+
+ $re =~ s/($dots)/"(" . $s{$1} . ")"/ge;
+
+ "Found=[$buf] RE=[$re]"
+}
+
+sub End
+{
+ my ($self, $checker) = @_;
+ my $re = $self->{RE};
+
+#print "End " . $self->debug . "\n";
+ $checker->fail (154, "bad order of Elements " . $self->decode)
+ unless $self->{Buf} =~ /^$re$/;
+}
+
+sub Char
+{
+ my ($self, $checker, $str) = @_;
+
+ # Inform the checker that this might be insignificant whitespace
+ $checker->isWS ($str);
+}
+
+package XML::Checker::Context::Mixed;
+use vars qw( @ISA );
+@ISA = qw( XML::Checker::Context );
+
+sub new
+{
+ my ($class, $rule) = @_;
+ bless { Name => $rule->{Name}, N => 0 }, $class;
+}
+
+sub debug
+{
+ my $self = shift;
+ "Context::Mixed[Name=" . $self->{Name} . ",N=" , $self->{N} . "]";
+}
+
+sub Start
+{
+ my ($self, $checker, $tag) = @_;
+
+ $checker->fail (157, "unexpected Element [$tag]",
+ ChildElementIndex => $self->{N})
+ unless exists $self->{Name}->{$tag};
+ $self->{N}++;
+}
+
+package XML::Checker::ERule;
+
+package XML::Checker::ERule::EMPTY;
+use vars qw( @ISA );
+@ISA = qw( XML::Checker::ERule );
+
+sub new
+{
+ my ($class) = @_;
+ bless {}, $class;
+}
+
+my $context = new XML::Checker::Context::EMPTY;
+sub context { $context } # share the context
+
+sub debug { "EMPTY" }
+
+package XML::Checker::ERule::ANY;
+use vars qw( @ISA );
+@ISA = qw( XML::Checker::ERule );
+
+sub new
+{
+ my ($class) = @_;
+ bless {}, $class;
+}
+
+my $any_context = new XML::Checker::Context::ANY;
+sub context { $any_context } # share the context
+
+sub debug { "ANY" }
+
+package XML::Checker::ERule::Mixed;
+use vars qw( @ISA );
+@ISA = qw( XML::Checker::ERule );
+
+sub new
+{
+ my ($class) = @_;
+ bless { Name => {} }, $class;
+}
+
+sub context
+{
+ my ($self) = @_;
+ new XML::Checker::Context::Mixed ($self);
+}
+
+sub setModel
+{
+ my ($self, $model) = @_;
+ my $rule = $model;
+
+ # Mixed := '(' '#PCDATA' ')' '*'?
+ if ($rule =~ /^\(\s*#PCDATA\s*\)(\*)?$/)
+ {
+#? how do we interpret the '*' ??
+ return 1;
+ }
+ else # Mixed := '(' '#PCDATA' ('|' Name)* ')*'
+ {
+ return 0 unless $rule =~ s/^\(\s*#PCDATA\s*//;
+ return 0 unless $rule =~ s/\s*\)\*$//;
+
+ my %names = ();
+ while ($rule =~ s/^\s*\|\s*($XML::RegExp::Name)//)
+ {
+ $names{$1} = 1;
+ }
+ if ($rule eq "")
+ {
+ $self->{Name} = \%names;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+sub debug
+{
+ my ($self) = @_;
+ "Mixed[Names=" . join("|", keys %{$self->{Name}}) . "]";
+}
+
+package XML::Checker::ERule::Children;
+use vars qw( @ISA %_name %_map $_n );
+@ISA = qw( XML::Checker::ERule );
+
+sub new
+{
+ my ($class) = @_;
+ bless {}, $class;
+}
+
+sub context
+{
+ my ($self) = @_;
+ new XML::Checker::Context::Children ($self);
+}
+
+sub _add # static
+{
+ my $exp = new XML::Checker::Term (@_);
+ $_map{$exp->{N}} = $exp;
+ $exp->str;
+}
+
+my $IDS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+sub _tokenize
+{
+ my ($self, $rule) = @_;
+
+ # Replace names with Terms of the form "<n#>", e.g. "<n2>".
+ # Lookup already used names and store new names in %_name.
+ #
+ $$rule =~ s/($XML::RegExp::Name)(?!>)/
+ if (exists $_name{$1}) # name already used?
+ {
+ $_name{$1}->str;
+ }
+ else
+ {
+ my $exp = new XML::Checker::Term (C => 'n', N => $_n++,
+ Name => $1);
+ $_name{$1} = $_map{$exp->{N}} = $exp;
+ $exp->str;
+ }
+ /eg;
+
+ if ($_n < length $IDS)
+ {
+ # Generate regular expression for the name Term, i.e.
+ # a single character from $IDS
+ my $i = 0;
+ for (values %_name)
+ {
+ $_->{S} = substr ($IDS, $i++, 1);
+#print "tokenized " . $_->{Name} . " num=" . $_->{N} . " to " . $_->{S} . "\n";
+ }
+ }
+ else
+ {
+ # Generate RE, convert Term->{N} to hex string a la "(#)",
+ # e.g. "(03d)". Calculate needed length of hex string first.
+ my $len = 1;
+ for (my $n = $_n - 1; ($n >> 4) > 0; $len++) {}
+
+ my $i = 0;
+ for (values %_name)
+ {
+ $_->{S} = sprintf ("(0${len}lx)", $i++);
+#print "tokenized " . $_->{Name} . " num=" . $_->{N} . " to " . $_->{S} . "\n";
+ }
+ }
+}
+
+sub setModel
+{
+ my ($self, $rule) = @_;
+
+ local $_n = 0;
+ local %_map = ();
+ local %_name = ();
+
+ $self->_tokenize (\$rule);
+
+#?? check for single name - die "!ELEMENT contents can't be just a NAME" if $rule =~ /^$XML::RegExp::Name$/;
+
+ for ($rule)
+ {
+ my $n = 1;
+ while ($n)
+ {
+ $n = 0;
+
+ # cp := ( name | choice | seq ) ('?' | '*' | '+')?
+ $n++ while s/<[ncs](\d+)>([?*+]?)/_add
+ (C => 'a', N => $_n++,
+ S => ($_map{$1}->re . $2))/eg;
+
+ # choice := '(' ch_l ')'
+ $n++ while s/\(\s*<[ad](\d+)>\s*\)/_add
+ (C => 'c', N => $_n++,
+ S => "(" . join ("|", $_map{$1}->rel) . ")")/eg;
+
+ # ch_l := ( cp | ch_l ) '|' ( cp | ch_l )
+ $n++ while s/<[ad](\d+)>\s*\|\s*<[ad](\d+)>/_add
+ (C => 'd', N => $_n++,
+ SL => [ $_map{$1}->rel, $_map{$2}->rel ])/eg;
+
+ # seq := '(' (seq_l ')'
+ $n++ while s/\(\s*<[at](\d+)>\s*\)/_add
+ (C => 's', N => $_n++,
+ S => "(".join("", $_map{$1}->rel).")")/eg;
+
+ # seq_l := ( cp | seq_l ) ',' ( cp | seq_l )
+ $n++ while s/<[at](\d+)>\s*,\s*<[at](\d+)>/_add
+ (C => 't', N => $_n++,
+ SL => [ $_map{$1}->rel, $_map{$2}->rel ])/eg;
+ }
+ }
+
+ return 0 if ($rule !~ /^<a(\d+)>$/);
+
+ $self->{Name} = \%_name;
+ $self->{RE} = $_map{$1}->re;
+
+ return 1;
+}
+
+sub debug
+{
+ my ($self) = @_;
+ "Children[RE=" . $self->{RE} . "]";
+}
+
+
+package XML::Checker::ARule;
+use XML::RegExp;
+
+sub new
+{
+ my ($class, $elem, $checker) = @_;
+ bless { Elem => $elem, Checker => $checker, Required => {} }, $class;
+}
+
+sub Attlist
+{
+ my ($self, $attr, $type, $default, $fixed, $checker) = @_;
+ my ($c1, $c2);
+
+ if ($self->{Defined}->{$attr})
+ {
+ my $tag = $self->{Elem};
+ $self->fail ($attr, 110, "attribute [$attr] of element [$tag] already defined");
+ }
+ else
+ {
+ $self->{Defined}->{$attr} = 1;
+ }
+
+ if ($default =~ /^\#(REQUIRED|IMPLIED)$/)
+ {
+ $c1 = $1;
+
+ # Keep list of all required attributes
+ if ($default eq '#REQUIRED')
+ {
+ $self->{Required}->{$attr} = 1;
+ }
+ }
+ else
+ {
+ $self->fail ($attr, 122, "invalid default attribute value [$default]")
+ unless $default =~ /^$XML::RegExp::AttValue$/;
+
+ $default = substr ($default, 1, length($default)-2);
+ $self->{Default}->{$attr} = $default;
+ $c1 = 'FIXED' if $fixed;
+ }
+
+ if ($type eq 'ID')
+ {
+ $self->fail ($attr, 123, "invalid default ID [$default], must be #REQUIRED or #IMPLIED")
+ unless $default =~ /^#(REQUIRED|IMPLIED)$/;
+
+ if (exists ($self->{ID}) && $self->{ID} ne $attr)
+ {
+ $self->fail ($attr, 151, "only one ID allowed per ELEMENT " .
+ "first=[" . $self->{ID} . "]");
+ }
+ else
+ {
+ $self->{ID} = $attr;
+ }
+ $c2 = 'ID';
+ }
+ elsif ($type =~ /^(IDREF|IDREFS|ENTITY|ENTITIES|NMTOKEN|NMTOKENS)$/)
+ {
+ my $def = $self->{Default}->{$attr};
+ if (defined $def)
+ {
+ my $re = ($type =~ /^[IE]/) ? $XML::RegExp::Name : $XML::RegExp::NmToken;
+ if ($type =~ /S$/)
+ {
+ for (split (/\s+/, $def))
+ {
+ $self->fail ($attr, 121,
+ "invalid default [$_] in $type [$def]")
+ unless $_ =~ /^$re$/;
+ }
+ }
+ else # singular
+ {
+ $self->fail ($attr, 120, "invalid default $type [$def]")
+ unless $def =~ /^$re$/;
+ }
+ }
+ $c2 = $type;
+ }
+ elsif ($type ne 'CDATA') # Enumerated := NotationType | Enumeration
+ {
+ if ($type =~ /^\s*NOTATION\s*\(\s*($XML::RegExp::Name(\s*\|\s*$XML::RegExp::Name)*)\s*\)\s*$/)
+ {
+ $self->fail ($attr, 135, "empty NOTATION list in ATTLIST")
+ unless defined $1;
+
+ my @tok = split (/\s*\|\s*/, $1);
+ for (@tok)
+ {
+ $self->fail ($attr, 100, "undefined NOTATION [$_] in ATTLIST")
+ unless exists $checker->{NOTATION}->{$_};
+ }
+
+ my $re = join ("|", @tok);
+ $self->{NotationRE} = "^($re)\$";
+ $c2 = 'NotationType';
+ }
+ elsif ($type =~ /^\s*\(\s*($XML::RegExp::NmToken(\s*\|\s*$XML::RegExp::NmToken)*)\s*\)\s*$/)
+ {
+ # Enumeration
+
+ $self->fail ($attr, 136, "empty Enumeration list in ATTLIST")
+ unless defined $1;
+
+ my @tok = split (/\s*\|\s*/, $1);
+ for (@tok)
+ {
+ $self->fail ($attr, 134,
+ "invalid Enumeration value [$_] in ATTLIST")
+ unless $_ =~ /^$XML::RegExp::NmToken$/;
+ }
+ $self->{EnumRE}->{$attr} = '^(' . join ("|", @tok) . ')$'; #';
+ $c2 = 'Enumeration';
+ }
+ else
+ {
+ $self->fail ($attr, 137, "invalid ATTLIST type [$type]");
+ }
+ }
+
+ $self->{Check1}->{$attr} = $c1 if $c1;
+ $self->{Check2}->{$attr} = $c2 if $c2;
+}
+
+sub fail
+{
+ my $self = shift;
+ my $attr = shift;
+ $self->{Checker}->fail (@_, Element => $self->{Elem}, Attr => $attr);
+}
+
+sub check
+{
+ my ($self, $attr) = @_;
+ my $func1 = $self->{Check1}->{$attr};
+ my $func2 = $self->{Check2}->{$attr};
+# print "check func1=$func1 func2=$func2 @_\n";
+
+ if (exists $self->{ReqNotSeen}->{$attr})
+ {
+ delete $self->{ReqNotSeen}->{$attr};
+ }
+ no strict;
+
+ &$func1 (@_) if defined $func1;
+ &$func2 (@_) if defined $func2;
+}
+
+# Copies the list of all required attributes from $self->{Required} to
+# $self->{ReqNotSeen}.
+# When check() encounters a required attribute, it is removed from ReqNotSeen.
+# In EndAttr we look at which attribute names are still in ReqNotSeen - those
+# are the ones that were not specified and are, therefore, in error.
+sub StartAttr
+{
+ my $self = shift;
+ my %not_seen = %{ $self->{Required} };
+ $self->{ReqNotSeen} = \%not_seen;
+}
+
+# Checks which of the #REQUIRED attributes were not specified
+sub EndAttr
+{
+ my $self = shift;
+
+ for my $attr (keys %{ $self->{ReqNotSeen} })
+ {
+ $self->fail ($attr, 159,
+ "unspecified value for \#REQUIRED attribute [$attr]");
+ }
+}
+
+sub FIXED
+{
+ my ($self, $attr, $val, $specified) = @_;
+
+ my $default = $self->{Default}->{$attr};
+ $self->fail ($attr, 150,
+ "bad \#FIXED attribute value [$val], it should be [$default]")
+ unless ($val eq $default);
+}
+
+sub IMPLIED
+{
+ my ($self, $attr, $val, $specified) = @_;
+
+#?? should #IMPLIED be specified?
+ $self->fail ($attr, 158,
+ "unspecified value for \#IMPLIED attribute [$attr]")
+ unless $specified;
+
+#?? Implied handler ?
+}
+
+# This is called when an attribute is passed to the check() method by
+# XML::Checker::Attr(), i.e. when the attribute was specified explicitly
+# or defaulted by the parser (which should never happen), *NOT* when the
+# attribute was omitted. (The latter is checked by StartAttr/EndAttr)
+sub REQUIRED
+{
+ my ($self, $attr, $val, $specified) = @_;
+# print "REQUIRED attr=$attr val=$val spec=$specified\n";
+
+ $self->fail ($attr, 159,
+ "unspecified value for \#REQUIRED attribute [$attr]")
+ unless $specified;
+}
+
+sub ID # must be #IMPLIED or #REQUIRED
+{
+ my ($self, $attr, $val, $specified) = @_;
+
+ $self->fail ($attr, 131, "invalid ID [$val]")
+ unless $val =~ /^$XML::RegExp::Name$/;
+
+ $self->fail ($attr, 111, "ID [$val] already defined")
+ if $self->{Checker}->{ID}->{$val}++;
+}
+
+sub IDREF
+{
+ my ($self, $attr, $val, $specified) = @_;
+
+ $self->fail ($attr, 132, "invalid IDREF [$val]")
+ unless $val =~ /^$XML::RegExp::Name$/;
+
+ $self->{Checker}->{IDREF}->{$val}++;
+}
+
+sub IDREFS
+{
+ my ($self, $attr, $val, $specified) = @_;
+ for (split /\s+/, $val)
+ {
+ $self->IDREF ($attr, $_);
+ }
+}
+
+sub ENTITY
+{
+ my ($self, $attr, $val, $specified) = @_;
+#?? should it be specified?
+
+ $self->fail ($attr, 133, "invalid ENTITY name [$val]")
+ unless $val =~ /^$XML::RegExp::Name$/;
+
+ $self->fail ($attr, 102, "undefined unparsed ENTITY [$val]")
+ unless exists $self->{Checker}->{Unparsed}->{$val};
+}
+
+sub ENTITIES
+{
+ my ($self, $attr, $val, $specified) = @_;
+ for (split /\s+/, $val)
+ {
+ $self->ENTITY ($attr, $_);
+ }
+}
+
+sub NMTOKEN
+{
+ my ($self, $attr, $val, $specified) = @_;
+ $self->fail ($attr, 130, "invalid NMTOKEN [$val]")
+ unless $val =~ /^$XML::RegExp::NmToken$/;
+}
+
+sub NMTOKENS
+{
+ my ($self, $attr, $val, $specified) = @_;
+ for (split /\s+/, $val)
+ {
+ $self->NMTOKEN ($attr, $_, $specified);
+ }
+}
+
+sub Enumeration
+{
+ my ($self, $attr, $val, $specified) = @_;
+ my $re = $self->{EnumRE}->{$attr};
+
+ $self->fail ($attr, 160, "invalid Enumeration value [$val]")
+ unless $val =~ /$re/;
+}
+
+sub NotationType
+{
+ my ($self, $attr, $val, $specified) = @_;
+ my $re = $self->{NotationRE};
+
+ $self->fail ($attr, 161, "invalid NOTATION value [$val]")
+ unless $val =~ /$re/;
+
+ $self->fail ($attr, 162, "undefined NOTATION [$val]")
+ unless exists $self->{Checker}->{NOTATION}->{$val};
+}
+
+package XML::Checker;
+use vars qw ( $VERSION $FAIL $INSIGNIF_WS );
+
+BEGIN
+{
+ $VERSION = '0.09';
+}
+
+$FAIL = \&print_error;
+
+# Whether the last seen Char data was insignicant whitespace
+$INSIGNIF_WS = 0;
+
+sub new
+{
+ my ($class, %args) = @_;
+
+ $args{ERule} = {};
+ $args{ARule} = {};
+ $args{InCDATA} = 0;
+
+# $args{Debug} = 1;
+ bless \%args, $class;
+}
+
+# PerlSAX API
+sub element_decl
+{
+ my ($self, $hash) = @_;
+ $self->Element ($hash->{Name}, $hash->{Model});
+}
+
+# Same parameter order as the Element handler in XML::Parser module
+sub Element
+{
+ my ($self, $name, $model) = @_;
+
+ if (defined $self->{ERule}->{$name})
+ {
+ $self->fail (115, "ELEMENT [$name] already defined",
+ Element => $name);
+ }
+
+ if ($model eq "EMPTY")
+ {
+ $self->{ERule}->{$name} = new XML::Checker::ERule::EMPTY;
+ }
+ elsif ($model eq "ANY")
+ {
+ $self->{ERule}->{$name} = new XML::Checker::ERule::ANY;
+ }
+ elsif ($model =~ /#PCDATA/)
+ {
+ my $rule = new XML::Checker::ERule::Mixed;
+ if ($rule->setModel ($model))
+ {
+ $self->{ERule}->{$name} = $rule;
+ }
+ else
+ {
+ $self->fail (124, "bad model [$model] for ELEMENT [$name]",
+ Element => $name);
+ }
+ }
+ else
+ {
+ my $rule = new XML::Checker::ERule::Children;
+ if ($rule->setModel ($model))
+ {
+ $self->{ERule}->{$name} = $rule;
+ }
+ else
+ {
+ $self->fail (124, "bad model [$model] for ELEMENT [$name]",
+ Element => $name);
+ }
+ }
+ my $rule = $self->{ERule}->{$name};
+ print "added ELEMENT model for $name: " . $rule->debug . "\n"
+ if $rule and $self->{Debug};
+}
+
+# PerlSAX API
+sub attlist_decl
+{
+ my ($self, $hash) = @_;
+ $self->Attlist ($hash->{ElementName}, $hash->{AttributeName},
+ $hash->{Type}, $hash->{Default}, $hash->{Fixed});
+}
+
+sub Attlist
+{
+ my ($self, $tag, $attrName, $type, $default, $fixed) = @_;
+ my $arule = $self->{ARule}->{$tag} ||=
+ new XML::Checker::ARule ($tag, $self);
+
+ $arule->Attlist ($attrName, $type, $default, $fixed, $self);
+}
+
+# Initializes the context stack to check an XML::DOM::Element
+sub InitDomElem
+{
+ my $self = shift;
+
+ # initialize Context stack
+ $self->{Context} = [ new XML::Checker::Context::ANY ($self) ];
+ $self->{InCDATA} = 0;
+}
+
+# Clears the context stack after checking an XML::DOM::Element
+sub FinalDomElem
+{
+ my $self = shift;
+ delete $self->{Context};
+}
+
+# PerlSAX API
+sub start_document
+{
+ shift->Init;
+}
+
+sub Init
+{
+ my $self = shift;
+
+ # initialize Context stack
+ $self->{Context} = [ new XML::Checker::DocContext ($self) ];
+ $self->{InCDATA} = 0;
+}
+
+# PerlSAX API
+sub end_document
+{
+ shift->Final;
+}
+
+sub Final
+{
+ my $self = shift;
+#?? could add more statistics: unreferenced Unparsed, ID
+
+ for (keys %{ $self->{IDREF} })
+ {
+ my $n = $self->{IDREF}->{$_};
+ $self->fail (200, "undefined ID [$_] was referenced [$n] times")
+ unless defined $self->{ID}->{$_};
+ }
+
+ for (keys %{ $self->{ID} })
+ {
+ my $n = $self->{IDREF}->{$_} || 0;
+ $self->fail (300, "[$n] references to ID [$_]");
+ }
+
+ delete $self->{Context};
+}
+
+sub getRootElement
+{
+ my $self = shift;
+# print "getRoot $self " . $self->{RootElement} . "\n";
+ $_[0]->{RootElement};
+}
+
+# PerlSAX API
+sub doctype_decl
+{
+ my ($self, $hash) = @_;
+ $self->Doctype ($hash->{Name}, $hash->{SystemId},
+ $hash->{PublicId}, $hash->{Internal});
+}
+
+sub Doctype
+{
+ my ($self, $name, $sysid, $pubid, $internal) = @_;
+ $self->{RootElement} = $name;
+
+ my $context = $self->{Context}->[0];
+ $context->setRootElement ($name);
+
+#?? what else
+}
+
+sub Attr
+{
+ my ($self, $tag, $attr, $val, $specified) = @_;
+
+#print "Attr for tag=$tag attr=$attr val=$val spec=$specified\n";
+
+ my $arule = $self->{ARule}->{$tag};
+ if (defined $arule && $arule->{Defined}->{$attr})
+ {
+ $arule->check ($attr, $val, $specified);
+ }
+ else
+ {
+ $self->fail (103, "undefined attribute [$attr]", Element => $tag);
+ }
+}
+
+sub EndAttr
+{
+ my $self = shift;
+
+ my $arule = $self->{CurrARule};
+ if (defined $arule)
+ {
+ $arule->EndAttr;
+ }
+}
+
+# PerlSAX API
+sub start_element
+{
+ my ($self, $hash) = @_;
+ my $tag = $hash->{Name};
+ my $attr = $hash->{Attributes};
+
+ $self->Start ($tag);
+
+ if (exists $hash->{AttributeOrder})
+ {
+ my $defaulted = $hash->{Defaulted};
+ my @order = @{ $hash->{AttributeOrder} };
+
+ # Specified attributes
+ for (my $i = 0; $i < $defaulted; $i++)
+ {
+ my $a = $order[$i];
+ $self->Attr ($tag, $a, $attr->{$a}, 1);
+ }
+
+ # Defaulted attributes
+ for (my $i = $defaulted; $i < @order; $i++)
+ {
+ my $attr = $order[$i];
+ $self->Attr ($tag, $a, $attr->{$a}, 0);
+ }
+ }
+ else
+ {
+ # Assume all attributes were specified
+ my @attr = %$attr;
+ my ($key, $val);
+ while ($key = shift @attr)
+ {
+ $val = shift @attr;
+
+ $self->Attr ($tag, $key, $val, 1);
+ }
+ }
+ $self->EndAttr;
+}
+
+sub Start
+{
+ my ($self, $tag) = @_;
+#?? if first tag, check with root element - or does expat check this already?
+
+ my $context = $self->{Context};
+ $context->[0]->Start ($self, $tag);
+
+ my $erule = $self->{ERule}->{$tag};
+ if (defined $erule)
+ {
+ unshift @$context, $erule->context;
+ }
+ else
+ {
+ # It's not a real error according to the XML Spec.
+ $self->fail (101, "undefined ELEMENT [$tag]");
+ unshift @$context, new XML::Checker::Context::ANY;
+ }
+
+#?? what about ARule ??
+ my $arule = $self->{ARule}->{$tag};
+ if (defined $arule)
+ {
+ $self->{CurrARule} = $arule;
+ $arule->StartAttr;
+ }
+}
+
+# PerlSAX API
+sub end_element
+{
+ shift->End;
+}
+
+sub End
+{
+ my ($self) = @_;
+ my $context = $self->{Context};
+
+ $context->[0]->End ($self);
+ shift @$context;
+}
+
+# PerlSAX API
+sub characters
+{
+ my ($self, $hash) = @_;
+ my $data = $hash->{Data};
+
+ if ($self->{InCDATA})
+ {
+ $self->CData ($data);
+ }
+ else
+ {
+ $self->Char ($data);
+ }
+}
+
+# PerlSAX API
+sub start_cdata
+{
+ $_[0]->{InCDATA} = 1;
+}
+
+# PerlSAX API
+sub end_cdata
+{
+ $_[0]->{InCDATA} = 0;
+}
+
+sub Char
+{
+ my ($self, $text) = @_;
+ my $context = $self->{Context};
+
+ # NOTE: calls to isWS may set this to 1.
+ $INSIGNIF_WS = 0;
+
+ $context->[0]->Char ($self, $text);
+}
+
+# Treat CDATASection same as Char (Text)
+sub CData
+{
+ my ($self, $cdata) = @_;
+ my $context = $self->{Context};
+
+ $context->[0]->Char ($self, $cdata);
+
+ # CDATASection can never be insignificant whitespace
+ $INSIGNIF_WS = 0;
+#?? I'm not sure if this assumption is correct
+}
+
+# PerlSAX API
+sub comment
+{
+ my ($self, $hash) = @_;
+ $self->Comment ($hash->{Data});
+}
+
+sub Comment
+{
+# ?? what can be checked here?
+}
+
+# PerlSAX API
+sub entity_reference
+{
+ my ($self, $hash) = @_;
+ $self->EntityRef ($hash->{Name}, 0);
+#?? parameter entities (like %par;) are NOT supported!
+# PerlSAX::handle_default should be fixed!
+}
+
+sub EntityRef
+{
+ my ($self, $ref, $isParam) = @_;
+
+ if ($isParam)
+ {
+ # expand to "%name;"
+ print STDERR "XML::Checker::Entity - parameter Entity (%ent;) not implemented\n";
+ }
+ else
+ {
+ # Treat same as Char - for now
+ my $context = $self->{Context};
+ $context->[0]->Char ($self, "&$ref;");
+ $INSIGNIF_WS = 0;
+#?? I could count the number of times each Entity is referenced
+ }
+}
+
+# PerlSAX API
+sub unparsed_entity_decl
+{
+ my ($self, $hash) = @_;
+ $self->Unparsed ($hash->{Name});
+#?? what about Base, SytemId, PublicId ?
+}
+
+sub Unparsed
+{
+ my ($self, $entity) = @_;
+# print "ARule::Unparsed $entity\n";
+ if ($self->{Unparsed}->{$entity})
+ {
+ $self->fail (112, "unparsed ENTITY [$entity] already defined");
+ }
+ else
+ {
+ $self->{Unparsed}->{$entity} = 1;
+ }
+}
+
+# PerlSAX API
+sub notation_decl
+{
+ my ($self, $hash) = @_;
+ $self->Notation ($hash->{Name});
+#?? what about Base, SytemId, PublicId ?
+}
+
+sub Notation
+{
+ my ($self, $notation) = @_;
+ if ($self->{NOTATION}->{$notation})
+ {
+ $self->fail (113, "NOTATION [$notation] already defined");
+ }
+ else
+ {
+ $self->{NOTATION}->{$notation} = 1;
+ }
+}
+
+# PerlSAX API
+sub entity_decl
+{
+ my ($self, $hash) = @_;
+
+ $self->Entity ($hash->{Name}, $hash->{Value}, $hash->{SystemId},
+ $hash->{PublicId}, $hash->{'Notation'});
+}
+
+sub Entity
+{
+ my ($self, $name, $val, $sysId, $pubId, $ndata) = @_;
+
+ if (exists $self->{ENTITY}->{$name})
+ {
+ $self->fail (114, "ENTITY [$name] already defined");
+ }
+ else
+ {
+ $self->{ENTITY}->{$name} = $val;
+ }
+}
+
+# PerlSAX API
+#sub xml_decl {} $hash=> Version, Encoding, Standalone
+# Don't implement resolve_entity() which is called by ExternEnt!
+#sub processing_instruction {} $hash=> Target, Data
+
+# Returns whether the Char data is whitespace and also updates the
+# $INSIGNIF_WS variable to indicate whether it is insignificant whitespace.
+# Note that this method is only called in places where potential whitespace
+# can be insignificant (i.e. when the ERule is Children or EMPTY)
+sub isWS
+{
+ $INSIGNIF_WS = ($_[1] =~ /^\s*$/);
+}
+
+sub isInsignifWS
+{
+ $INSIGNIF_WS;
+}
+
+sub fail
+{
+ my $self = shift;
+ &$FAIL (@_);
+}
+
+sub print_error # static
+{
+ my $str = error_string (@_);
+ print STDERR $str;
+}
+
+sub error_string # static
+{
+ my $code = shift;
+ my $msg = shift;
+
+ my @a = ();
+ my ($key, $val);
+ while ($key = shift)
+ {
+ $val = shift;
+ push @a, ("$key " . (defined $val ? $val : "(undef)"));
+ }
+
+ my $cat = $code >= 200 ? ($code >= 300 ? "INFO" : "WARNING") : "ERROR";
+ my $str = join (", ", @a);
+ $str = length($str) ? "\tContext: $str\n" : "";
+
+ "XML::Checker $cat-$code: $msg\n$str";
+}
+
+sub debug
+{
+ my ($self) = @_;
+ my $context = $self->{Context}->[0];
+ my $c = $context ? $context->debug : "no context";
+ my $root = $self->{RootElement};
+
+ "Checker[$c,RootElement=$root]";
+}
+
+1; # package return code
+
+__END__
+
+=head1 NAME
+
+XML::Checker - A perl module for validating XML
+
+=head1 SYNOPSIS
+
+L<XML::Checker::Parser> - an L<XML::Parser> that validates at parse time
+
+L<XML::DOM::ValParser> - an L<XML::DOM::Parser> that validates at parse time
+
+(Some of the package names may change! This is only an alpha release...)
+
+=head1 DESCRIPTION
+
+XML::Checker can be used in different ways to validate XML. See the manual
+pages of L<XML::Checker::Parser> and L<XML::DOM::ValParser>
+for more information.
+
+This document only describes common topics like error handling
+and the XML::Checker class itself.
+
+WARNING: Not all errors are currently checked. Almost everything is subject to
+change. Some reported errors may not be real errors.
+
+=head1 ERROR HANDLING
+
+Whenever XML::Checker (or one of the packages that uses XML::Checker) detects a
+potential error, the 'fail handler' is called. It is currently also called
+to report information, like how many times an Entity was referenced.
+(The whole error handling mechanism is subject to change, I'm afraid...)
+
+The default fail handler is XML::Checker::print_error(), which prints an error
+message to STDERR. It does not stop the XML::Checker, so it will continue
+looking for other errors.
+The error message is created with XML::Checker::error_string().
+
+You can define your
+own fail handler in two ways, locally and globally. Use a local variable to
+temporarily override the fail handler. This way the default fail handler is restored
+when the local variable goes out of scope, esp. when exceptions are thrown e.g.
+
+ # Using a local variable to temporarily override the fail handler (preferred)
+ { # new block - start of local scope
+ local $XML::Checker::FAIL = \&my_fail;
+ ... your code here ...
+ } # end of block - the previous fail handler is restored
+
+You can also set the error handler globally, risking that your code may not
+be reusable or may clash with other modules that use XML::Checker.
+
+ # Globally setting the fail handler (not recommended)
+ $XML::Checker::FAIL = \&my_fail;
+ ... rest of your code ...
+
+The fail handler is called with the following parameters ($code, $msg, @context),
+where $code is the error code, $msg is the error description and
+@context contains information on where the error occurred. The @context is
+a (ordered) list of (key,value) pairs and can easily be turned into a hash.
+It contains the following information:
+
+ Element - tag name of Element node (if applicable)
+ Attr - attribute name (if applicable)
+ ChildElementIndex - if applicable (see error 157)
+ line - only when parsing
+ column - only when parsing
+ byte - only when parsing (-1 means: end of file)
+
+Some examples of fail handlers:
+
+ # Don't print info messages
+ sub my_fail
+ {
+ my $code = shift;
+ print STDERR XML::Checker::error_message ($code, @_)
+ if $code < 300;
+ }
+
+ # Die when the first error is encountered - this will stop
+ # the parsing process. Ignore information messages.
+ sub my_fail
+ {
+ my $code = shift;
+ die XML::Checker::error_message ($code, @_) if $code < 300;
+ }
+
+ # Count the number of undefined NOTATION references
+ # and print the error as usual
+ sub my_fail
+ {
+ my $code = shift;
+ $count_undef_notations++ if $code == 100;
+ XML::Checker::print_error ($code, @_);
+ }
+
+ # Die when an error is encountered.
+ # Don't die if a warning or info message is encountered, just print a message.
+ sub my_fail {
+ my $code = shift;
+ die XML::Checker::error_string ($code, @_) if $code < 200;
+ XML::Checker::print_error ($code, @_);
+ }
+
+=head1 INSIGNIFICANT WHITESPACE
+
+XML::Checker keeps track of whether whitespace found in character data
+is significant or not. It is considered insignicant if it is found inside
+an element that has a ELEMENT rule that is not of type Mixed or of type ANY.
+(A Mixed ELEMENT rule does contains the #PCDATA keyword.
+An ANY rule contains the ANY keyword. See the XML spec for more info.)
+
+XML::Checker can not determine whether whitespace is insignificant in those two
+cases, because they both allow regular character data to appear within
+XML elements and XML::Checker can therefore not deduce whether whitespace
+is part of the actual data or was just added for readability of the XML file.
+
+XML::Checker::Parser and XML::DOM::ValParser both have the option to skip
+insignificant whitespace when setting B<SkipInsignifWS> to 1 in their constructor.
+If set, they will not call the Char handler when insignificant whitespace is
+encountered. This means that in XML::DOM::ValParser no Text nodes are created
+for insignificant whitespace.
+
+Regardless of whether the SkipInsignifWS options is set, XML::Checker always
+keeps track of whether whitespace is insignificant. After making a call to
+XML::Checker's Char handler, you can find out if it was insignificant whitespace
+by calling the isInsignifWS method.
+
+When using multiple (nested) XML::Checker instances or when using XML::Checker
+without using XML::Checker::Parser or XML::DOM::ValParser (which hardly anybody
+probably will), make sure to set a local variable in the scope of your checking
+code, e.g.
+
+ { # new block - start of local scope
+ local $XML::Checker::INSIGNIF_WS = 0;
+ ... insert your code here ...
+ } # end of scope
+
+=head1 ERROR CODES
+
+There are 3 categories, errors, warnings and info messages.
+(The codes are still subject to change, as well the error descriptions.)
+
+Most errors have a link to the appropriate Validaty Constraint (B<VC>)
+or other section in the XML specification.
+
+=head2 ERROR Messages
+
+=head2 100 - 109
+
+=over 4
+
+=item *
+
+B<100> - undefined NOTATION [$notation] in ATTLIST
+
+The ATTLIST contained a Notation reference that was not defined in a
+NOTATION definition.
+B<VC:> L<Notation Attributes|http://www.w3.org/TR/REC-xml#notatn>
+
+
+=item *
+
+B<101> - undefined ELEMENT [$tagName]
+
+The specified Element was never defined in an ELEMENT definition.
+This is not an error according to the XML spec.
+See L<Element Type Declarations|http://www.w3.org/TR/REC-xml#elemdecls>
+
+
+=item *
+
+B<102> - undefined unparsed ENTITY [$entity]
+
+The attribute value referenced an undefined unparsed entity.
+B<VC:> L<Entity Name|http://www.w3.org/TR/REC-xml#entname>
+
+
+=item *
+
+B<103> - undefined attribute [$attrName]
+
+The specified attribute was not defined in an ATTLIST for that Element.
+B<VC:> L<Attribute Value Type|http://www.w3.org/TR/REC-xml#ValueType>
+
+
+=back
+
+=head2 110 - 119
+
+=over 4
+
+=item *
+
+B<110> - attribute [$attrName] of element [$tagName] already defined
+
+The specified attribute was already defined in this ATTLIST definition or
+in a previous one.
+This is not an error according to the XML spec.
+See L<Attribute-List Declarations|http://www.w3.org/TR/REC-xml#attdecls>
+
+
+=item *
+
+B<111> - ID [$value] already defined
+
+An ID with the specified value was already defined in an attribute
+within the same document.
+B<VC:> L<ID|http://www.w3.org/TR/REC-xml#id>
+
+
+=item *
+
+B<112> - unparsed ENTITY [$entity] already defined
+
+This is not an error according to the XML spec.
+See L<Entity Declarations|http://www.w3.org/TR/REC-xml#sec-entity-decl>
+
+
+=item *
+
+B<113> - NOTATION [$notation] already defined
+
+
+=item *
+
+B<114> - ENTITY [$entity] already defined
+
+This is not an error according to the XML spec.
+See L<Entity Declarations|http://www.w3.org/TR/REC-xml#sec-entity-decl>
+
+
+=item *
+
+B<115> - ELEMENT [$name] already defined
+B<VC:> L<Unique Element Type Declaration|http://www.w3.org/TR/REC-xml#EDUnique>
+
+
+=back
+
+=head2 120 - 129
+
+=over 4
+
+=item *
+
+B<120> - invalid default ENTITY [$default]
+
+(Or IDREF or NMTOKEN instead of ENTITY.)
+The ENTITY, IDREF or NMTOKEN reference in the default attribute
+value for an attribute with types ENTITY, IDREF or NMTOKEN was not
+valid.
+B<VC:> L<Attribute Default Legal|http://www.w3.org/TR/REC-xml#defattrvalid>
+
+
+=item *
+
+B<121> - invalid default [$token] in ENTITIES [$default]
+
+(Or IDREFS or NMTOKENS instead of ENTITIES)
+One of the ENTITY, IDREF or NMTOKEN references in the default attribute
+value for an attribute with types ENTITIES, IDREFS or NMTOKENS was not
+valid.
+B<VC:> L<Attribute Default Legal|http://www.w3.org/TR/REC-xml#defattrvalid>
+
+
+=item *
+
+B<122> - invalid default attribute value [$default]
+
+The specified default attribute value is not a valid attribute value.
+B<VC:> L<Attribute Default Legal|http://www.w3.org/TR/REC-xml#defattrvalid>
+
+
+=item *
+
+B<123> - invalid default ID [$default], must be #REQUIRED or #IMPLIED
+
+The default attribute value for an attribute of type ID has to be
+#REQUIRED or #IMPLIED.
+B<VC:> L<ID Attribute Default|http://www.w3.org/TR/REC-xml#id-default>
+
+
+=item *
+
+B<124> - bad model [$model] for ELEMENT [$name]
+
+The model in the ELEMENT definition did not conform to the XML syntax
+for Mixed models.
+See L<Mixed Content|http://www.w3.org/TR/REC-xml#sec-mixed-content>
+
+
+=back
+
+=head2 130 - 139
+
+=over 4
+
+=item *
+
+B<130> - invalid NMTOKEN [$attrValue]
+
+The attribute value is not a valid NmToken token.
+B<VC:> L<Enumeration|http://www.w3.org/TR/REC-xml#enum>
+
+
+=item *
+
+B<131> - invalid ID [$attrValue]
+
+The specified attribute value is not a valid Name token.
+B<VC:> L<ID|http://www.w3.org/TR/REC-xml#id>
+
+
+=item *
+
+B<132> - invalid IDREF [$value]
+
+The specified attribute value is not a valid Name token.
+B<VC:> L<IDREF|http://www.w3.org/TR/REC-xml#idref>
+
+
+=item *
+
+B<133> - invalid ENTITY name [$name]
+
+The specified attribute value is not a valid Name token.
+B<VC:> L<Entity Name|http://www.w3.org/TR/REC-xml#entname>
+
+
+=item *
+
+B<134> - invalid Enumeration value [$value] in ATTLIST
+
+The specified value is not a valid NmToken (see XML spec for def.)
+See definition of L<NmToken|http://www.w3.org/TR/REC-xml#NT-Nmtoken>
+
+
+=item *
+
+B<135> - empty NOTATION list in ATTLIST
+
+The NOTATION list of the ATTLIST definition did not contain any NOTATION
+references.
+See definition of L<NotationType|http://www.w3.org/TR/REC-xml#NT-NotationType>
+
+
+=item *
+
+B<136> - empty Enumeration list in ATTLIST
+
+The ATTLIST definition of the attribute of type Enumeration did not
+contain any values.
+See definition of L<Enumeration|http://www.w3.org/TR/REC-xml#NT-Enumeration>
+
+
+=item *
+
+B<137> - invalid ATTLIST type [$type]
+
+The attribute type has to be one of: ID, IDREF, IDREFS, ENTITY, ENTITIES,
+NMTOKEN, NMTOKENS, CDATA, NOTATION or an Enumeration.
+See definition of L<AttType|http://www.w3.org/TR/REC-xml#NT-AttType>
+
+
+=back
+
+=head2 150 - 159
+
+=over 4
+
+=item *
+
+B<150> - bad #FIXED attribute value [$value], it should be [$default]
+
+The specified attribute was defined as #FIXED in the ATTLIST definition
+and the found attribute $value differs from the specified $default value.
+B<VC:> L<Fixed Attribute Default|http://www.w3.org/TR/REC-xml#FixedAttr>
+
+
+=item *
+
+B<151> - only one ID allowed in ATTLIST per element first=[$attrName]
+
+The ATTLIST definitions for an Element may contain only one attribute
+with the type ID. The specified $attrName is the one that was found first.
+B<VC:> L<One ID per Element Type|http://www.w3.org/TR/REC-xml#one-id-per-el>
+
+
+=item *
+
+B<152> - Element should be EMPTY, found Element [$tagName]
+
+The ELEMENT definition for the specified Element said it should be
+EMPTY, but a child Element was found.
+B<VC:> L<Element Valid (sub1)|http://www.w3.org/TR/REC-xml#elementvalid>
+
+
+=item *
+
+B<153> - Element should be EMPTY, found text [$text]
+
+The ELEMENT definition for the specified Element said it should be
+EMPTY, but text was found. Currently, whitespace is not allowed between the
+open and close tag. (This may be wrong, please give feedback.)
+To allow whitespace (subject to change), set:
+
+ $XML::Checker::Context::EMPTY::ALLOW_WHITE_SPACE = 1;
+
+B<VC:> L<Element Valid (sub1)|http://www.w3.org/TR/REC-xml#elementvalid>
+
+
+=item *
+
+B<154> - bad order of Elements Found=[$found] RE=[$re]
+
+The child elements of the specified Element did not match the
+regular expression found in the ELEMENT definition. $found contains
+a comma separated list of all the child element tag names that were found.
+$re contains the (decoded) regular expression that was used internally.
+B<VC:> L<Element Valid|http://www.w3.org/TR/REC-xml#elementvalid>
+
+
+=item *
+
+B<155> - more than one root Element [$tags]
+
+An XML Document may only contain one Element.
+$tags is a comma separated list of element tag names encountered sofar.
+L<XML::Parser> (expat) throws 'no element found' exception.
+See two_roots.xml for an example.
+See definition of L<document|http://www.w3.org/TR/REC-xml#dt-root>
+
+
+=item *
+
+B<156> - unexpected root Element [$tagName], expected [$rootTagName]
+
+The tag name of the root Element of the XML Document differs from the name
+specified in the DOCTYPE section.
+L<XML::Parser> (expat) throws 'not well-formed' exception.
+See bad_root.xml for an example.
+B<VC:> L<Root Element Type|http://www.w3.org/TR/REC-xml#vc-roottype>
+
+
+=item *
+
+B<157> - unexpected Element [$tagName]
+
+The ELEMENT definition for the specified Element does not allow child
+Elements with the specified $tagName.
+B<VC:> L<Element Valid|http://www.w3.org/TR/REC-xml#elementvalid>
+
+The error context contains ChildElementIndex which is the index within
+its parent Element (counting only Element nodes.)
+
+
+=item *
+
+B<158> - unspecified value for #IMPLIED attribute [$attrName]
+
+The ATTLIST for the specified attribute said the attribute was #IMPLIED,
+which means the user application should supply a value, but the attribute
+value was not specified. (User applications should pass a value and set
+$specified to 1 in the Attr handler.)
+
+
+=item *
+
+B<159> - unspecified value for #REQUIRED attribute [$attrName]
+
+The ATTLIST for the specified attribute said the attribute was #REQUIRED,
+which means that a value should have been specified.
+B<VC:> L<Required Attribute|http://www.w3.org/TR/REC-xml#RequiredAttr>
+
+
+=back
+
+=head2 160 - 169
+
+=over 4
+
+=item *
+
+B<160> - invalid Enumeration value [$attrValue]
+
+The specified attribute value does not match one of the Enumeration values
+in the ATTLIST.
+B<VC:> L<Enumeration|http://www.w3.org/TR/REC-xml#enum>
+
+
+=item *
+
+B<161> - invalid NOTATION value [$attrValue]
+
+The specifed attribute value was not found in the list of possible NOTATION
+references as found in the ATTLIST definition.
+B<VC:> L<Notation Attributes|http://www.w3.org/TR/REC-xml#notatn>
+
+
+=item *
+
+B<162> - undefined NOTATION [$attrValue]
+
+The NOTATION referenced by the specified attribute value was not defined.
+B<VC:> L<Notation Attributes|http://www.w3.org/TR/REC-xml#notatn>
+
+
+=back
+
+=head2 WARNING Messages (200 and up)
+
+=over 4
+
+=item *
+
+B<200> - undefined ID [$id] was referenced [$n] times
+
+The specified ID was referenced $n times, but never defined in an attribute
+value with type ID.
+B<VC:> L<IDREF|http://www.w3.org/TR/REC-xml#idref>
+
+
+=back
+
+=head2 INFO Messages (300 and up)
+
+=over 4
+
+=item *
+
+B<300> - [$n] references to ID [$id]
+
+The specified ID was referenced $n times.
+
+
+=back
+
+=head2 Not checked
+
+The following errors are already checked by L<XML::Parser> (expat) and
+are currently not checked by XML::Checker:
+
+(?? TODO - add more info)
+
+=over 4
+
+=item root element is missing
+
+L<XML::Parser> (expat) throws 'no element found' exception.
+See no_root.xml for an example.
+
+=back
+
+=head1 XML::Checker
+
+XML::Checker can be easily plugged into your application.
+It uses mostly the same style of event handlers (or callbacks) as L<XML::Parser>.
+See L<XML::Parser> manual page for descriptions of most handlers.
+
+It also implements PerlSAX style event handlers. See L<PerlSAX interface>.
+
+Currently, the XML::Checker object is a blessed hash with the following
+(potentially useful) entries:
+
+ $checker->{RootElement} - root element name as found in the DOCTYPE
+ $checker->{NOTATION}->{$notation} - is 1 if the NOTATION was defined
+ $checker->{ENTITY}->{$name} - contains the (first) ENTITY value if defined
+ $checker->{Unparsed}->{$entity} - is 1 if the unparsed ENTITY was defined
+ $checker->{ID}->{$id} - is 1 if the ID was defined
+ $checker->{IDREF}->{$id} - number of times the ID was referenced
+
+ # Less useful:
+ $checker->{ERule}->{$tag} - the ELEMENT rules by Element tag name
+ $checker->{ARule}->{$tag} - the ATTLIST rules by Element tag name
+ $checker->{Context} - context stack used internally
+ $checker->{CurrARule} - current ATTLIST rule for the current Element
+
+=head2 XML:Checker methods
+
+This section is only interesting when using XML::Checker directly.
+XML::Checker supports most event handlers that L<XML::Parser> supports with minor
+differences. Note that the XML::Checker event handler methods are
+instance methods and not static, so don't forget to call them like this,
+without passing $expat (as in the L<XML::Parser>) handlers:
+
+ $checker->Start($tagName);
+
+=over 4
+
+=item Constructor
+
+ $checker = new XML::Checker;
+ $checker = new XML::Checker (%user_args);
+
+User data may be stored by client applications. Only $checker->{User} is
+guaranteed not to clash with internal hash keys.
+
+=item getRootElement ()
+
+ $tagName = $checker->getRootElement;
+
+Returns the root element name as found in the DOCTYPE
+
+=back
+
+=head2 Expat interface
+
+XML::Checker supports what I call the I<Expat> interface, which is
+the collection of methods you normally specify as the callback handlers
+when using XML::Parser.
+
+Only the following L<XML::Parser> handlers are currently supported:
+Init, Final, Char, Start, End, Element, Attlist, Doctype,
+Unparsed, Entity, Notation.
+
+I don't know how to correctly support the Default handler for all L<XML::Parser>
+releases. The Start handler works a little different (see below) and I
+added Attr, InitDomElem, FinalDomElem, CDATA and EntityRef handlers.
+See L<XML::Parser> for a description of the handlers that are not listed below.
+
+Note that this interface may disappear, when the PerlSAX interface stabilizes.
+
+=over 4
+
+=item Start ($tag)
+
+ $checker->Start($tag);
+
+Call this when an Element with the specified $tag name is encountered.
+Different from the Start handler in L<XML::Parser>, in that no attributes
+are passed in (use the Attr handler for those.)
+
+=item Attr ($tag, $attrName, $attrValue, $isSpecified)
+
+ $checker->Attr($tag,$attrName,$attrValue,$spec);
+
+Checks an attribute with the specified $attrName and $attrValue against the
+ATTLIST definition of the element with the specified $tag name.
+$isSpecified means whether the attribute was specified (1) or defaulted (0).
+
+=item EndAttr ()
+
+ $checker->EndAttr;
+
+This should be called after all attributes are passed with Attr().
+It will check which of the #REQUIRED attributes were not specified and generate
+the appropriate error (159) for each one that is missing.
+
+=item CDATA ($text)
+
+ $checker->CDATA($text);
+
+This should be called whenever CDATASections are encountered.
+Similar to Char handler (but might perform different checks later...)
+
+=item EntityRef ($entity, $isParameterEntity)
+
+ $checker->EntityRef($entity,$isParameterEntity);
+
+Checks the ENTITY reference. Set $isParameterEntity to 1 for
+entity references that start with '%'.
+
+=item InitDomElem () and FinalDomElem ()
+
+Used by XML::DOM::Element::check() to initialize (and cleanup) the
+context stack when checking a single element.
+
+=back
+
+=head2 PerlSAX interface
+
+XML::Checker now also supports the PerlSAX interface, so you can use XML::Checker
+wherever you use PerlSAX handlers.
+
+XML::Checker implements the following methods: start_document, end_document,
+start_element, end_element, characters, processing_instruction, comment,
+start_cdata, end_cdata, entity_reference, notation_decl, unparsed_entity_decl,
+entity_decl, element_decl, attlist_decl, doctype_decl, xml_decl
+
+Not implemented: set_document_locator, ignorable_whitespace
+
+See PerlSAX.pod for details. (It is called lib/PerlSAX.pod in the libxml-perl
+distribution which can be found at CPAN.)
+
+=head1 CAVEATS
+
+This is an alpha release. Almost everything is subject to change.
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+=head1 SEE ALSO
+
+The home page of XML::Checker at L<http://www.erols.com/enno/checker/index.html>
+
+The XML spec (Extensible Markup Language 1.0) at L<http://www.w3.org/TR/REC-xml>
+
+The L<XML::Parser> and L<XML::Parser::Expat> manual pages.
+
+The other packages that come with XML::Checker:
+L<XML::Checker::Parser>, L<XML::DOM::ValParser>
+
+The DOM Level 1 specification at L<http://www.w3.org/TR/REC-DOM-Level-1>
+
+The PerlSAX specification. It is currently in lib/PerlSAX.pod in the
+libxml-perl distribution by Ken MacLeod.
+
+The original SAX specification (Simple API for XML) can be found at
+L<http://www.megginson.com/SAX> and L<http://www.megginson.com/SAX/SAX2>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Checker/DOM.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,4 @@
+BEGIN
+{
+ warn "XML::Checker::DOM has been deprecated. The methods have been merged into XML::DOM."
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Checker/Parser.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,683 @@
+package XML::Checker::Parser;
+use strict;
+use XML::Parser;
+use XML::Checker;
+
+use vars qw( @ISA @InterceptedHandlers @SGML_SEARCH_PATH %URI_MAP
+ $_checker $_prevFAIL
+ $_Init $_Final $_Char $_Start $_End $_Element $_Attlist
+ $_Doctype $_Unparsed $_Notation $_Entity $_skipInsignifWS
+ $_EndOfDoc
+ );
+
+@ISA = qw( XML::Parser );
+
+@InterceptedHandlers = qw( Init Final Char Start End Element Attlist
+ Doctype Unparsed Notation Entity );
+
+# Where to search for external DTDs (in local file system)
+@SGML_SEARCH_PATH = ();
+
+# Where to search for external DTDs as referred to by public ID in a
+# <!DOCTYPE ...> statement, e.g. "-//W3C//DTD HTML 4.0//EN"
+# E.g. it could map "-//W3C//DTD HTML 4.0//EN" to "file:/user/html.dtd"
+%URI_MAP = ();
+
+sub new
+{
+ my ($class, %args) = @_;
+
+ my $super = new XML::Parser (%args);
+ $super->{Checker} = new XML::Checker (%args);
+
+ my %handlers = %{$super->{Handlers}};
+
+ # Don't need Comment handler - assuming comments are allowed anywhere
+#?? What should Default handler do?
+#?? Check XMLDecl, ExternEnt, Proc? No, for now.
+#?? Add CdataStart, CdataEnd support?
+
+ for (@InterceptedHandlers)
+ {
+ my $func = "XML::Checker::Parser::$_";
+ $handlers{$_} = \&$func;
+ }
+
+ $super->{UserHandlers} = $super->{Handlers};
+ $super->{Handlers} = \%handlers;
+
+ bless $super, $class;
+}
+
+sub getChecker
+{
+ $_[0]->{Checker}
+}
+
+sub parse
+{
+ my $self = shift;
+ my $uh = $self->{UserHandlers};
+
+ local $_checker = $self->{Checker};
+
+ local $_Init = $uh->{Init};
+ local $_Final = $uh->{Final};
+ local $_Start = $uh->{Start};
+ local $_End = $uh->{End};
+ local $_Char = $uh->{Char};
+ local $_Element = $uh->{'Element'};
+ local $_Attlist = $uh->{'Attlist'};
+ local $_Doctype = $uh->{Doctype};
+ local $_Unparsed = $uh->{Unparsed};
+ local $_Notation = $uh->{Notation};
+ local $_Entity = $uh->{Entity};
+
+ local $_prevFAIL = $XML::Checker::FAIL;
+ local $XML::Checker::FAIL = \&fail_add_context;
+
+ local $XML::Checker::INSIGNIF_WS = 0;
+ local $_skipInsignifWS = $self->{SkipInsignifWS};
+
+ local $_EndOfDoc = 0;
+
+ $self->SUPER::parse (@_);
+}
+
+my $LWP_USER_AGENT;
+sub set_LWP_UserAgent # static
+{
+ $LWP_USER_AGENT = shift;
+}
+
+sub load_URL # static
+{
+ my ($url, $lwp_user_agent) = @_;
+ my $result;
+
+ # Read the file from the web with LWP.
+ #
+ # Note that we read in the entire file, which may not be ideal
+ # for large files. LWP::UserAgent also provides a callback style
+ # request, which we could convert to a stream with a fork()...
+
+ my $response;
+ eval
+ {
+ use LWP::UserAgent;
+
+ my $ua = $lwp_user_agent;
+ unless (defined $ua)
+ {
+ unless (defined $LWP_USER_AGENT)
+ {
+ $LWP_USER_AGENT = LWP::UserAgent->new;
+
+ # Load proxy settings from environment variables, i.e.:
+ # http_proxy, ftp_proxy, no_proxy etc. (see LWP::UserAgent(3))
+ # You need these to go thru firewalls.
+ $LWP_USER_AGENT->env_proxy;
+ }
+ $ua = $LWP_USER_AGENT;
+ }
+ my $req = new HTTP::Request 'GET', $url;
+ $response = $LWP_USER_AGENT->request ($req);
+ $result = $response->content;
+ };
+ if ($@)
+ {
+ die "Couldn't load URL [$url] with LWP: $@";
+ }
+ if (!$result)
+ {
+ my $message = $response->as_string;
+ die "Couldn't load URL [$url] with LWP: $message";
+ }
+ return $result;
+}
+
+sub parsefile
+{
+ my $self = shift;
+ my $url = shift;
+
+ # Any other URL schemes?
+ if ($url =~ /^(https?|ftp|wais|gopher|file):/)
+ {
+ my $xml = load_URL ($url, $self->{LWP_UserAgent});
+ my $result;
+ eval
+ {
+ # Parse the result of the HTTP request
+ $result = $self->parse ($xml, @_);
+ };
+ if ($@)
+ {
+ die "Couldn't parsefile [$url]: $@";
+ }
+ return $result;
+ }
+ else
+ {
+ return $self->SUPER::parsefile ($url, @_);
+ }
+}
+
+sub Init
+{
+ my $expat = shift;
+ $_checker->{Expat} = $expat;
+
+ $_checker->Init (@_);
+ &$_Init ($expat) if $_Init;
+}
+
+sub Final
+{
+ my $expat = shift;
+ $_EndOfDoc = 1;
+
+ $_checker->Final (@_);
+ my $result = &$_Final ($expat) if $_Final;
+
+ # Decouple Expat from Checker
+ delete $_checker->{Expat};
+
+ # NOTE: Checker is not decoupled
+ return $result;
+}
+
+sub Start
+{
+ my ($expat, $tag, @attr) = @_;
+
+ $_checker->Start ($tag);
+
+ my $num_spec = $expat->specified_attr;
+ for (my $i = 0; $i < @attr; $i++)
+ {
+ my $spec = ($i < $num_spec);
+ my $attr = $attr[$i];
+ my $val = $attr[++$i];
+
+# print "--- $tag $attr $val $spec\n";
+ $_checker->Attr ($tag, $attr, $val, $spec);
+ }
+ $_checker->EndAttr;
+
+ &$_Start ($expat, $tag, @attr) if $_Start;
+}
+
+sub End
+{
+ my $expat = shift;
+ $_checker->End (@_);
+ &$_End ($expat, @_) if $_End;
+}
+
+sub Char
+{
+ my $expat = shift;
+ $_checker->Char (@_);
+ &$_Char ($expat, @_)
+ if $_Char && !($XML::Checker::INSIGNIF_WS && $_skipInsignifWS);
+ # Skip insignificant whitespace
+}
+
+sub Element
+{
+ my $expat = shift;
+ $_checker->Element (@_);
+ &$_Element ($expat, @_) if $_Element;
+}
+
+sub Attlist
+{
+ my $expat = shift;
+ $_checker->Attlist (@_);
+ &$_Attlist ($expat, @_) if $_Attlist;
+}
+
+
+sub Doctype
+{
+ my $expat = shift;
+ my ($name, $sysid, $pubid, $internal) = @_;
+
+ my $dtd;
+ unless ($_checker->{SkipExternalDTD})
+ {
+ if ($sysid)
+ {
+ # External DTD...
+
+ #?? I'm not sure if we should die here or keep going?
+ $dtd = load_DTD ($sysid, $expat->{LWP_UserAgent});
+ }
+ elsif ($pubid)
+ {
+ $dtd = load_DTD ($pubid, $expat->{LWP_UserAgent});
+ }
+ }
+
+ if (defined $dtd)
+ {
+#?? what about passing ProtocolEncoding, Namespaces, Stream_Delimiter ?
+ my $parser = new XML::Parser (
+ Checker => $_checker,
+ ErrorContext => $expat->{ErrorContext},
+ Handlers => {
+ Entity => \&XML::Checker::Parser::ExternalDTD::Entity,
+ Notation => \&XML::Checker::Parser::ExternalDTD::Notation,
+ Element => \&XML::Checker::Parser::ExternalDTD::Element,
+ Attlist => \&XML::Checker::Parser::ExternalDTD::Attlist,
+ Unparsed => \&XML::Checker::Parser::ExternalDTD::Unparsed,
+ });
+
+ eval
+ {
+ $parser->parse ("<!DOCTYPE $name SYSTEM '$sysid' [\n$dtd\n]>\n<$name/>");
+ };
+ if ($@)
+ {
+ die "Couldn't parse contents of external DTD <$sysid> :$@";
+ }
+ }
+ $_checker->Doctype (@_);
+ &$_Doctype ($expat, @_) if $_Doctype;
+}
+
+sub Unparsed
+{
+ my $expat = shift;
+ $_checker->Unparsed (@_);
+ &$_Unparsed ($expat, @_) if $_Unparsed;
+}
+
+sub Entity
+{
+ my $expat = shift;
+ $_checker->Entity (@_);
+ &$_Entity ($expat, @_) if $_Entity;
+}
+
+sub Notation
+{
+ my $expat = shift;
+ $_checker->Notation (@_);
+ &$_Notation ($expat, @_) if $_Notation;
+}
+
+sub Default
+{
+#?? what can I check here?
+# print "Default handler got[" . join (", ", @_) . "]";
+}
+
+#sub XMLDecl
+#{
+#?? support later?
+#}
+
+sub setHandlers
+{
+ my ($self, %h) = @_;
+
+ for my $name (@InterceptedHandlers)
+ {
+ if (exists $h{$name})
+ {
+ eval "\$_$name = \$h{$name}";
+ delete $h{$name};
+ }
+ }
+
+ # Pass remaining handlers to the parent class (XML::Parser)
+ $self->SUPER::setHandlers (%h);
+}
+
+# Add (line, column, byte) to error context (unless it's EOF)
+sub fail_add_context # static
+{
+ my $e = $_checker->{Expat};
+
+ my $byte = $e->current_byte; # -1 means: end of XML document
+ if ($byte != -1 && !$_EndOfDoc)
+ {
+ push @_, (line => $e->current_line,
+ column => $e->current_column,
+ byte => $byte);
+ }
+ &$_prevFAIL (@_);
+}
+
+#-------- STATIC METHODS related to External DTDs ---------------------------
+
+sub load_DTD # static
+{
+ my ($sysid, $lwp_user_agent) = @_;
+
+ # See if it is defined in the %URI_MAP
+ # (Public IDs are stored here, e.g. "-//W3C//DTD HTML 4.0//EN")
+ if (exists $URI_MAP{$sysid})
+ {
+ $sysid = $URI_MAP{$sysid};
+ }
+ elsif ($sysid !~ /^\w+:/)
+ {
+ # Prefix the sysid with 'file:' if it has no protocol identifier
+ unless ($sysid =~ /^\//)
+ {
+ # Not an absolute path. See if it's in SGML_SEARCH_PATH.
+ my $relative_sysid = $sysid;
+
+ $sysid = find_in_sgml_search_path ($sysid);
+ if (! $sysid)
+ {
+ if ($ENV{'SGML_SEARCH_PATH'})
+ {
+ die "Couldn't find external DTD [$relative_sysid] in SGML_SEARCH_PATH ($ENV{'SGML_SEARCH_PATH'})";
+ }
+ else
+ {
+ die "Couldn't find external DTD [$relative_sysid], may be you should set SGML_SEARCH_PATH";
+ }
+ }
+ }
+ $sysid = "file:$sysid";
+ }
+
+ return load_URL ($sysid, $lwp_user_agent);
+}
+
+sub map_uri # static
+{
+ %URI_MAP = (%URI_MAP, @_);
+}
+
+sub set_sgml_search_path # static
+{
+ @SGML_SEARCH_PATH = @_;
+}
+
+sub find_in_sgml_search_path # static
+{
+ my $file = shift;
+
+ my @dirs = @SGML_SEARCH_PATH;
+ unless (@dirs)
+ {
+ my $path = $ENV{SGML_SEARCH_PATH};
+ if ($path)
+ {
+ @dirs = split (':', $path);
+ }
+ else
+ {
+ my $home = $ENV{HOME};
+ @dirs = (".", "$home/.sgml", "/usr/lib/sgml", "/usr/share/sgml");
+ }
+ }
+
+ for my $directory (@dirs)
+ {
+ if (-e "$directory/$file")
+ {
+ return "$directory/$file";
+ }
+ }
+ return undef;
+}
+
+package XML::Checker::Parser::ExternalDTD;
+
+sub Element {
+ my $expat = shift;
+ $expat->{Checker}->Element(@_);
+}
+
+sub Attlist {
+ my $expat = shift;
+ $expat->{Checker}->Attlist(@_);
+}
+
+sub Unparsed {
+ my $expat = shift;
+ $expat->{Checker}->Unparsed(@_);
+}
+
+sub Notation {
+ my $expat = shift;
+ $expat->{Checker}->Notation(@_);
+}
+
+sub Entity {
+ my $expat = shift;
+# print "Entity: $expat\n";
+ $expat->{Checker}->Entity(@_);
+}
+
+1; # package return code
+
+__END__
+
+=head1 NAME
+
+XML::Checker::Parser - an XML::Parser that validates at parse time
+
+=head1 SYNOPSIS
+
+ use XML::Checker::Parser;
+
+ my %expat_options = (KeepCDATA => 1,
+ Handlers => [ Unparsed => \&my_Unparsed_handler ]);
+ my $parser = new XML::Checker::Parser (%expat_options);
+
+ eval {
+ local $XML::Checker::FAIL = \&my_fail;
+ $parser->parsefile ("fail.xml");
+ };
+ if ($@) {
+ # Either XML::Parser (expat) threw an exception or my_fail() died.
+ ... your error handling code here ...
+ }
+
+ # Throws an exception (with die) when an error is encountered, this
+ # will stop the parsing process.
+ # Don't die if a warning or info message is encountered, just print a message.
+ sub my_fail {
+ my $code = shift;
+ die XML::Checker::error_string ($code, @_) if $code < 200;
+ XML::Checker::print_error ($code, @_);
+ }
+
+=head1 DESCRIPTION
+
+XML::Checker::Parser extends L<XML::Parser>
+
+I hope the example in the SYNOPSIS says it all, just use
+L<XML::Checker::Parser> as if it were an XML::Parser.
+See L<XML::Parser> for the supported (expat) options.
+
+You can also derive your parser from XML::Checker::Parser instead of
+from XML::Parser. All you should have to do is replace:
+
+ package MyParser;
+ @ISA = qw( XML::Parser );
+
+with:
+
+ package MyParser;
+ @ISA = qw( XML::Checker::Parser );
+
+=head1 XML::Checker::Parser constructor
+
+ $parser = new XML::Checker::Parser (SkipExternalDTD => 1, SkipInsignifWS => 1);
+
+The constructor takes the same parameters as L<XML::Parser> with the following additions:
+
+=over 4
+
+=item SkipExternalDTD
+
+By default, it will try to load external DTDs using LWP. You can disable this
+by setting SkipExternalDTD to 1. See L<External DTDs|"External DTDs"> for details.
+
+=item SkipInsignifWS
+
+By default, it will treat insignificant whitespace as regular Char data.
+By setting SkipInsignifWS to 1, the user Char handler will not be called
+if insignificant whitespace is encountered.
+See L<XML::Checker/INSIGNIFICANT_WHITESPACE> for details.
+
+=item LWP_UserAgent
+
+When calling parsefile() with a URL (instead of a filename) or when loading
+external DTDs, we use LWP to download the
+remote file. By default it will use a L<LWP::UserAgent> that is created as follows:
+
+ use LWP::UserAgent;
+ $LWP_USER_AGENT = LWP::UserAgent->new;
+ $LWP_USER_AGENT->env_proxy;
+
+Note that L<env_proxy> reads proxy settings from your environment variables,
+which is what I need to do to get thru our firewall.
+If you want to use a different LWP::UserAgent, you can either set
+it globally with:
+
+ XML::Checker::Parser::set_LWP_UserAgent ($my_agent);
+
+or, you can specify it for a specific XML::Checker::Parser by passing it to
+the constructor:
+
+ my $parser = new XML::Checker::Parser (LWP_UserAgent => $my_agent);
+
+Currently, LWP is used when the filename (passed to parsefile) starts with one of
+the following URL schemes: http, https, ftp, wais, gopher, or file
+(followed by a colon.) If I missed one, please let me know.
+
+The LWP modules are part of libwww-perl which is available at CPAN.
+
+=back
+
+=head1 External DTDs
+
+XML::Checker::Parser will try to load and parse external DTDs that are
+referenced in DOCTYPE definitions unless you set the B<SkipExternalDTD>
+option to 1 (the default setting is 0.)
+See L<CAVEATS|"CAVEATS"> for details on what is not supported by XML::Checker::Parser.
+
+L<XML::Parser> (version 2.27 and up) does a much better job at reading external
+DTDs, because recently external DTD parsing was added to expat.
+Make sure you set the L<XML::Parser> option B<ParseParamEnt> to 1 and the
+XML::Checker::Parser option B<SkipExternalDTD> to 1.
+(They can both be set in the XML::Checker::Parser constructor.)
+
+When external DTDs are parsed by XML::Checker::Parser, they are
+located in the following order:
+
+=over 4
+
+=item *
+
+With the %URI_MAP, which can be set using B<map_uri>.
+This hash maps external resource ids (like system ID's and public ID's)
+to full path URI's.
+It was meant to aid in resolving PUBLIC IDs found in DOCTYPE declarations
+after the PUBLIC keyword, e.g.
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+
+However, you can also use this to force L<XML::Checker> to read DTDs from a
+different URL than was specified (e.g. from the local file system for
+performance reasons.)
+
+=item *
+
+on the Internet, if their system identifier starts with a protocol
+(like http://...)
+
+=item *
+
+on the local disk, if their system identifier starts with a slash
+(absolute path)
+
+=item *
+
+in the SGML_SEARCH_PATH, if their system identifier is a
+relative file name. It will use @SGML_SEARCH_PATH if it was set with
+B<set_sgml_search_path()>, or the colon-separated $ENV{SGML_SEARCH_PATH},
+or (if that isn't set) the list (".", "$ENV{'HOME'}/.sgml", "/usr/lib/sgml",
+"/usr/share/sgml"), which includes the
+current directory, so it should do the right thing in most cases.
+
+=back
+
+=head2 Static methods related to External DTDs
+
+=over 4
+
+=item set_sgml_search_path (dir1, dir2, ...)
+
+External DTDs with relative file paths are looked up using the @SGML_SEARCH_PATH,
+which can be set with this method. If @SGML_SEARCH_PATH is never set, it
+will use the colon-separated $ENV{SGML_SEARCH_PATH} instead. If neither are set
+it uses the list: ".", "$ENV{'HOME'}/.sgml", "/usr/lib/sgml",
+"/usr/share/sgml".
+
+set_sgml_search_path is a static method.
+
+=item map_uri (pubid => uri, ...)
+
+To define the location of PUBLIC ids, as found in DOCTYPE declarations
+after the PUBLIC keyword, e.g.
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+
+call this method, e.g.
+
+ XML::Checker::Parser::map_uri (
+ "-//W3C//DTD HTML 4.0//EN" => "file:/user/html.dtd");
+
+See L<External DTDs|"External DTDs"> for more info.
+
+XML::Checker::Parser::map_uri is a static method.
+
+=back
+
+=head1 Switching user handlers at parse time
+
+You should be able to use setHandlers() just as in L<XML::Parser>.
+(Using setHandlers has not been tested yet.)
+
+=head1 Error handling
+
+XML::Checker::Parser routes the fail handler through
+XML::Checker::Parser::fail_add_context() before calling your fail handler
+(i.e. the global fail handler: $XML::Checker::FAIL.
+See L<XML::Checker/ERROR_HANDLING>.)
+It adds the (line, column, byte) information from L<XML::Parser> to the
+error context (unless it was the end of the XML document.)
+
+=head1 Supported XML::Parser handlers
+
+Only the following L<XML::Parser> handlers are currently routed through
+L<XML::Checker>: Init, Final, Char, Start, End, Element, Attlist, Doctype,
+Unparsed, Notation.
+
+=head1 CAVEATS
+
+When using XML::Checker::Parser to parse external DTDs
+(i.e. with SkipExternalDTD => 0),
+expect trouble when your external DTD contains parameter entities inside
+declarations or conditional sections. The external DTD should probably have
+the same encoding as the orignal XML document.
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+=head1 SEE ALSO
+
+L<XML::Checker> (L<XML::Checker/SEE_ALSO>), L<XML::Parser>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,5065 @@
+################################################################################
+#
+# Perl module: XML::DOM
+#
+# By Enno Derksen <enno@att.com>
+#
+################################################################################
+#
+# To do:
+#
+# * optimize Attr if it only contains 1 Text node to hold the value
+# * fix setDocType!
+#
+# * BUG: setOwnerDocument - does not process default attr values correctly,
+# they still point to the old doc.
+# * change Exception mechanism
+# * maybe: more checking of sysId etc.
+# * NoExpand mode (don't know what else is useful)
+# * various odds and ends: see comments starting with "??"
+# * normalize(1) could also expand CDataSections and EntityReferences
+# * parse a DocumentFragment?
+# * encoding support
+#
+######################################################################
+
+######################################################################
+package XML::DOM;
+######################################################################
+
+use strict;
+use vars qw( $VERSION @ISA @EXPORT
+ $IgnoreReadOnly $SafeMode $TagStyle
+ %DefaultEntities %DecodeDefaultEntity
+ );
+use Carp;
+use XML::RegExp;
+
+BEGIN
+{
+ require XML::Parser;
+ $VERSION = '1.27';
+
+ my $needVersion = '2.23';
+ die "need at least XML::Parser version $needVersion (current=${XML::Parser::VERSION})"
+ unless $XML::Parser::VERSION >= $needVersion;
+
+ @ISA = qw( Exporter );
+
+ # Constants for XML::DOM Node types
+ @EXPORT = qw(
+ UNKNOWN_NODE
+ ELEMENT_NODE
+ ATTRIBUTE_NODE
+ TEXT_NODE
+ CDATA_SECTION_NODE
+ ENTITY_REFERENCE_NODE
+ ENTITY_NODE
+ PROCESSING_INSTRUCTION_NODE
+ COMMENT_NODE
+ DOCUMENT_NODE
+ DOCUMENT_TYPE_NODE
+ DOCUMENT_FRAGMENT_NODE
+ NOTATION_NODE
+ ELEMENT_DECL_NODE
+ ATT_DEF_NODE
+ XML_DECL_NODE
+ ATTLIST_DECL_NODE
+ );
+}
+
+#---- Constant definitions
+
+# Node types
+
+sub UNKNOWN_NODE () { 0 } # not in the DOM Spec
+
+sub ELEMENT_NODE () { 1 }
+sub ATTRIBUTE_NODE () { 2 }
+sub TEXT_NODE () { 3 }
+sub CDATA_SECTION_NODE () { 4 }
+sub ENTITY_REFERENCE_NODE () { 5 }
+sub ENTITY_NODE () { 6 }
+sub PROCESSING_INSTRUCTION_NODE () { 7 }
+sub COMMENT_NODE () { 8 }
+sub DOCUMENT_NODE () { 9 }
+sub DOCUMENT_TYPE_NODE () { 10}
+sub DOCUMENT_FRAGMENT_NODE () { 11}
+sub NOTATION_NODE () { 12}
+
+sub ELEMENT_DECL_NODE () { 13 } # not in the DOM Spec
+sub ATT_DEF_NODE () { 14 } # not in the DOM Spec
+sub XML_DECL_NODE () { 15 } # not in the DOM Spec
+sub ATTLIST_DECL_NODE () { 16 } # not in the DOM Spec
+
+%DefaultEntities =
+(
+ "quot" => '"',
+ "gt" => ">",
+ "lt" => "<",
+ "apos" => "'",
+ "amp" => "&"
+);
+
+%DecodeDefaultEntity =
+(
+ '"' => """,
+ ">" => ">",
+ "<" => "<",
+ "'" => "'",
+ "&" => "&"
+);
+
+#
+# If you don't want DOM warnings to use 'warn', override this method like this:
+#
+# { # start block scope
+# local *XML::DOM::warning = \&my_warn;
+# ... your code here ...
+# } # end block scope (old XML::DOM::warning takes effect again)
+#
+sub warning # static
+{
+ warn @_;
+}
+
+#
+# This method defines several things in the caller's package, so you can use named constants to
+# access the array that holds the member data, i.e. $self->[_Data]. It assumes the caller's package
+# defines a class that is implemented as a blessed array reference.
+# Note that this is very similar to using 'use fields' and 'use base'.
+#
+# E.g. if $fields eq "Name Model", $parent eq "XML::DOM::Node" and
+# XML::DOM::Node had "A B C" as fields and it was called from package "XML::DOM::ElementDecl",
+# then this code would basically do the following:
+#
+# package XML::DOM::ElementDecl;
+#
+# sub _Name () { 3 } # Note that parent class had three fields
+# sub _Model () { 4 }
+#
+# # Maps constant names (without '_') to constant (int) value
+# %HFIELDS = ( %XML::DOM::Node::HFIELDS, Name => _Name, Model => _Model );
+#
+# # Define XML:DOM::ElementDecl as a subclass of XML::DOM::Node
+# @ISA = qw{ XML::DOM::Node };
+#
+# # The following function names can be exported into the user's namespace.
+# @EXPORT_OK = qw{ _Name _Model };
+#
+# # The following function names can be exported into the user's namespace
+# # with: import XML::DOM::ElementDecl qw( :Fields );
+# %EXPORT_TAGS = ( Fields => qw{ _Name _Model } );
+#
+sub def_fields # static
+{
+ my ($fields, $parent) = @_;
+
+ my ($pkg) = caller;
+
+ no strict 'refs';
+
+ my @f = split (/\s+/, $fields);
+ my $n = 0;
+
+ my %hfields;
+ if (defined $parent)
+ {
+ my %pf = %{"$parent\::HFIELDS"};
+ %hfields = %pf;
+
+ $n = scalar (keys %pf);
+ @{"$pkg\::ISA"} = ( $parent );
+ }
+
+ my $i = $n;
+ for (@f)
+ {
+ eval "sub $pkg\::_$_ () { $i }";
+ $hfields{$_} = $i;
+ $i++;
+ }
+ %{"$pkg\::HFIELDS"} = %hfields;
+ @{"$pkg\::EXPORT_OK"} = map { "_$_" } @f;
+
+ ${"$pkg\::EXPORT_TAGS"}{Fields} = [ map { "_$_" } @f ];
+}
+
+# sub blesh
+# {
+# my $hashref = shift;
+# my $class = shift;
+# no strict 'refs';
+# my $self = bless [\%{"$class\::FIELDS"}], $class;
+# if (defined $hashref)
+# {
+# for (keys %$hashref)
+# {
+# $self->{$_} = $hashref->{$_};
+# }
+# }
+# $self;
+# }
+
+# sub blesh2
+# {
+# my $hashref = shift;
+# my $class = shift;
+# no strict 'refs';
+# my $self = bless [\%{"$class\::FIELDS"}], $class;
+# if (defined $hashref)
+# {
+# for (keys %$hashref)
+# {
+# eval { $self->{$_} = $hashref->{$_}; };
+# croak "ERROR in field [$_] $@" if $@;
+# }
+# }
+# $self;
+#}
+
+#
+# CDATA section may not contain "]]>"
+#
+sub encodeCDATA
+{
+ my ($str) = shift;
+ $str =~ s/]]>/]]>/go;
+ $str;
+}
+
+#
+# PI may not contain "?>"
+#
+sub encodeProcessingInstruction
+{
+ my ($str) = shift;
+ $str =~ s/\?>/?>/go;
+ $str;
+}
+
+#
+#?? Not sure if this is right - must prevent double minus somehow...
+#
+sub encodeComment
+{
+ my ($str) = shift;
+ return undef unless defined $str;
+
+ $str =~ s/--/--/go;
+ $str;
+}
+
+#
+# For debugging
+#
+sub toHex
+{
+ my $str = shift;
+ my $len = length($str);
+ my @a = unpack ("C$len", $str);
+ my $s = "";
+ for (@a)
+ {
+ $s .= sprintf ("%02x", $_);
+ }
+ $s;
+}
+
+#
+# 2nd parameter $default: list of Default Entity characters that need to be
+# converted (e.g. "&<" for conversion to "&" and "<" resp.)
+#
+sub encodeText
+{
+ my ($str, $default) = @_;
+ return undef unless defined $str;
+
+ $str =~ s/([\xC0-\xDF].|[\xE0-\xEF]..|[\xF0-\xFF]...)|([$default])|(]]>)/
+ defined($1) ? XmlUtf8Decode ($1) :
+ defined ($2) ? $DecodeDefaultEntity{$2} : "]]>" /egs;
+
+#?? could there be references that should not be expanded?
+# e.g. should not replace &#nn; ¯ and &abc;
+# $str =~ s/&(?!($ReName|#[0-9]+|#x[0-9a-fA-F]+);)/&/go;
+
+ $str;
+}
+
+#
+# Used by AttDef - default value
+#
+sub encodeAttrValue
+{
+ encodeText (shift, '"&<');
+}
+
+#
+# Converts an integer (Unicode - ISO/IEC 10646) to a UTF-8 encoded character
+# sequence.
+# Used when converting e.g. { or Ͽ to a string value.
+#
+# Algorithm borrowed from expat/xmltok.c/XmlUtf8Encode()
+#
+# not checking for bad characters: < 0, x00-x08, x0B-x0C, x0E-x1F, xFFFE-xFFFF
+#
+sub XmlUtf8Encode
+{
+ my $n = shift;
+ if ($n < 0x80)
+ {
+ return chr ($n);
+ }
+ elsif ($n < 0x800)
+ {
+ return pack ("CC", (($n >> 6) | 0xc0), (($n & 0x3f) | 0x80));
+ }
+ elsif ($n < 0x10000)
+ {
+ return pack ("CCC", (($n >> 12) | 0xe0), ((($n >> 6) & 0x3f) | 0x80),
+ (($n & 0x3f) | 0x80));
+ }
+ elsif ($n < 0x110000)
+ {
+ return pack ("CCCC", (($n >> 18) | 0xf0), ((($n >> 12) & 0x3f) | 0x80),
+ ((($n >> 6) & 0x3f) | 0x80), (($n & 0x3f) | 0x80));
+ }
+ croak "number is too large for Unicode [$n] in &XmlUtf8Encode";
+}
+
+#
+# Opposite of XmlUtf8Decode plus it adds prefix "&#" or "&#x" and suffix ";"
+# The 2nd parameter ($hex) indicates whether the result is hex encoded or not.
+#
+sub XmlUtf8Decode
+{
+ my ($str, $hex) = @_;
+ my $len = length ($str);
+ my $n;
+
+ if ($len == 2)
+ {
+ my @n = unpack "C2", $str;
+ $n = (($n[0] & 0x3f) << 6) + ($n[1] & 0x3f);
+ }
+ elsif ($len == 3)
+ {
+ my @n = unpack "C3", $str;
+ $n = (($n[0] & 0x1f) << 12) + (($n[1] & 0x3f) << 6) +
+ ($n[2] & 0x3f);
+ }
+ elsif ($len == 4)
+ {
+ my @n = unpack "C4", $str;
+ $n = (($n[0] & 0x0f) << 18) + (($n[1] & 0x3f) << 12) +
+ (($n[2] & 0x3f) << 6) + ($n[3] & 0x3f);
+ }
+ elsif ($len == 1) # just to be complete...
+ {
+ $n = ord ($str);
+ }
+ else
+ {
+ croak "bad value [$str] for XmlUtf8Decode";
+ }
+ $hex ? sprintf ("&#x%x;", $n) : "&#$n;";
+}
+
+$IgnoreReadOnly = 0;
+$SafeMode = 1;
+
+sub getIgnoreReadOnly
+{
+ $IgnoreReadOnly;
+}
+
+#
+# The global flag $IgnoreReadOnly is set to the specified value and the old
+# value of $IgnoreReadOnly is returned.
+#
+# To temporarily disable read-only related exceptions (i.e. when parsing
+# XML or temporarily), do the following:
+#
+# my $oldIgnore = XML::DOM::ignoreReadOnly (1);
+# ... do whatever you want ...
+# XML::DOM::ignoreReadOnly ($oldIgnore);
+#
+sub ignoreReadOnly
+{
+ my $i = $IgnoreReadOnly;
+ $IgnoreReadOnly = $_[0];
+ return $i;
+}
+
+#
+# XML spec seems to break its own rules... (see ENTITY xmlpio)
+#
+sub forgiving_isValidName
+{
+ $_[0] =~ /^$XML::RegExp::Name$/o;
+}
+
+#
+# Don't allow names starting with xml (either case)
+#
+sub picky_isValidName
+{
+ $_[0] =~ /^$XML::RegExp::Name$/o and $_[0] !~ /^xml/i;
+}
+
+# Be forgiving by default,
+*isValidName = \&forgiving_isValidName;
+
+sub allowReservedNames # static
+{
+ *isValidName = ($_[0] ? \&forgiving_isValidName : \&picky_isValidName);
+}
+
+sub getAllowReservedNames # static
+{
+ *isValidName == \&forgiving_isValidName;
+}
+
+#
+# Always compress empty tags by default
+# This is used by Element::print.
+#
+$TagStyle = sub { 0 };
+
+sub setTagCompression
+{
+ $TagStyle = shift;
+}
+
+######################################################################
+package XML::DOM::PrintToFileHandle;
+######################################################################
+
+#
+# Used by XML::DOM::Node::printToFileHandle
+#
+
+sub new
+{
+ my($class, $fn) = @_;
+ bless $fn, $class;
+}
+
+sub print
+{
+ my ($self, $str) = @_;
+ print $self $str;
+}
+
+######################################################################
+package XML::DOM::PrintToString;
+######################################################################
+
+use vars qw{ $Singleton };
+
+#
+# Used by XML::DOM::Node::toString to concatenate strings
+#
+
+sub new
+{
+ my($class) = @_;
+ my $str = "";
+ bless \$str, $class;
+}
+
+sub print
+{
+ my ($self, $str) = @_;
+ $$self .= $str;
+}
+
+sub toString
+{
+ my $self = shift;
+ $$self;
+}
+
+sub reset
+{
+ ${$_[0]} = "";
+}
+
+$Singleton = new XML::DOM::PrintToString;
+
+######################################################################
+package XML::DOM::DOMImplementation;
+######################################################################
+
+$XML::DOM::DOMImplementation::Singleton =
+ bless \$XML::DOM::DOMImplementation::Singleton, 'XML::DOM::DOMImplementation';
+
+sub hasFeature
+{
+ my ($self, $feature, $version) = @_;
+
+ $feature eq 'XML' and $version eq '1.0';
+}
+
+
+######################################################################
+package XML::XQL::Node; # forward declaration
+######################################################################
+
+######################################################################
+package XML::DOM::Node;
+######################################################################
+
+use vars qw( @NodeNames @EXPORT @ISA %HFIELDS @EXPORT_OK @EXPORT_TAGS );
+
+BEGIN
+{
+ use XML::DOM::DOMException;
+ import Carp;
+
+ require FileHandle;
+
+ @ISA = qw( Exporter XML::XQL::Node );
+
+ # NOTE: SortKey is used in XML::XQL::Node.
+ # UserData is reserved for users (Hang your data here!)
+ XML::DOM::def_fields ("C A Doc Parent ReadOnly UsedIn Hidden SortKey UserData");
+
+ push (@EXPORT, qw(
+ UNKNOWN_NODE
+ ELEMENT_NODE
+ ATTRIBUTE_NODE
+ TEXT_NODE
+ CDATA_SECTION_NODE
+ ENTITY_REFERENCE_NODE
+ ENTITY_NODE
+ PROCESSING_INSTRUCTION_NODE
+ COMMENT_NODE
+ DOCUMENT_NODE
+ DOCUMENT_TYPE_NODE
+ DOCUMENT_FRAGMENT_NODE
+ NOTATION_NODE
+ ELEMENT_DECL_NODE
+ ATT_DEF_NODE
+ XML_DECL_NODE
+ ATTLIST_DECL_NODE
+ ));
+}
+
+#---- Constant definitions
+
+# Node types
+
+sub UNKNOWN_NODE () {0;} # not in the DOM Spec
+
+sub ELEMENT_NODE () {1;}
+sub ATTRIBUTE_NODE () {2;}
+sub TEXT_NODE () {3;}
+sub CDATA_SECTION_NODE () {4;}
+sub ENTITY_REFERENCE_NODE () {5;}
+sub ENTITY_NODE () {6;}
+sub PROCESSING_INSTRUCTION_NODE () {7;}
+sub COMMENT_NODE () {8;}
+sub DOCUMENT_NODE () {9;}
+sub DOCUMENT_TYPE_NODE () {10;}
+sub DOCUMENT_FRAGMENT_NODE () {11;}
+sub NOTATION_NODE () {12;}
+
+sub ELEMENT_DECL_NODE () {13;} # not in the DOM Spec
+sub ATT_DEF_NODE () {14;} # not in the DOM Spec
+sub XML_DECL_NODE () {15;} # not in the DOM Spec
+sub ATTLIST_DECL_NODE () {16;} # not in the DOM Spec
+
+@NodeNames = (
+ "UNKNOWN_NODE", # not in the DOM Spec!
+
+ "ELEMENT_NODE",
+ "ATTRIBUTE_NODE",
+ "TEXT_NODE",
+ "CDATA_SECTION_NODE",
+ "ENTITY_REFERENCE_NODE",
+ "ENTITY_NODE",
+ "PROCESSING_INSTRUCTION_NODE",
+ "COMMENT_NODE",
+ "DOCUMENT_NODE",
+ "DOCUMENT_TYPE_NODE",
+ "DOCUMENT_FRAGMENT_NODE",
+ "NOTATION_NODE",
+
+ "ELEMENT_DECL_NODE",
+ "ATT_DEF_NODE",
+ "XML_DECL_NODE",
+ "ATTLIST_DECL_NODE"
+ );
+
+sub decoupleUsedIn
+{
+ my $self = shift;
+ undef $self->[_UsedIn]; # was delete
+}
+
+sub getParentNode
+{
+ $_[0]->[_Parent];
+}
+
+sub appendChild
+{
+ my ($self, $node) = @_;
+
+ # REC 7473
+ if ($XML::DOM::SafeMode)
+ {
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+ }
+
+ my $doc = $self->[_Doc];
+
+ if ($node->isDocumentFragmentNode)
+ {
+ if ($XML::DOM::SafeMode)
+ {
+ for my $n (@{$node->[_C]})
+ {
+ croak new XML::DOM::DOMException (WRONG_DOCUMENT_ERR,
+ "nodes belong to different documents")
+ if $doc != $n->[_Doc];
+
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "node is ancestor of parent node")
+ if $n->isAncestor ($self);
+
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "bad node type")
+ if $self->rejectChild ($n);
+ }
+ }
+
+ my @list = @{$node->[_C]}; # don't try to compress this
+ for my $n (@list)
+ {
+ $n->setParentNode ($self);
+ }
+ push @{$self->[_C]}, @list;
+ }
+ else
+ {
+ if ($XML::DOM::SafeMode)
+ {
+ croak new XML::DOM::DOMException (WRONG_DOCUMENT_ERR,
+ "nodes belong to different documents")
+ if $doc != $node->[_Doc];
+
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "node is ancestor of parent node")
+ if $node->isAncestor ($self);
+
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "bad node type")
+ if $self->rejectChild ($node);
+ }
+ $node->setParentNode ($self);
+ push @{$self->[_C]}, $node;
+ }
+ $node;
+}
+
+sub getChildNodes
+{
+ # NOTE: if node can't have children, $self->[_C] is undef.
+ my $kids = $_[0]->[_C];
+
+ # Return a list if called in list context.
+ wantarray ? (defined ($kids) ? @{ $kids } : ()) :
+ (defined ($kids) ? $kids : $XML::DOM::NodeList::EMPTY);
+}
+
+sub hasChildNodes
+{
+ my $kids = $_[0]->[_C];
+ defined ($kids) && @$kids > 0;
+}
+
+# This method is overriden in Document
+sub getOwnerDocument
+{
+ $_[0]->[_Doc];
+}
+
+sub getFirstChild
+{
+ my $kids = $_[0]->[_C];
+ defined $kids ? $kids->[0] : undef;
+}
+
+sub getLastChild
+{
+ my $kids = $_[0]->[_C];
+ defined $kids ? $kids->[-1] : undef;
+}
+
+sub getPreviousSibling
+{
+ my $self = shift;
+
+ my $pa = $self->[_Parent];
+ return undef unless $pa;
+ my $index = $pa->getChildIndex ($self);
+ return undef unless $index;
+
+ $pa->getChildAtIndex ($index - 1);
+}
+
+sub getNextSibling
+{
+ my $self = shift;
+
+ my $pa = $self->[_Parent];
+ return undef unless $pa;
+
+ $pa->getChildAtIndex ($pa->getChildIndex ($self) + 1);
+}
+
+sub insertBefore
+{
+ my ($self, $node, $refNode) = @_;
+
+ return $self->appendChild ($node) unless $refNode; # append at the end
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ my @nodes = ($node);
+ @nodes = @{$node->[_C]}
+ if $node->getNodeType == DOCUMENT_FRAGMENT_NODE;
+
+ my $doc = $self->[_Doc];
+
+ for my $n (@nodes)
+ {
+ croak new XML::DOM::DOMException (WRONG_DOCUMENT_ERR,
+ "nodes belong to different documents")
+ if $doc != $n->[_Doc];
+
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "node is ancestor of parent node")
+ if $n->isAncestor ($self);
+
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "bad node type")
+ if $self->rejectChild ($n);
+ }
+ my $index = $self->getChildIndex ($refNode);
+
+ croak new XML::DOM::DOMException (NOT_FOUND_ERR,
+ "reference node not found")
+ if $index == -1;
+
+ for my $n (@nodes)
+ {
+ $n->setParentNode ($self);
+ }
+
+ splice (@{$self->[_C]}, $index, 0, @nodes);
+ $node;
+}
+
+sub replaceChild
+{
+ my ($self, $node, $refNode) = @_;
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ my @nodes = ($node);
+ @nodes = @{$node->[_C]}
+ if $node->getNodeType == DOCUMENT_FRAGMENT_NODE;
+
+ for my $n (@nodes)
+ {
+ croak new XML::DOM::DOMException (WRONG_DOCUMENT_ERR,
+ "nodes belong to different documents")
+ if $self->[_Doc] != $n->[_Doc];
+
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "node is ancestor of parent node")
+ if $n->isAncestor ($self);
+
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "bad node type")
+ if $self->rejectChild ($n);
+ }
+
+ my $index = $self->getChildIndex ($refNode);
+ croak new XML::DOM::DOMException (NOT_FOUND_ERR,
+ "reference node not found")
+ if $index == -1;
+
+ for my $n (@nodes)
+ {
+ $n->setParentNode ($self);
+ }
+ splice (@{$self->[_C]}, $index, 1, @nodes);
+
+ $refNode->removeChildHoodMemories;
+ $refNode;
+}
+
+sub removeChild
+{
+ my ($self, $node) = @_;
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ my $index = $self->getChildIndex ($node);
+
+ croak new XML::DOM::DOMException (NOT_FOUND_ERR,
+ "reference node not found")
+ if $index == -1;
+
+ splice (@{$self->[_C]}, $index, 1, ());
+
+ $node->removeChildHoodMemories;
+ $node;
+}
+
+# Merge all subsequent Text nodes in this subtree
+sub normalize
+{
+ my ($self) = shift;
+ my $prev = undef; # previous Text node
+
+ return unless defined $self->[_C];
+
+ my @nodes = @{$self->[_C]};
+ my $i = 0;
+ my $n = @nodes;
+ while ($i < $n)
+ {
+ my $node = $self->getChildAtIndex($i);
+ my $type = $node->getNodeType;
+
+ if (defined $prev)
+ {
+ # It should not merge CDATASections. Dom Spec says:
+ # Adjacent CDATASections nodes are not merged by use
+ # of the Element.normalize() method.
+ if ($type == TEXT_NODE)
+ {
+ $prev->appendData ($node->getData);
+ $self->removeChild ($node);
+ $i--;
+ $n--;
+ }
+ else
+ {
+ $prev = undef;
+ if ($type == ELEMENT_NODE)
+ {
+ $node->normalize;
+ if (defined $node->[_A])
+ {
+ for my $attr (@{$node->[_A]->getValues})
+ {
+ $attr->normalize;
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ if ($type == TEXT_NODE)
+ {
+ $prev = $node;
+ }
+ elsif ($type == ELEMENT_NODE)
+ {
+ $node->normalize;
+ if (defined $node->[_A])
+ {
+ for my $attr (@{$node->[_A]->getValues})
+ {
+ $attr->normalize;
+ }
+ }
+ }
+ }
+ $i++;
+ }
+}
+
+#
+# Return all Element nodes in the subtree that have the specified tagName.
+# If tagName is "*", all Element nodes are returned.
+# NOTE: the DOM Spec does not specify a 3rd or 4th parameter
+#
+sub getElementsByTagName
+{
+ my ($self, $tagName, $recurse, $list) = @_;
+ $recurse = 1 unless defined $recurse;
+ $list = (wantarray ? [] : new XML::DOM::NodeList) unless defined $list;
+
+ return unless defined $self->[_C];
+
+ # preorder traversal: check parent node first
+ for my $kid (@{$self->[_C]})
+ {
+ if ($kid->isElementNode)
+ {
+ if ($tagName eq "*" || $tagName eq $kid->getTagName)
+ {
+ push @{$list}, $kid;
+ }
+ $kid->getElementsByTagName ($tagName, $recurse, $list) if $recurse;
+ }
+ }
+ wantarray ? @{ $list } : $list;
+}
+
+sub getNodeValue
+{
+ undef;
+}
+
+sub setNodeValue
+{
+ # no-op
+}
+
+#
+# Redefined by XML::DOM::Element
+#
+sub getAttributes
+{
+ undef;
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub setOwnerDocument
+{
+ my ($self, $doc) = @_;
+ $self->[_Doc] = $doc;
+
+ return unless defined $self->[_C];
+
+ for my $kid (@{$self->[_C]})
+ {
+ $kid->setOwnerDocument ($doc);
+ }
+}
+
+sub cloneChildren
+{
+ my ($self, $node, $deep) = @_;
+ return unless $deep;
+
+ return unless defined $self->[_C];
+
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ for my $kid (@{$node->[_C]})
+ {
+ my $newNode = $kid->cloneNode ($deep);
+ push @{$self->[_C]}, $newNode;
+ $newNode->setParentNode ($self);
+ }
+}
+
+#
+# For internal use only!
+#
+sub removeChildHoodMemories
+{
+ my ($self) = @_;
+
+ undef $self->[_Parent]; # was delete
+}
+
+#
+# Remove circular dependencies. The Node and its children should
+# not be used afterwards.
+#
+sub dispose
+{
+ my $self = shift;
+
+ $self->removeChildHoodMemories;
+
+ if (defined $self->[_C])
+ {
+ $self->[_C]->dispose;
+ undef $self->[_C]; # was delete
+ }
+ undef $self->[_Doc]; # was delete
+}
+
+#
+# For internal use only!
+#
+sub setParentNode
+{
+ my ($self, $parent) = @_;
+
+ # REC 7473
+ my $oldParent = $self->[_Parent];
+ if (defined $oldParent)
+ {
+ # remove from current parent
+ my $index = $oldParent->getChildIndex ($self);
+
+ # NOTE: we don't have to check if [_C] is defined,
+ # because were removing a child here!
+ splice (@{$oldParent->[_C]}, $index, 1, ());
+
+ $self->removeChildHoodMemories;
+ }
+ $self->[_Parent] = $parent;
+}
+
+#
+# This function can return 3 values:
+# 1: always readOnly
+# 0: never readOnly
+# undef: depends on parent node
+#
+# Returns 1 for DocumentType, Notation, Entity, EntityReference, Attlist,
+# ElementDecl, AttDef.
+# The first 4 are readOnly according to the DOM Spec, the others are always
+# children of DocumentType. (Naturally, children of a readOnly node have to be
+# readOnly as well...)
+# These nodes are always readOnly regardless of who their ancestors are.
+# Other nodes, e.g. Comment, are readOnly only if their parent is readOnly,
+# which basically means that one of its ancestors has to be one of the
+# aforementioned node types.
+# Document and DocumentFragment return 0 for obvious reasons.
+# Attr, Element, CDATASection, Text return 0. The DOM spec says that they can
+# be children of an Entity, but I don't think that that's possible
+# with the current XML::Parser.
+# Attr uses a {ReadOnly} property, which is only set if it's part of a AttDef.
+# Always returns 0 if ignoreReadOnly is set.
+#
+sub isReadOnly
+{
+ # default implementation for Nodes that are always readOnly
+ ! $XML::DOM::IgnoreReadOnly;
+}
+
+sub rejectChild
+{
+ 1;
+}
+
+sub getNodeTypeName
+{
+ $NodeNames[$_[0]->getNodeType];
+}
+
+sub getChildIndex
+{
+ my ($self, $node) = @_;
+ my $i = 0;
+
+ return -1 unless defined $self->[_C];
+
+ for my $kid (@{$self->[_C]})
+ {
+ return $i if $kid == $node;
+ $i++;
+ }
+ -1;
+}
+
+sub getChildAtIndex
+{
+ my $kids = $_[0]->[_C];
+ defined ($kids) ? $kids->[$_[1]] : undef;
+}
+
+sub isAncestor
+{
+ my ($self, $node) = @_;
+
+ do
+ {
+ return 1 if $self == $node;
+ $node = $node->[_Parent];
+ }
+ while (defined $node);
+
+ 0;
+}
+
+#
+# Added for optimization. Overriden in XML::DOM::Text
+#
+sub isTextNode
+{
+ 0;
+}
+
+#
+# Added for optimization. Overriden in XML::DOM::DocumentFragment
+#
+sub isDocumentFragmentNode
+{
+ 0;
+}
+
+#
+# Added for optimization. Overriden in XML::DOM::Element
+#
+sub isElementNode
+{
+ 0;
+}
+
+#
+# Add a Text node with the specified value or append the text to the
+# previous Node if it is a Text node.
+#
+sub addText
+{
+ # REC 9456 (if it was called)
+ my ($self, $str) = @_;
+
+ my $node = ${$self->[_C]}[-1]; # $self->getLastChild
+
+ if (defined ($node) && $node->isTextNode)
+ {
+ # REC 5475 (if it was called)
+ $node->appendData ($str);
+ }
+ else
+ {
+ $node = $self->[_Doc]->createTextNode ($str);
+ $self->appendChild ($node);
+ }
+ $node;
+}
+
+#
+# Add a CDATASection node with the specified value or append the text to the
+# previous Node if it is a CDATASection node.
+#
+sub addCDATA
+{
+ my ($self, $str) = @_;
+
+ my $node = ${$self->[_C]}[-1]; # $self->getLastChild
+
+ if (defined ($node) && $node->getNodeType == CDATA_SECTION_NODE)
+ {
+ $node->appendData ($str);
+ }
+ else
+ {
+ $node = $self->[_Doc]->createCDATASection ($str);
+ $self->appendChild ($node);
+ }
+ $node;
+}
+
+sub removeChildNodes
+{
+ my $self = shift;
+
+ my $cref = $self->[_C];
+ return unless defined $cref;
+
+ my $kid;
+ while ($kid = pop @{$cref})
+ {
+ undef $kid->[_Parent]; # was delete
+ }
+}
+
+sub toString
+{
+ my $self = shift;
+ my $pr = $XML::DOM::PrintToString::Singleton;
+ $pr->reset;
+ $self->print ($pr);
+ $pr->toString;
+}
+
+sub to_sax
+{
+ my $self = shift;
+ unshift @_, 'Handler' if (@_ == 1);
+ my %h = @_;
+
+ my $doch = exists ($h{DocumentHandler}) ? $h{DocumentHandler}
+ : $h{Handler};
+ my $dtdh = exists ($h{DTDHandler}) ? $h{DTDHandler}
+ : $h{Handler};
+ my $enth = exists ($h{EntityResolver}) ? $h{EntityResolver}
+ : $h{Handler};
+
+ $self->_to_sax ($doch, $dtdh, $enth);
+}
+
+sub printToFile
+{
+ my ($self, $fileName) = @_;
+ my $fh = new FileHandle ($fileName, "w") ||
+ croak "printToFile - can't open output file $fileName";
+
+ $self->print ($fh);
+ $fh->close;
+}
+
+#
+# Use print to print to a FileHandle object (see printToFile code)
+#
+sub printToFileHandle
+{
+ my ($self, $FH) = @_;
+ my $pr = new XML::DOM::PrintToFileHandle ($FH);
+ $self->print ($pr);
+}
+
+#
+# Used by AttDef::setDefault to convert unexpanded default attribute value
+#
+sub expandEntityRefs
+{
+ my ($self, $str) = @_;
+ my $doctype = $self->[_Doc]->getDoctype;
+
+ $str =~ s/&($XML::RegExp::Name|(#([0-9]+)|#x([0-9a-fA-F]+)));/
+ defined($2) ? XML::DOM::XmlUtf8Encode ($3 || hex ($4))
+ : expandEntityRef ($1, $doctype)/ego;
+ $str;
+}
+
+sub expandEntityRef
+{
+ my ($entity, $doctype) = @_;
+
+ my $expanded = $XML::DOM::DefaultEntities{$entity};
+ return $expanded if defined $expanded;
+
+ $expanded = $doctype->getEntity ($entity);
+ return $expanded->getValue if (defined $expanded);
+
+#?? is this an error?
+ croak "Could not expand entity reference of [$entity]\n";
+# return "&$entity;"; # entity not found
+}
+
+sub isHidden
+{
+ $_[0]->[_Hidden];
+}
+
+######################################################################
+package XML::DOM::Attr;
+######################################################################
+
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("Name Specified", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+sub new
+{
+ my ($class, $doc, $name, $value, $specified) = @_;
+
+ if ($XML::DOM::SafeMode)
+ {
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Attr name [$name]")
+ unless XML::DOM::isValidName ($name);
+ }
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_C] = new XML::DOM::NodeList;
+ $self->[_Name] = $name;
+
+ if (defined $value)
+ {
+ $self->setValue ($value);
+ $self->[_Specified] = (defined $specified) ? $specified : 1;
+ }
+ else
+ {
+ $self->[_Specified] = 0;
+ }
+ $self;
+}
+
+sub getNodeType
+{
+ ATTRIBUTE_NODE;
+}
+
+sub isSpecified
+{
+ $_[0]->[_Specified];
+}
+
+sub getName
+{
+ $_[0]->[_Name];
+}
+
+sub getValue
+{
+ my $self = shift;
+ my $value = "";
+
+ for my $kid (@{$self->[_C]})
+ {
+ $value .= $kid->getData;
+ }
+ $value;
+}
+
+sub setValue
+{
+ my ($self, $value) = @_;
+
+ # REC 1147
+ $self->removeChildNodes;
+ $self->appendChild ($self->[_Doc]->createTextNode ($value));
+ $self->[_Specified] = 1;
+}
+
+sub getNodeName
+{
+ $_[0]->getName;
+}
+
+sub getNodeValue
+{
+ $_[0]->getValue;
+}
+
+sub setNodeValue
+{
+ $_[0]->setValue ($_[1]);
+}
+
+sub cloneNode
+{
+ my ($self) = @_; # parameter deep is ignored
+
+ my $node = $self->[_Doc]->createAttribute ($self->getName);
+ $node->[_Specified] = $self->[_Specified];
+ $node->[_ReadOnly] = 1 if $self->[_ReadOnly];
+
+ $node->cloneChildren ($self, 1);
+ $node;
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+#
+
+sub isReadOnly
+{
+ # ReadOnly property is set if it's part of a AttDef
+ ! $XML::DOM::IgnoreReadOnly && defined ($_[0]->[_ReadOnly]);
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $name = $self->[_Name];
+
+ $FILE->print ("$name=\"");
+ for my $kid (@{$self->[_C]})
+ {
+ if ($kid->getNodeType == TEXT_NODE)
+ {
+ $FILE->print (XML::DOM::encodeAttrValue ($kid->getData));
+ }
+ else # ENTITY_REFERENCE_NODE
+ {
+ $kid->print ($FILE);
+ }
+ }
+ $FILE->print ("\"");
+}
+
+sub rejectChild
+{
+ my $t = $_[1]->getNodeType;
+
+ $t != TEXT_NODE
+ && $t != ENTITY_REFERENCE_NODE;
+}
+
+######################################################################
+package XML::DOM::ProcessingInstruction;
+######################################################################
+
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("Target Data", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+sub new
+{
+ my ($class, $doc, $target, $data, $hidden) = @_;
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad ProcessingInstruction Target [$target]")
+ unless (XML::DOM::isValidName ($target) && $target !~ /^xml$/io);
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_Target] = $target;
+ $self->[_Data] = $data;
+ $self->[_Hidden] = $hidden;
+ $self;
+}
+
+sub getNodeType
+{
+ PROCESSING_INSTRUCTION_NODE;
+}
+
+sub getTarget
+{
+ $_[0]->[_Target];
+}
+
+sub getData
+{
+ $_[0]->[_Data];
+}
+
+sub setData
+{
+ my ($self, $data) = @_;
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ $self->[_Data] = $data;
+}
+
+sub getNodeName
+{
+ $_[0]->[_Target];
+}
+
+#
+# Same as getData
+#
+sub getNodeValue
+{
+ $_[0]->[_Data];
+}
+
+sub setNodeValue
+{
+ $_[0]->setData ($_[1]);
+}
+
+sub cloneNode
+{
+ my $self = shift;
+ $self->[_Doc]->createProcessingInstruction ($self->getTarget,
+ $self->getData,
+ $self->isHidden);
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub isReadOnly
+{
+ return 0 if $XML::DOM::IgnoreReadOnly;
+
+ my $pa = $_[0]->[_Parent];
+ defined ($pa) ? $pa->isReadOnly : 0;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ $FILE->print ("<?");
+ $FILE->print ($self->[_Target]);
+ $FILE->print (" ");
+ $FILE->print (XML::DOM::encodeProcessingInstruction ($self->[_Data]));
+ $FILE->print ("?>");
+}
+
+######################################################################
+package XML::DOM::Notation;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("Name Base SysId PubId", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+sub new
+{
+ my ($class, $doc, $name, $base, $sysId, $pubId, $hidden) = @_;
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Notation Name [$name]")
+ unless XML::DOM::isValidName ($name);
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_Name] = $name;
+ $self->[_Base] = $base;
+ $self->[_SysId] = $sysId;
+ $self->[_PubId] = $pubId;
+ $self->[_Hidden] = $hidden;
+ $self;
+}
+
+sub getNodeType
+{
+ NOTATION_NODE;
+}
+
+sub getPubId
+{
+ $_[0]->[_PubId];
+}
+
+sub setPubId
+{
+ $_[0]->[_PubId] = $_[1];
+}
+
+sub getSysId
+{
+ $_[0]->[_SysId];
+}
+
+sub setSysId
+{
+ $_[0]->[_SysId] = $_[1];
+}
+
+sub getName
+{
+ $_[0]->[_Name];
+}
+
+sub setName
+{
+ $_[0]->[_Name] = $_[1];
+}
+
+sub getBase
+{
+ $_[0]->[_Base];
+}
+
+sub getNodeName
+{
+ $_[0]->[_Name];
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $name = $self->[_Name];
+ my $sysId = $self->[_SysId];
+ my $pubId = $self->[_PubId];
+
+ $FILE->print ("<!NOTATION $name ");
+
+ if (defined $pubId)
+ {
+ $FILE->print (" PUBLIC \"$pubId\"");
+ }
+ if (defined $sysId)
+ {
+ $FILE->print (" SYSTEM \"$sysId\"");
+ }
+ $FILE->print (">");
+}
+
+sub cloneNode
+{
+ my ($self) = @_;
+ $self->[_Doc]->createNotation ($self->[_Name], $self->[_Base],
+ $self->[_SysId], $self->[_PubId],
+ $self->[_Hidden]);
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+ $iter->Notation ($self->getName, $self->getBase,
+ $self->getSysId, $self->getPubId);
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+ $dtdh->notation_decl ( { Name => $self->getName,
+ Base => $self->getBase,
+ SystemId => $self->getSysId,
+ PublicId => $self->getPubId });
+}
+
+######################################################################
+package XML::DOM::Entity;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("NotationName Parameter Value Ndata SysId PubId", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+sub new
+{
+ my ($class, $doc, $par, $notationName, $value, $sysId, $pubId, $ndata, $hidden) = @_;
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Entity Name [$notationName]")
+ unless XML::DOM::isValidName ($notationName);
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_NotationName] = $notationName;
+ $self->[_Parameter] = $par;
+ $self->[_Value] = $value;
+ $self->[_Ndata] = $ndata;
+ $self->[_SysId] = $sysId;
+ $self->[_PubId] = $pubId;
+ $self->[_Hidden] = $hidden;
+ $self;
+#?? maybe Value should be a Text node
+}
+
+sub getNodeType
+{
+ ENTITY_NODE;
+}
+
+sub getPubId
+{
+ $_[0]->[_PubId];
+}
+
+sub getSysId
+{
+ $_[0]->[_SysId];
+}
+
+# Dom Spec says:
+# For unparsed entities, the name of the notation for the
+# entity. For parsed entities, this is null.
+
+#?? do we have unparsed entities?
+sub getNotationName
+{
+ $_[0]->[_NotationName];
+}
+
+sub getNodeName
+{
+ $_[0]->[_NotationName];
+}
+
+sub cloneNode
+{
+ my $self = shift;
+ $self->[_Doc]->createEntity ($self->[_Parameter],
+ $self->[_NotationName], $self->[_Value],
+ $self->[_SysId], $self->[_PubId],
+ $self->[_Ndata], $self->[_Hidden]);
+}
+
+sub rejectChild
+{
+ return 1;
+#?? if value is split over subnodes, recode this section
+# also add: C => new XML::DOM::NodeList,
+
+ my $t = $_[1];
+
+ return $t == TEXT_NODE
+ || $t == ENTITY_REFERENCE_NODE
+ || $t == PROCESSING_INSTRUCTION_NODE
+ || $t == COMMENT_NODE
+ || $t == CDATA_SECTION_NODE
+ || $t == ELEMENT_NODE;
+}
+
+sub getValue
+{
+ $_[0]->[_Value];
+}
+
+sub isParameterEntity
+{
+ $_[0]->[_Parameter];
+}
+
+sub getNdata
+{
+ $_[0]->[_Ndata];
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $name = $self->[_NotationName];
+
+ my $par = $self->isParameterEntity ? "% " : "";
+
+ $FILE->print ("<!ENTITY $par$name");
+
+ my $value = $self->[_Value];
+ my $sysId = $self->[_SysId];
+ my $pubId = $self->[_PubId];
+ my $ndata = $self->[_Ndata];
+
+ if (defined $value)
+ {
+#?? Not sure what to do if it contains both single and double quote
+ $value = ($value =~ /\"/) ? "'$value'" : "\"$value\"";
+ $FILE->print (" $value");
+ }
+ if (defined $pubId)
+ {
+ $FILE->print (" PUBLIC \"$pubId\"");
+ }
+ elsif (defined $sysId)
+ {
+ $FILE->print (" SYSTEM");
+ }
+
+ if (defined $sysId)
+ {
+ $FILE->print (" \"$sysId\"");
+ }
+ $FILE->print (" NDATA $ndata") if defined $ndata;
+ $FILE->print (">");
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+ my $name = ($self->isParameterEntity ? '%' : "") . $self->getNotationName;
+ $iter->Entity ($name,
+ $self->getValue, $self->getSysId, $self->getPubId,
+ $self->getNdata);
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+ my $name = ($self->isParameterEntity ? '%' : "") . $self->getNotationName;
+ $dtdh->entity_decl ( { Name => $name,
+ Value => $self->getValue,
+ SystemId => $self->getSysId,
+ PublicId => $self->getPubId,
+ Notation => $self->getNdata } );
+}
+
+######################################################################
+package XML::DOM::EntityReference;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("EntityName Parameter", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+sub new
+{
+ my ($class, $doc, $name, $parameter) = @_;
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Entity Name [$name] in EntityReference")
+ unless XML::DOM::isValidName ($name);
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_EntityName] = $name;
+ $self->[_Parameter] = ($parameter || 0);
+ $self;
+}
+
+sub getNodeType
+{
+ ENTITY_REFERENCE_NODE;
+}
+
+sub getNodeName
+{
+ $_[0]->[_EntityName];
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub getEntityName
+{
+ $_[0]->[_EntityName];
+}
+
+sub isParameterEntity
+{
+ $_[0]->[_Parameter];
+}
+
+sub getData
+{
+ my $self = shift;
+ my $name = $self->[_EntityName];
+ my $parameter = $self->[_Parameter];
+
+ my $data = $self->[_Doc]->expandEntity ($name, $parameter);
+
+ unless (defined $data)
+ {
+#?? this is probably an error
+ my $pc = $parameter ? "%" : "&";
+ $data = "$pc$name;";
+ }
+ $data;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $name = $self->[_EntityName];
+
+#?? or do we expand the entities?
+
+ my $pc = $self->[_Parameter] ? "%" : "&";
+ $FILE->print ("$pc$name;");
+}
+
+# Dom Spec says:
+# [...] but if such an Entity exists, then
+# the child list of the EntityReference node is the same as that of the
+# Entity node.
+#
+# The resolution of the children of the EntityReference (the replacement
+# value of the referenced Entity) may be lazily evaluated; actions by the
+# user (such as calling the childNodes method on the EntityReference
+# node) are assumed to trigger the evaluation.
+sub getChildNodes
+{
+ my $self = shift;
+ my $entity = $self->[_Doc]->getEntity ($self->[_EntityName]);
+ defined ($entity) ? $entity->getChildNodes : new XML::DOM::NodeList;
+}
+
+sub cloneNode
+{
+ my $self = shift;
+ $self->[_Doc]->createEntityReference ($self->[_EntityName],
+ $self->[_Parameter]);
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+ $iter->EntityRef ($self->getEntityName, $self->isParameterEntity);
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+ my @par = $self->isParameterEntity ? (Parameter => 1) : ();
+#?? not supported by PerlSAX: $self->isParameterEntity
+
+ $doch->entity_reference ( { Name => $self->getEntityName, @par } );
+}
+
+# NOTE: an EntityReference can't really have children, so rejectChild
+# is not reimplemented (i.e. it always returns 0.)
+
+######################################################################
+package XML::DOM::AttDef;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("Name Type Fixed Default Required Implied Quote", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+#------------------------------------------------------------
+# Extra method implementations
+
+# AttDef is not part of DOM Spec
+sub new
+{
+ my ($class, $doc, $name, $attrType, $default, $fixed, $hidden) = @_;
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Attr name in AttDef [$name]")
+ unless XML::DOM::isValidName ($name);
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_Name] = $name;
+ $self->[_Type] = $attrType;
+
+ if (defined $default)
+ {
+ if ($default eq "#REQUIRED")
+ {
+ $self->[_Required] = 1;
+ }
+ elsif ($default eq "#IMPLIED")
+ {
+ $self->[_Implied] = 1;
+ }
+ else
+ {
+ # strip off quotes - see Attlist handler in XML::Parser
+ $default =~ m#^(["'])(.*)['"]$#;
+
+ $self->[_Quote] = $1; # keep track of the quote character
+ $self->[_Default] = $self->setDefault ($2);
+
+#?? should default value be decoded - what if it contains e.g. "&"
+ }
+ }
+ $self->[_Fixed] = $fixed if defined $fixed;
+ $self->[_Hidden] = $hidden if defined $hidden;
+
+ $self;
+}
+
+sub getNodeType
+{
+ ATT_DEF_NODE;
+}
+
+sub getName
+{
+ $_[0]->[_Name];
+}
+
+# So it can be added to a NamedNodeMap
+sub getNodeName
+{
+ $_[0]->[_Name];
+}
+
+sub getType
+{
+ $_[0]->[_Type];
+}
+
+sub setType
+{
+ $_[0]->[_Type] = $_[1];
+}
+
+sub getDefault
+{
+ $_[0]->[_Default];
+}
+
+sub setDefault
+{
+ my ($self, $value) = @_;
+
+ # specified=0, it's the default !
+ my $attr = $self->[_Doc]->createAttribute ($self->[_Name], undef, 0);
+ $attr->[_ReadOnly] = 1;
+
+#?? this should be split over Text and EntityReference nodes, just like other
+# Attr nodes - just expand the text for now
+ $value = $self->expandEntityRefs ($value);
+ $attr->addText ($value);
+#?? reimplement in NoExpand mode!
+
+ $attr;
+}
+
+sub isFixed
+{
+ $_[0]->[_Fixed] || 0;
+}
+
+sub isRequired
+{
+ $_[0]->[_Required] || 0;
+}
+
+sub isImplied
+{
+ $_[0]->[_Implied] || 0;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $name = $self->[_Name];
+ my $type = $self->[_Type];
+ my $fixed = $self->[_Fixed];
+ my $default = $self->[_Default];
+
+ $FILE->print ("$name $type");
+ $FILE->print (" #FIXED") if defined $fixed;
+
+ if ($self->[_Required])
+ {
+ $FILE->print (" #REQUIRED");
+ }
+ elsif ($self->[_Implied])
+ {
+ $FILE->print (" #IMPLIED");
+ }
+ elsif (defined ($default))
+ {
+ my $quote = $self->[_Quote];
+ $FILE->print (" $quote");
+ for my $kid (@{$default->[_C]})
+ {
+ $kid->print ($FILE);
+ }
+ $FILE->print ($quote);
+ }
+}
+
+sub getDefaultString
+{
+ my $self = shift;
+ my $default;
+
+ if ($self->[_Required])
+ {
+ return "#REQUIRED";
+ }
+ elsif ($self->[_Implied])
+ {
+ return "#IMPLIED";
+ }
+ elsif (defined ($default = $self->[_Default]))
+ {
+ my $quote = $self->[_Quote];
+ $default = $default->toString;
+ return "$quote$default$quote";
+ }
+ undef;
+}
+
+sub cloneNode
+{
+ my $self = shift;
+ my $node = new XML::DOM::AttDef ($self->[_Doc], $self->[_Name], $self->[_Type],
+ undef, $self->[_Fixed]);
+
+ $node->[_Required] = 1 if $self->[_Required];
+ $node->[_Implied] = 1 if $self->[_Implied];
+ $node->[_Fixed] = $self->[_Fixed] if defined $self->[_Fixed];
+ $node->[_Hidden] = $self->[_Hidden] if defined $self->[_Hidden];
+
+ if (defined $self->[_Default])
+ {
+ $node->[_Default] = $self->[_Default]->cloneNode(1);
+ }
+ $node->[_Quote] = $self->[_Quote];
+
+ $node;
+}
+
+sub setOwnerDocument
+{
+ my ($self, $doc) = @_;
+ $self->SUPER::setOwnerDocument ($doc);
+
+ if (defined $self->[_Default])
+ {
+ $self->[_Default]->setOwnerDocument ($doc);
+ }
+}
+
+######################################################################
+package XML::DOM::AttlistDecl;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ import XML::DOM::AttDef qw{ :Fields };
+
+ XML::DOM::def_fields ("ElementName", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+#------------------------------------------------------------
+# Extra method implementations
+
+# AttlistDecl is not part of the DOM Spec
+sub new
+{
+ my ($class, $doc, $name) = @_;
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Element TagName [$name] in AttlistDecl")
+ unless XML::DOM::isValidName ($name);
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_C] = new XML::DOM::NodeList;
+ $self->[_ReadOnly] = 1;
+ $self->[_ElementName] = $name;
+
+ $self->[_A] = new XML::DOM::NamedNodeMap (Doc => $doc,
+ ReadOnly => 1,
+ Parent => $self);
+
+ $self;
+}
+
+sub getNodeType
+{
+ ATTLIST_DECL_NODE;
+}
+
+sub getName
+{
+ $_[0]->[_ElementName];
+}
+
+sub getNodeName
+{
+ $_[0]->[_ElementName];
+}
+
+sub getAttDef
+{
+ my ($self, $attrName) = @_;
+ $self->[_A]->getNamedItem ($attrName);
+}
+
+sub addAttDef
+{
+ my ($self, $attrName, $type, $default, $fixed, $hidden) = @_;
+ my $node = $self->getAttDef ($attrName);
+
+ if (defined $node)
+ {
+ # data will be ignored if already defined
+ my $elemName = $self->getName;
+ XML::DOM::warning ("multiple definitions of attribute $attrName for element $elemName, only first one is recognized");
+ }
+ else
+ {
+ $node = new XML::DOM::AttDef ($self->[_Doc], $attrName, $type,
+ $default, $fixed, $hidden);
+ $self->[_A]->setNamedItem ($node);
+ }
+ $node;
+}
+
+sub getDefaultAttrValue
+{
+ my ($self, $attr) = @_;
+ my $attrNode = $self->getAttDef ($attr);
+ (defined $attrNode) ? $attrNode->getDefault : undef;
+}
+
+sub cloneNode
+{
+ my ($self, $deep) = @_;
+ my $node = $self->[_Doc]->createAttlistDecl ($self->[_ElementName]);
+
+ $node->[_A] = $self->[_A]->cloneNode ($deep);
+ $node;
+}
+
+sub setOwnerDocument
+{
+ my ($self, $doc) = @_;
+ $self->SUPER::setOwnerDocument ($doc);
+
+ $self->[_A]->setOwnerDocument ($doc);
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $name = $self->getName;
+ my @attlist = @{$self->[_A]->getValues};
+
+ my $hidden = 1;
+ for my $att (@attlist)
+ {
+ unless ($att->[_Hidden])
+ {
+ $hidden = 0;
+ last;
+ }
+ }
+
+ unless ($hidden)
+ {
+ $FILE->print ("<!ATTLIST $name");
+
+ if (@attlist == 1)
+ {
+ $FILE->print (" ");
+ $attlist[0]->print ($FILE);
+ }
+ else
+ {
+ for my $attr (@attlist)
+ {
+ next if $attr->[_Hidden];
+
+ $FILE->print ("\x0A ");
+ $attr->print ($FILE);
+ }
+ }
+ $FILE->print (">");
+ }
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+ my $tag = $self->getName;
+ for my $a ($self->[_A]->getValues)
+ {
+ my $default = $a->isImplied ? '#IMPLIED' :
+ ($a->isRequired ? '#REQUIRED' :
+ ($a->[_Quote] . $a->getDefault->getValue . $a->[_Quote]));
+
+ $iter->Attlist ($tag, $a->getName, $a->getType, $default, $a->isFixed);
+ }
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+ my $tag = $self->getName;
+ for my $a ($self->[_A]->getValues)
+ {
+ my $default = $a->isImplied ? '#IMPLIED' :
+ ($a->isRequired ? '#REQUIRED' :
+ ($a->[_Quote] . $a->getDefault->getValue . $a->[_Quote]));
+
+ $dtdh->attlist_decl ({ ElementName => $tag,
+ AttributeName => $a->getName,
+ Type => $a->[_Type],
+ Default => $default,
+ Fixed => $a->isFixed });
+ }
+}
+
+######################################################################
+package XML::DOM::ElementDecl;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("Name Model", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+
+#------------------------------------------------------------
+# Extra method implementations
+
+# ElementDecl is not part of the DOM Spec
+sub new
+{
+ my ($class, $doc, $name, $model, $hidden) = @_;
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Element TagName [$name] in ElementDecl")
+ unless XML::DOM::isValidName ($name);
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_Name] = $name;
+ $self->[_ReadOnly] = 1;
+ $self->[_Model] = $model;
+ $self->[_Hidden] = $hidden;
+ $self;
+}
+
+sub getNodeType
+{
+ ELEMENT_DECL_NODE;
+}
+
+sub getName
+{
+ $_[0]->[_Name];
+}
+
+sub getNodeName
+{
+ $_[0]->[_Name];
+}
+
+sub getModel
+{
+ $_[0]->[_Model];
+}
+
+sub setModel
+{
+ my ($self, $model) = @_;
+
+ $self->[_Model] = $model;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $name = $self->[_Name];
+ my $model = $self->[_Model];
+
+ $FILE->print ("<!ELEMENT $name $model>")
+ unless $self->[_Hidden];
+}
+
+sub cloneNode
+{
+ my $self = shift;
+ $self->[_Doc]->createElementDecl ($self->[_Name], $self->[_Model],
+ $self->[_Hidden]);
+}
+
+sub to_expat
+{
+#?? add support for Hidden?? (allover, also in _to_sax!!)
+
+ my ($self, $iter) = @_;
+ $iter->Element ($self->getName, $self->getModel);
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+ $dtdh->element_decl ( { Name => $self->getName,
+ Model => $self->getModel } );
+}
+
+######################################################################
+package XML::DOM::Element;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("TagName", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use XML::DOM::NamedNodeMap;
+use Carp;
+
+sub new
+{
+ my ($class, $doc, $tagName) = @_;
+
+ if ($XML::DOM::SafeMode)
+ {
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Element TagName [$tagName]")
+ unless XML::DOM::isValidName ($tagName);
+ }
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_C] = new XML::DOM::NodeList;
+ $self->[_TagName] = $tagName;
+
+# Now we're creating the NamedNodeMap only when needed (REC 2313 => 1147)
+# $self->[_A] = new XML::DOM::NamedNodeMap (Doc => $doc,
+# Parent => $self);
+
+ $self;
+}
+
+sub getNodeType
+{
+ ELEMENT_NODE;
+}
+
+sub getTagName
+{
+ $_[0]->[_TagName];
+}
+
+sub getNodeName
+{
+ $_[0]->[_TagName];
+}
+
+sub getAttributeNode
+{
+ my ($self, $name) = @_;
+ return undef unless defined $self->[_A];
+
+ $self->getAttributes->{$name};
+}
+
+sub getAttribute
+{
+ my ($self, $name) = @_;
+ my $attr = $self->getAttributeNode ($name);
+ (defined $attr) ? $attr->getValue : "";
+}
+
+sub setAttribute
+{
+ my ($self, $name, $val) = @_;
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Attr Name [$name]")
+ unless XML::DOM::isValidName ($name);
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ my $node = $self->getAttributes->{$name};
+ if (defined $node)
+ {
+ $node->setValue ($val);
+ }
+ else
+ {
+ $node = $self->[_Doc]->createAttribute ($name, $val);
+ $self->[_A]->setNamedItem ($node);
+ }
+}
+
+sub setAttributeNode
+{
+ my ($self, $node) = @_;
+ my $attr = $self->getAttributes;
+ my $name = $node->getNodeName;
+
+ # REC 1147
+ if ($XML::DOM::SafeMode)
+ {
+ croak new XML::DOM::DOMException (WRONG_DOCUMENT_ERR,
+ "nodes belong to different documents")
+ if $self->[_Doc] != $node->[_Doc];
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ my $attrParent = $node->[_UsedIn];
+ croak new XML::DOM::DOMException (INUSE_ATTRIBUTE_ERR,
+ "Attr is already used by another Element")
+ if (defined ($attrParent) && $attrParent != $attr);
+ }
+
+ my $other = $attr->{$name};
+ $attr->removeNamedItem ($name) if defined $other;
+
+ $attr->setNamedItem ($node);
+
+ $other;
+}
+
+sub removeAttributeNode
+{
+ my ($self, $node) = @_;
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ my $attr = $self->[_A];
+ unless (defined $attr)
+ {
+ croak new XML::DOM::DOMException (NOT_FOUND_ERR);
+ return undef;
+ }
+
+ my $name = $node->getNodeName;
+ my $attrNode = $attr->getNamedItem ($name);
+
+#?? should it croak if it's the default value?
+ croak new XML::DOM::DOMException (NOT_FOUND_ERR)
+ unless $node == $attrNode;
+
+ # Not removing anything if it's the default value already
+ return undef unless $node->isSpecified;
+
+ $attr->removeNamedItem ($name);
+
+ # Substitute with default value if it's defined
+ my $default = $self->getDefaultAttrValue ($name);
+ if (defined $default)
+ {
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ $default = $default->cloneNode (1);
+ $attr->setNamedItem ($default);
+ }
+ $node;
+}
+
+sub removeAttribute
+{
+ my ($self, $name) = @_;
+ my $attr = $self->[_A];
+ unless (defined $attr)
+ {
+ croak new XML::DOM::DOMException (NOT_FOUND_ERR);
+ return;
+ }
+
+ my $node = $attr->getNamedItem ($name);
+ if (defined $node)
+ {
+#?? could use dispose() to remove circular references for gc, but what if
+#?? somebody is referencing it?
+ $self->removeAttributeNode ($node);
+ }
+}
+
+sub cloneNode
+{
+ my ($self, $deep) = @_;
+ my $node = $self->[_Doc]->createElement ($self->getTagName);
+
+ # Always clone the Attr nodes, even if $deep == 0
+ if (defined $self->[_A])
+ {
+ $node->[_A] = $self->[_A]->cloneNode (1); # deep=1
+ $node->[_A]->setParentNode ($node);
+ }
+
+ $node->cloneChildren ($self, $deep);
+ $node;
+}
+
+sub getAttributes
+{
+ $_[0]->[_A] ||= XML::DOM::NamedNodeMap->new (Doc => $_[0]->[_Doc],
+ Parent => $_[0]);
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+# Added for convenience
+sub setTagName
+{
+ my ($self, $tagName) = @_;
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "bad Element TagName [$tagName]")
+ unless XML::DOM::isValidName ($tagName);
+
+ $self->[_TagName] = $tagName;
+}
+
+sub isReadOnly
+{
+ 0;
+}
+
+# Added for optimization.
+sub isElementNode
+{
+ 1;
+}
+
+sub rejectChild
+{
+ my $t = $_[1]->getNodeType;
+
+ $t != TEXT_NODE
+ && $t != ENTITY_REFERENCE_NODE
+ && $t != PROCESSING_INSTRUCTION_NODE
+ && $t != COMMENT_NODE
+ && $t != CDATA_SECTION_NODE
+ && $t != ELEMENT_NODE;
+}
+
+sub getDefaultAttrValue
+{
+ my ($self, $attr) = @_;
+ $self->[_Doc]->getDefaultAttrValue ($self->[_TagName], $attr);
+}
+
+sub dispose
+{
+ my $self = shift;
+
+ $self->[_A]->dispose if defined $self->[_A];
+ $self->SUPER::dispose;
+}
+
+sub setOwnerDocument
+{
+ my ($self, $doc) = @_;
+ $self->SUPER::setOwnerDocument ($doc);
+
+ $self->[_A]->setOwnerDocument ($doc) if defined $self->[_A];
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $name = $self->[_TagName];
+
+ $FILE->print ("<$name");
+
+ if (defined $self->[_A])
+ {
+ for my $att (@{$self->[_A]->getValues})
+ {
+ # skip un-specified (default) Attr nodes
+ if ($att->isSpecified)
+ {
+ $FILE->print (" ");
+ $att->print ($FILE);
+ }
+ }
+ }
+
+ my @kids = @{$self->[_C]};
+ if (@kids > 0)
+ {
+ $FILE->print (">");
+ for my $kid (@kids)
+ {
+ $kid->print ($FILE);
+ }
+ $FILE->print ("</$name>");
+ }
+ else
+ {
+ my $style = &$XML::DOM::TagStyle ($name, $self);
+ if ($style == 0)
+ {
+ $FILE->print ("/>");
+ }
+ elsif ($style == 1)
+ {
+ $FILE->print ("></$name>");
+ }
+ else
+ {
+ $FILE->print (" />");
+ }
+ }
+}
+
+sub check
+{
+ my ($self, $checker) = @_;
+ die "Usage: \$xml_dom_elem->check (\$checker)" unless $checker;
+
+ $checker->InitDomElem;
+ $self->to_expat ($checker);
+ $checker->FinalDomElem;
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+
+ my $tag = $self->getTagName;
+ $iter->Start ($tag);
+
+ if (defined $self->[_A])
+ {
+ for my $attr ($self->[_A]->getValues)
+ {
+ $iter->Attr ($tag, $attr->getName, $attr->getValue, $attr->isSpecified);
+ }
+ }
+
+ $iter->EndAttr;
+
+ for my $kid ($self->getChildNodes)
+ {
+ $kid->to_expat ($iter);
+ }
+
+ $iter->End;
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+
+ my $tag = $self->getTagName;
+
+ my @attr = ();
+ my $attrOrder;
+ my $attrDefaulted;
+
+ if (defined $self->[_A])
+ {
+ my @spec = (); # names of specified attributes
+ my @unspec = (); # names of defaulted attributes
+
+ for my $attr ($self->[_A]->getValues)
+ {
+ my $attrName = $attr->getName;
+ push @attr, $attrName, $attr->getValue;
+ if ($attr->isSpecified)
+ {
+ push @spec, $attrName;
+ }
+ else
+ {
+ push @unspec, $attrName;
+ }
+ }
+ $attrOrder = [ @spec, @unspec ];
+ $attrDefaulted = @spec;
+ }
+ $doch->start_element (defined $attrOrder ?
+ { Name => $tag,
+ Attributes => { @attr },
+ AttributeOrder => $attrOrder,
+ Defaulted => $attrDefaulted
+ } :
+ { Name => $tag,
+ Attributes => { @attr }
+ }
+ );
+
+ for my $kid ($self->getChildNodes)
+ {
+ $kid->_to_sax ($doch, $dtdh, $enth);
+ }
+
+ $doch->end_element ( { Name => $tag } );
+}
+
+######################################################################
+package XML::DOM::CharacterData;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("Data", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+
+#
+# CharacterData nodes should never be created directly, only subclassed!
+#
+sub new
+{
+ my ($class, $doc, $data) = @_;
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_Data] = $data;
+ $self;
+}
+
+sub appendData
+{
+ my ($self, $data) = @_;
+
+ if ($XML::DOM::SafeMode)
+ {
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+ }
+ $self->[_Data] .= $data;
+}
+
+sub deleteData
+{
+ my ($self, $offset, $count) = @_;
+
+ croak new XML::DOM::DOMException (INDEX_SIZE_ERR,
+ "bad offset [$offset]")
+ if ($offset < 0 || $offset >= length ($self->[_Data]));
+#?? DOM Spec says >, but >= makes more sense!
+
+ croak new XML::DOM::DOMException (INDEX_SIZE_ERR,
+ "negative count [$count]")
+ if $count < 0;
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ substr ($self->[_Data], $offset, $count) = "";
+}
+
+sub getData
+{
+ $_[0]->[_Data];
+}
+
+sub getLength
+{
+ length $_[0]->[_Data];
+}
+
+sub insertData
+{
+ my ($self, $offset, $data) = @_;
+
+ croak new XML::DOM::DOMException (INDEX_SIZE_ERR,
+ "bad offset [$offset]")
+ if ($offset < 0 || $offset >= length ($self->[_Data]));
+#?? DOM Spec says >, but >= makes more sense!
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ substr ($self->[_Data], $offset, 0) = $data;
+}
+
+sub replaceData
+{
+ my ($self, $offset, $count, $data) = @_;
+
+ croak new XML::DOM::DOMException (INDEX_SIZE_ERR,
+ "bad offset [$offset]")
+ if ($offset < 0 || $offset >= length ($self->[_Data]));
+#?? DOM Spec says >, but >= makes more sense!
+
+ croak new XML::DOM::DOMException (INDEX_SIZE_ERR,
+ "negative count [$count]")
+ if $count < 0;
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ substr ($self->[_Data], $offset, $count) = $data;
+}
+
+sub setData
+{
+ my ($self, $data) = @_;
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ $self->[_Data] = $data;
+}
+
+sub substringData
+{
+ my ($self, $offset, $count) = @_;
+ my $data = $self->[_Data];
+
+ croak new XML::DOM::DOMException (INDEX_SIZE_ERR,
+ "bad offset [$offset]")
+ if ($offset < 0 || $offset >= length ($data));
+#?? DOM Spec says >, but >= makes more sense!
+
+ croak new XML::DOM::DOMException (INDEX_SIZE_ERR,
+ "negative count [$count]")
+ if $count < 0;
+
+ substr ($data, $offset, $count);
+}
+
+sub getNodeValue
+{
+ $_[0]->getData;
+}
+
+sub setNodeValue
+{
+ $_[0]->setData ($_[1]);
+}
+
+######################################################################
+package XML::DOM::CDATASection;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::CharacterData qw( :DEFAULT :Fields );
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("", "XML::DOM::CharacterData");
+}
+
+use XML::DOM::DOMException;
+
+sub getNodeName
+{
+ "#cdata-section";
+}
+
+sub getNodeType
+{
+ CDATA_SECTION_NODE;
+}
+
+sub cloneNode
+{
+ my $self = shift;
+ $self->[_Doc]->createCDATASection ($self->getData);
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub isReadOnly
+{
+ 0;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+ $FILE->print ("<![CDATA[");
+ $FILE->print (XML::DOM::encodeCDATA ($self->getData));
+ $FILE->print ("]]>");
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+ $iter->CData ($self->getData);
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+ $doch->start_cdata;
+ $doch->characters ( { Data => $self->getData } );
+ $doch->end_cdata;
+}
+
+######################################################################
+package XML::DOM::Comment;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::CharacterData qw( :DEFAULT :Fields );
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("", "XML::DOM::CharacterData");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+#?? setData - could check comment for double minus
+
+sub getNodeType
+{
+ COMMENT_NODE;
+}
+
+sub getNodeName
+{
+ "#comment";
+}
+
+sub cloneNode
+{
+ my $self = shift;
+ $self->[_Doc]->createComment ($self->getData);
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub isReadOnly
+{
+ return 0 if $XML::DOM::IgnoreReadOnly;
+
+ my $pa = $_[0]->[_Parent];
+ defined ($pa) ? $pa->isReadOnly : 0;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+ my $comment = XML::DOM::encodeComment ($self->[_Data]);
+
+ $FILE->print ("<!--$comment-->");
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+ $iter->Comment ($self->getData);
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+ $doch->Comment ( { Data => $self->getData });
+}
+
+######################################################################
+package XML::DOM::Text;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::CharacterData qw( :DEFAULT :Fields );
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("", "XML::DOM::CharacterData");
+}
+
+use XML::DOM::DOMException;
+use Carp;
+
+sub getNodeType
+{
+ TEXT_NODE;
+}
+
+sub getNodeName
+{
+ "#text";
+}
+
+sub splitText
+{
+ my ($self, $offset) = @_;
+
+ my $data = $self->getData;
+ croak new XML::DOM::DOMException (INDEX_SIZE_ERR,
+ "bad offset [$offset]")
+ if ($offset < 0 || $offset >= length ($data));
+#?? DOM Spec says >, but >= makes more sense!
+
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR,
+ "node is ReadOnly")
+ if $self->isReadOnly;
+
+ my $rest = substring ($data, $offset);
+
+ $self->setData (substring ($data, 0, $offset));
+ my $node = $self->[_Doc]->createTextNode ($rest);
+
+ # insert new node after this node
+ $self->[_Parent]->insertAfter ($node, $self);
+
+ $node;
+}
+
+sub cloneNode
+{
+ my $self = shift;
+ $self->[_Doc]->createTextNode ($self->getData);
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub isReadOnly
+{
+ 0;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+ $FILE->print (XML::DOM::encodeText ($self->getData, "<&"));
+}
+
+sub isTextNode
+{
+ 1;
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+ $iter->Char ($self->getData);
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+ $doch->characters ( { Data => $self->getData } );
+}
+
+######################################################################
+package XML::DOM::XMLDecl;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("Version Encoding Standalone", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+
+
+#------------------------------------------------------------
+# Extra method implementations
+
+# XMLDecl is not part of the DOM Spec
+sub new
+{
+ my ($class, $doc, $version, $encoding, $standalone) = @_;
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_Version] = $version if defined $version;
+ $self->[_Encoding] = $encoding if defined $encoding;
+ $self->[_Standalone] = $standalone if defined $standalone;
+
+ $self;
+}
+
+sub setVersion
+{
+ if (defined $_[1])
+ {
+ $_[0]->[_Version] = $_[1];
+ }
+ else
+ {
+ undef $_[0]->[_Version]; # was delete
+ }
+}
+
+sub getVersion
+{
+ $_[0]->[_Version];
+}
+
+sub setEncoding
+{
+ if (defined $_[1])
+ {
+ $_[0]->[_Encoding] = $_[1];
+ }
+ else
+ {
+ undef $_[0]->[_Encoding]; # was delete
+ }
+}
+
+sub getEncoding
+{
+ $_[0]->[_Encoding];
+}
+
+sub setStandalone
+{
+ if (defined $_[1])
+ {
+ $_[0]->[_Standalone] = $_[1];
+ }
+ else
+ {
+ undef $_[0]->[_Standalone]; # was delete
+ }
+}
+
+sub getStandalone
+{
+ $_[0]->[_Standalone];
+}
+
+sub getNodeType
+{
+ XML_DECL_NODE;
+}
+
+sub cloneNode
+{
+ my $self = shift;
+
+ new XML::DOM::XMLDecl ($self->[_Doc], $self->[_Version],
+ $self->[_Encoding], $self->[_Standalone]);
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $version = $self->[_Version];
+ my $encoding = $self->[_Encoding];
+ my $standalone = $self->[_Standalone];
+ $standalone = ($standalone ? "yes" : "no") if defined $standalone;
+
+ $FILE->print ("<?xml");
+ $FILE->print (" version=\"$version\"") if defined $version;
+ $FILE->print (" encoding=\"$encoding\"") if defined $encoding;
+ $FILE->print (" standalone=\"$standalone\"") if defined $standalone;
+ $FILE->print ("?>");
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+ $iter->XMLDecl ($self->getVersion, $self->getEncoding, $self->getStandalone);
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+ $dtdh->xml_decl ( { Version => $self->getVersion,
+ Encoding => $self->getEncoding,
+ Standalone => $self->getStandalone } );
+}
+
+######################################################################
+package XML::DOM::DocumentFragment;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+
+sub new
+{
+ my ($class, $doc) = @_;
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_C] = new XML::DOM::NodeList;
+ $self;
+}
+
+sub getNodeType
+{
+ DOCUMENT_FRAGMENT_NODE;
+}
+
+sub getNodeName
+{
+ "#document-fragment";
+}
+
+sub cloneNode
+{
+ my ($self, $deep) = @_;
+ my $node = $self->[_Doc]->createDocumentFragment;
+
+ $node->cloneChildren ($self, $deep);
+ $node;
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub isReadOnly
+{
+ 0;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ for my $node (@{$self->[_C]})
+ {
+ $node->print ($FILE);
+ }
+}
+
+sub rejectChild
+{
+ my $t = $_[1]->getNodeType;
+
+ $t != TEXT_NODE
+ && $t != ENTITY_REFERENCE_NODE
+ && $t != PROCESSING_INSTRUCTION_NODE
+ && $t != COMMENT_NODE
+ && $t != CDATA_SECTION_NODE
+ && $t != ELEMENT_NODE;
+}
+
+sub isDocumentFragmentNode
+{
+ 1;
+}
+
+######################################################################
+package XML::DOM::Document;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ XML::DOM::def_fields ("Doctype XmlDecl", "XML::DOM::Node");
+}
+
+use Carp;
+use XML::DOM::NodeList;
+use XML::DOM::DOMException;
+
+sub new
+{
+ my ($class) = @_;
+ my $self = bless [], $class;
+
+ # keep Doc pointer, even though getOwnerDocument returns undef
+ $self->[_Doc] = $self;
+ $self->[_C] = new XML::DOM::NodeList;
+ $self;
+}
+
+sub getNodeType
+{
+ DOCUMENT_NODE;
+}
+
+sub getNodeName
+{
+ "#document";
+}
+
+#?? not sure about keeping a fixed order of these nodes....
+sub getDoctype
+{
+ $_[0]->[_Doctype];
+}
+
+sub getDocumentElement
+{
+ my ($self) = @_;
+ for my $kid (@{$self->[_C]})
+ {
+ return $kid if $kid->isElementNode;
+ }
+ undef;
+}
+
+sub getOwnerDocument
+{
+ undef;
+}
+
+sub getImplementation
+{
+ $XML::DOM::DOMImplementation::Singleton;
+}
+
+#
+# Added extra parameters ($val, $specified) that are passed straight to the
+# Attr constructor
+#
+sub createAttribute
+{
+ new XML::DOM::Attr (@_);
+}
+
+sub createCDATASection
+{
+ new XML::DOM::CDATASection (@_);
+}
+
+sub createComment
+{
+ new XML::DOM::Comment (@_);
+
+}
+
+sub createElement
+{
+ new XML::DOM::Element (@_);
+}
+
+sub createTextNode
+{
+ new XML::DOM::Text (@_);
+}
+
+sub createProcessingInstruction
+{
+ new XML::DOM::ProcessingInstruction (@_);
+}
+
+sub createEntityReference
+{
+ new XML::DOM::EntityReference (@_);
+}
+
+sub createDocumentFragment
+{
+ new XML::DOM::DocumentFragment (@_);
+}
+
+sub createDocumentType
+{
+ new XML::DOM::DocumentType (@_);
+}
+
+sub cloneNode
+{
+ my ($self, $deep) = @_;
+ my $node = new XML::DOM::Document;
+
+ $node->cloneChildren ($self, $deep);
+
+ my $xmlDecl = $self->[_XmlDecl];
+ $node->[_XmlDecl] = $xmlDecl->cloneNode ($deep) if defined $xmlDecl;
+
+ $node;
+}
+
+sub appendChild
+{
+ my ($self, $node) = @_;
+
+ # Extra check: make sure we don't end up with more than one Element.
+ # Don't worry about multiple DocType nodes, because DocumentFragment
+ # can't contain DocType nodes.
+
+ my @nodes = ($node);
+ @nodes = @{$node->[_C]}
+ if $node->getNodeType == DOCUMENT_FRAGMENT_NODE;
+
+ my $elem = 0;
+ for my $n (@nodes)
+ {
+ $elem++ if $n->isElementNode;
+ }
+
+ if ($elem > 0 && defined ($self->getDocumentElement))
+ {
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "document can have only one Element");
+ }
+ $self->SUPER::appendChild ($node);
+}
+
+sub insertBefore
+{
+ my ($self, $node, $refNode) = @_;
+
+ # Extra check: make sure sure we don't end up with more than 1 Elements.
+ # Don't worry about multiple DocType nodes, because DocumentFragment
+ # can't contain DocType nodes.
+
+ my @nodes = ($node);
+ @nodes = @{$node->[_C]}
+ if $node->getNodeType == DOCUMENT_FRAGMENT_NODE;
+
+ my $elem = 0;
+ for my $n (@nodes)
+ {
+ $elem++ if $n->isElementNode;
+ }
+
+ if ($elem > 0 && defined ($self->getDocumentElement))
+ {
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "document can have only one Element");
+ }
+ $self->SUPER::insertBefore ($node, $refNode);
+}
+
+sub replaceChild
+{
+ my ($self, $node, $refNode) = @_;
+
+ # Extra check: make sure sure we don't end up with more than 1 Elements.
+ # Don't worry about multiple DocType nodes, because DocumentFragment
+ # can't contain DocType nodes.
+
+ my @nodes = ($node);
+ @nodes = @{$node->[_C]}
+ if $node->getNodeType == DOCUMENT_FRAGMENT_NODE;
+
+ my $elem = 0;
+ $elem-- if $refNode->isElementNode;
+
+ for my $n (@nodes)
+ {
+ $elem++ if $n->isElementNode;
+ }
+
+ if ($elem > 0 && defined ($self->getDocumentElement))
+ {
+ croak new XML::DOM::DOMException (HIERARCHY_REQUEST_ERR,
+ "document can have only one Element");
+ }
+ $self->SUPER::appendChild ($node, $refNode);
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub isReadOnly
+{
+ 0;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $xmlDecl = $self->getXMLDecl;
+ if (defined $xmlDecl)
+ {
+ $xmlDecl->print ($FILE);
+ $FILE->print ("\x0A");
+ }
+
+ for my $node (@{$self->[_C]})
+ {
+ $node->print ($FILE);
+ $FILE->print ("\x0A");
+ }
+}
+
+sub setDoctype
+{
+ my ($self, $doctype) = @_;
+ my $oldDoctype = $self->[_Doctype];
+ if (defined $oldDoctype)
+ {
+ $self->replaceChild ($doctype, $oldDoctype);
+ }
+ else
+ {
+#?? before root element, but after XmlDecl !
+ $self->appendChild ($doctype);
+ }
+ $_[0]->[_Doctype] = $_[1];
+}
+
+sub removeDoctype
+{
+ my $self = shift;
+ my $doctype = $self->removeChild ($self->[_Doctype]);
+
+ undef $self->[_Doctype]; # was delete
+ $doctype;
+}
+
+sub rejectChild
+{
+ my $t = $_[1]->getNodeType;
+ $t != ELEMENT_NODE
+ && $t != PROCESSING_INSTRUCTION_NODE
+ && $t != COMMENT_NODE
+ && $t != DOCUMENT_TYPE_NODE;
+}
+
+sub expandEntity
+{
+ my ($self, $ent, $param) = @_;
+ my $doctype = $self->getDoctype;
+
+ (defined $doctype) ? $doctype->expandEntity ($ent, $param) : undef;
+}
+
+sub getDefaultAttrValue
+{
+ my ($self, $elem, $attr) = @_;
+
+ my $doctype = $self->getDoctype;
+
+ (defined $doctype) ? $doctype->getDefaultAttrValue ($elem, $attr) : undef;
+}
+
+sub getEntity
+{
+ my ($self, $entity) = @_;
+
+ my $doctype = $self->getDoctype;
+
+ (defined $doctype) ? $doctype->getEntity ($entity) : undef;
+}
+
+sub dispose
+{
+ my $self = shift;
+
+ $self->[_XmlDecl]->dispose if defined $self->[_XmlDecl];
+ undef $self->[_XmlDecl]; # was delete
+ undef $self->[_Doctype]; # was delete
+ $self->SUPER::dispose;
+}
+
+sub setOwnerDocument
+{
+ # Do nothing, you can't change the owner document!
+#?? could throw exception...
+}
+
+sub getXMLDecl
+{
+ $_[0]->[_XmlDecl];
+}
+
+sub setXMLDecl
+{
+ $_[0]->[_XmlDecl] = $_[1];
+}
+
+sub createXMLDecl
+{
+ new XML::DOM::XMLDecl (@_);
+}
+
+sub createNotation
+{
+ new XML::DOM::Notation (@_);
+}
+
+sub createElementDecl
+{
+ new XML::DOM::ElementDecl (@_);
+}
+
+sub createAttlistDecl
+{
+ new XML::DOM::AttlistDecl (@_);
+}
+
+sub createEntity
+{
+ new XML::DOM::Entity (@_);
+}
+
+sub createChecker
+{
+ my $self = shift;
+ my $checker = XML::Checker->new;
+
+ $checker->Init;
+ my $doctype = $self->getDoctype;
+ $doctype->to_expat ($checker) if $doctype;
+ $checker->Final;
+
+ $checker;
+}
+
+sub check
+{
+ my ($self, $checker) = @_;
+ $checker ||= XML::Checker->new;
+
+ $self->to_expat ($checker);
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+
+ $iter->Init;
+
+ for my $kid ($self->getChildNodes)
+ {
+ $kid->to_expat ($iter);
+ }
+ $iter->Final;
+}
+
+sub check_sax
+{
+ my ($self, $checker) = @_;
+ $checker ||= XML::Checker->new;
+
+ $self->to_sax (Handler => $checker);
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+
+ $doch->start_document;
+
+ for my $kid ($self->getChildNodes)
+ {
+ $kid->_to_sax ($doch, $dtdh, $enth);
+ }
+ $doch->end_document;
+}
+
+######################################################################
+package XML::DOM::DocumentType;
+######################################################################
+use vars qw{ @ISA @EXPORT_OK %EXPORT_TAGS %HFIELDS };
+
+BEGIN
+{
+ import XML::DOM::Node qw( :DEFAULT :Fields );
+ import XML::DOM::Document qw( :Fields );
+ XML::DOM::def_fields ("Entities Notations Name SysId PubId Internal", "XML::DOM::Node");
+}
+
+use XML::DOM::DOMException;
+use XML::DOM::NamedNodeMap;
+
+sub new
+{
+ my $class = shift;
+ my $doc = shift;
+
+ my $self = bless [], $class;
+
+ $self->[_Doc] = $doc;
+ $self->[_ReadOnly] = 1;
+ $self->[_C] = new XML::DOM::NodeList;
+
+ $self->[_Entities] = new XML::DOM::NamedNodeMap (Doc => $doc,
+ Parent => $self,
+ ReadOnly => 1);
+ $self->[_Notations] = new XML::DOM::NamedNodeMap (Doc => $doc,
+ Parent => $self,
+ ReadOnly => 1);
+ $self->setParams (@_);
+ $self;
+}
+
+sub getNodeType
+{
+ DOCUMENT_TYPE_NODE;
+}
+
+sub getNodeName
+{
+ $_[0]->[_Name];
+}
+
+sub getName
+{
+ $_[0]->[_Name];
+}
+
+sub getEntities
+{
+ $_[0]->[_Entities];
+}
+
+sub getNotations
+{
+ $_[0]->[_Notations];
+}
+
+sub setParentNode
+{
+ my ($self, $parent) = @_;
+ $self->SUPER::setParentNode ($parent);
+
+ $parent->[_Doctype] = $self
+ if $parent->getNodeType == DOCUMENT_NODE;
+}
+
+sub cloneNode
+{
+ my ($self, $deep) = @_;
+
+ my $node = new XML::DOM::DocumentType ($self->[_Doc], $self->[_Name],
+ $self->[_SysId], $self->[_PubId],
+ $self->[_Internal]);
+
+#?? does it make sense to make a shallow copy?
+
+ # clone the NamedNodeMaps
+ $node->[_Entities] = $self->[_Entities]->cloneNode ($deep);
+
+ $node->[_Notations] = $self->[_Notations]->cloneNode ($deep);
+
+ $node->cloneChildren ($self, $deep);
+
+ $node;
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub getSysId
+{
+ $_[0]->[_SysId];
+}
+
+sub getPubId
+{
+ $_[0]->[_PubId];
+}
+
+sub getInternal
+{
+ $_[0]->[_Internal];
+}
+
+sub setSysId
+{
+ $_[0]->[_SysId] = $_[1];
+}
+
+sub setPubId
+{
+ $_[0]->[_PubId] = $_[1];
+}
+
+sub setInternal
+{
+ $_[0]->[_Internal] = $_[1];
+}
+
+sub setName
+{
+ $_[0]->[_Name] = $_[1];
+}
+
+sub removeChildHoodMemories
+{
+ my ($self, $dontWipeReadOnly) = @_;
+
+ my $parent = $self->[_Parent];
+ if (defined $parent && $parent->getNodeType == DOCUMENT_NODE)
+ {
+ undef $parent->[_Doctype]; # was delete
+ }
+ $self->SUPER::removeChildHoodMemories;
+}
+
+sub dispose
+{
+ my $self = shift;
+
+ $self->[_Entities]->dispose;
+ $self->[_Notations]->dispose;
+ $self->SUPER::dispose;
+}
+
+sub setOwnerDocument
+{
+ my ($self, $doc) = @_;
+ $self->SUPER::setOwnerDocument ($doc);
+
+ $self->[_Entities]->setOwnerDocument ($doc);
+ $self->[_Notations]->setOwnerDocument ($doc);
+}
+
+sub expandEntity
+{
+ my ($self, $ent, $param) = @_;
+
+ my $kid = $self->[_Entities]->getNamedItem ($ent);
+ return $kid->getValue
+ if (defined ($kid) && $param == $kid->isParameterEntity);
+
+ undef; # entity not found
+}
+
+sub getAttlistDecl
+{
+ my ($self, $elemName) = @_;
+ for my $kid (@{$_[0]->[_C]})
+ {
+ return $kid if ($kid->getNodeType == ATTLIST_DECL_NODE &&
+ $kid->getName eq $elemName);
+ }
+ undef; # not found
+}
+
+sub getElementDecl
+{
+ my ($self, $elemName) = @_;
+ for my $kid (@{$_[0]->[_C]})
+ {
+ return $kid if ($kid->getNodeType == ELEMENT_DECL_NODE &&
+ $kid->getName eq $elemName);
+ }
+ undef; # not found
+}
+
+sub addElementDecl
+{
+ my ($self, $name, $model, $hidden) = @_;
+ my $node = $self->getElementDecl ($name);
+
+#?? could warn
+ unless (defined $node)
+ {
+ $node = $self->[_Doc]->createElementDecl ($name, $model, $hidden);
+ $self->appendChild ($node);
+ }
+ $node;
+}
+
+sub addAttlistDecl
+{
+ my ($self, $name) = @_;
+ my $node = $self->getAttlistDecl ($name);
+
+ unless (defined $node)
+ {
+ $node = $self->[_Doc]->createAttlistDecl ($name);
+ $self->appendChild ($node);
+ }
+ $node;
+}
+
+sub addNotation
+{
+ my $self = shift;
+ my $node = $self->[_Doc]->createNotation (@_);
+ $self->[_Notations]->setNamedItem ($node);
+ $node;
+}
+
+sub addEntity
+{
+ my $self = shift;
+ my $node = $self->[_Doc]->createEntity (@_);
+
+ $self->[_Entities]->setNamedItem ($node);
+ $node;
+}
+
+# All AttDefs for a certain Element are merged into a single ATTLIST
+sub addAttDef
+{
+ my $self = shift;
+ my $elemName = shift;
+
+ # create the AttlistDecl if it doesn't exist yet
+ my $attListDecl = $self->addAttlistDecl ($elemName);
+ $attListDecl->addAttDef (@_);
+}
+
+sub getDefaultAttrValue
+{
+ my ($self, $elem, $attr) = @_;
+ my $elemNode = $self->getAttlistDecl ($elem);
+ (defined $elemNode) ? $elemNode->getDefaultAttrValue ($attr) : undef;
+}
+
+sub getEntity
+{
+ my ($self, $entity) = @_;
+ $self->[_Entities]->getNamedItem ($entity);
+}
+
+sub setParams
+{
+ my ($self, $name, $sysid, $pubid, $internal) = @_;
+
+ $self->[_Name] = $name;
+
+#?? not sure if we need to hold on to these...
+ $self->[_SysId] = $sysid if defined $sysid;
+ $self->[_PubId] = $pubid if defined $pubid;
+ $self->[_Internal] = $internal if defined $internal;
+
+ $self;
+}
+
+sub rejectChild
+{
+ # DOM Spec says: DocumentType -- no children
+ not $XML::DOM::IgnoreReadOnly;
+}
+
+sub print
+{
+ my ($self, $FILE) = @_;
+
+ my $name = $self->[_Name];
+
+ my $sysId = $self->[_SysId];
+ my $pubId = $self->[_PubId];
+
+ $FILE->print ("<!DOCTYPE $name");
+ if (defined $pubId)
+ {
+ $FILE->print (" PUBLIC \"$pubId\" \"$sysId\"");
+ }
+ elsif (defined $sysId)
+ {
+ $FILE->print (" SYSTEM \"$sysId\"");
+ }
+
+ my @entities = @{$self->[_Entities]->getValues};
+ my @notations = @{$self->[_Notations]->getValues};
+ my @kids = @{$self->[_C]};
+
+ if (@entities || @notations || @kids)
+ {
+ $FILE->print (" [\x0A");
+
+ for my $kid (@entities)
+ {
+ next if $kid->[_Hidden];
+
+ $FILE->print (" ");
+ $kid->print ($FILE);
+ $FILE->print ("\x0A");
+ }
+
+ for my $kid (@notations)
+ {
+ next if $kid->[_Hidden];
+
+ $FILE->print (" ");
+ $kid->print ($FILE);
+ $FILE->print ("\x0A");
+ }
+
+ for my $kid (@kids)
+ {
+ next if $kid->[_Hidden];
+
+ $FILE->print (" ");
+ $kid->print ($FILE);
+ $FILE->print ("\x0A");
+ }
+ $FILE->print ("]");
+ }
+ $FILE->print (">");
+}
+
+sub to_expat
+{
+ my ($self, $iter) = @_;
+
+ $iter->Doctype ($self->getName, $self->getSysId, $self->getPubId, $self->getInternal);
+
+ for my $ent ($self->getEntities->getValues)
+ {
+ next if $ent->[_Hidden];
+ $ent->to_expat ($iter);
+ }
+
+ for my $nota ($self->getNotations->getValues)
+ {
+ next if $nota->[_Hidden];
+ $nota->to_expat ($iter);
+ }
+
+ for my $kid ($self->getChildNodes)
+ {
+ next if $kid->[_Hidden];
+ $kid->to_expat ($iter);
+ }
+}
+
+sub _to_sax
+{
+ my ($self, $doch, $dtdh, $enth) = @_;
+
+ $dtdh->doctype_decl ( { Name => $self->getName,
+ SystemId => $self->getSysId,
+ PublicId => $self->getPubId,
+ Internal => $self->getInternal });
+
+ for my $ent ($self->getEntities->getValues)
+ {
+ next if $ent->[_Hidden];
+ $ent->_to_sax ($doch, $dtdh, $enth);
+ }
+
+ for my $nota ($self->getNotations->getValues)
+ {
+ next if $nota->[_Hidden];
+ $nota->_to_sax ($doch, $dtdh, $enth);
+ }
+
+ for my $kid ($self->getChildNodes)
+ {
+ next if $kid->[_Hidden];
+ $kid->_to_sax ($doch, $dtdh, $enth);
+ }
+}
+
+######################################################################
+package XML::DOM::Parser;
+######################################################################
+use vars qw ( @ISA );
+@ISA = qw( XML::Parser );
+
+sub new
+{
+ my ($class, %args) = @_;
+
+ $args{Style} = 'Dom';
+ $class->SUPER::new (%args);
+}
+
+# This method needed to be overriden so we can restore some global
+# variables when an exception is thrown
+sub parse
+{
+ my $self = shift;
+
+ local $XML::Parser::Dom::_DP_doc;
+ local $XML::Parser::Dom::_DP_elem;
+ local $XML::Parser::Dom::_DP_doctype;
+ local $XML::Parser::Dom::_DP_in_prolog;
+ local $XML::Parser::Dom::_DP_end_doc;
+ local $XML::Parser::Dom::_DP_saw_doctype;
+ local $XML::Parser::Dom::_DP_in_CDATA;
+ local $XML::Parser::Dom::_DP_keep_CDATA;
+ local $XML::Parser::Dom::_DP_last_text;
+
+
+ # Temporarily disable checks that Expat already does (for performance)
+ local $XML::DOM::SafeMode = 0;
+ # Temporarily disable ReadOnly checks
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ my $ret;
+ eval {
+ $ret = $self->SUPER::parse (@_);
+ };
+ my $err = $@;
+
+ if ($err)
+ {
+ my $doc = $XML::Parser::Dom::_DP_doc;
+ if ($doc)
+ {
+ $doc->dispose;
+ }
+ die $err;
+ }
+
+ $ret;
+}
+
+my $LWP_USER_AGENT;
+sub set_LWP_UserAgent
+{
+ $LWP_USER_AGENT = shift;
+}
+
+sub parsefile
+{
+ my $self = shift;
+ my $url = shift;
+
+ # Any other URL schemes?
+ if ($url =~ /^(https?|ftp|wais|gopher|file):/)
+ {
+ # Read the file from the web with LWP.
+ #
+ # Note that we read in the entire file, which may not be ideal
+ # for large files. LWP::UserAgent also provides a callback style
+ # request, which we could convert to a stream with a fork()...
+
+ my $result;
+ eval
+ {
+ use LWP::UserAgent;
+
+ my $ua = $self->{LWP_UserAgent};
+ unless (defined $ua)
+ {
+ unless (defined $LWP_USER_AGENT)
+ {
+ $LWP_USER_AGENT = LWP::UserAgent->new;
+
+ # Load proxy settings from environment variables, i.e.:
+ # http_proxy, ftp_proxy, no_proxy etc. (see LWP::UserAgent(3))
+ # You need these to go thru firewalls.
+ $LWP_USER_AGENT->env_proxy;
+ }
+ $ua = $LWP_USER_AGENT;
+ }
+ my $req = new HTTP::Request 'GET', $url;
+ my $response = $LWP_USER_AGENT->request ($req);
+
+ # Parse the result of the HTTP request
+ $result = $self->parse ($response->content, @_);
+ };
+ if ($@)
+ {
+ die "Couldn't parsefile [$url] with LWP: $@";
+ }
+ return $result;
+ }
+ else
+ {
+ return $self->SUPER::parsefile ($url, @_);
+ }
+}
+
+######################################################################
+package XML::Parser::Dom;
+######################################################################
+
+BEGIN
+{
+ import XML::DOM::Node qw( :Fields );
+ import XML::DOM::CharacterData qw( :Fields );
+}
+
+use vars qw( $_DP_doc
+ $_DP_elem
+ $_DP_doctype
+ $_DP_in_prolog
+ $_DP_end_doc
+ $_DP_saw_doctype
+ $_DP_in_CDATA
+ $_DP_keep_CDATA
+ $_DP_last_text
+ $_DP_level
+ $_DP_expand_pent
+ );
+
+# This adds a new Style to the XML::Parser class.
+# From now on you can say: $parser = new XML::Parser ('Style' => 'Dom' );
+# but that is *NOT* how a regular user should use it!
+$XML::Parser::Built_In_Styles{Dom} = 1;
+
+sub Init
+{
+ $_DP_elem = $_DP_doc = new XML::DOM::Document();
+ $_DP_doctype = new XML::DOM::DocumentType ($_DP_doc);
+ $_DP_doc->setDoctype ($_DP_doctype);
+ $_DP_keep_CDATA = $_[0]->{KeepCDATA};
+
+ # Prepare for document prolog
+ $_DP_in_prolog = 1;
+
+ # We haven't passed the root element yet
+ $_DP_end_doc = 0;
+
+ # Expand parameter entities in the DTD by default
+
+ $_DP_expand_pent = defined $_[0]->{ExpandParamEnt} ?
+ $_[0]->{ExpandParamEnt} : 1;
+ if ($_DP_expand_pent)
+ {
+ $_[0]->{DOM_Entity} = {};
+ }
+
+ $_DP_level = 0;
+
+ undef $_DP_last_text;
+}
+
+sub Final
+{
+ unless ($_DP_saw_doctype)
+ {
+ my $doctype = $_DP_doc->removeDoctype;
+ $doctype->dispose;
+ }
+ $_DP_doc;
+}
+
+sub Char
+{
+ my $str = $_[1];
+
+ if ($_DP_in_CDATA && $_DP_keep_CDATA)
+ {
+ undef $_DP_last_text;
+ # Merge text with previous node if possible
+ $_DP_elem->addCDATA ($str);
+ }
+ else
+ {
+ # Merge text with previous node if possible
+ # Used to be: $expat->{DOM_Element}->addText ($str);
+ if ($_DP_last_text)
+ {
+ $_DP_last_text->[_Data] .= $str;
+ }
+ else
+ {
+ $_DP_last_text = $_DP_doc->createTextNode ($str);
+ $_DP_last_text->[_Parent] = $_DP_elem;
+ push @{$_DP_elem->[_C]}, $_DP_last_text;
+ }
+ }
+}
+
+sub Start
+{
+ my ($expat, $elem, @attr) = @_;
+ my $parent = $_DP_elem;
+ my $doc = $_DP_doc;
+
+ if ($parent == $doc)
+ {
+ # End of document prolog, i.e. start of first Element
+ $_DP_in_prolog = 0;
+ }
+
+ undef $_DP_last_text;
+ my $node = $doc->createElement ($elem);
+ $_DP_elem = $node;
+ $parent->appendChild ($node);
+
+ my $n = @attr;
+ return unless $n;
+
+ # Add attributes
+ my $first_default = $expat->specified_attr;
+ my $i = 0;
+ while ($i < $n)
+ {
+ my $specified = $i < $first_default;
+ my $name = $attr[$i++];
+ undef $_DP_last_text;
+ my $attr = $doc->createAttribute ($name, $attr[$i++], $specified);
+ $node->setAttributeNode ($attr);
+ }
+}
+
+sub End
+{
+ $_DP_elem = $_DP_elem->[_Parent];
+ undef $_DP_last_text;
+
+ # Check for end of root element
+ $_DP_end_doc = 1 if ($_DP_elem == $_DP_doc);
+}
+
+# Called at end of file, i.e. whitespace following last closing tag
+# Also for Entity references
+# May also be called at other times...
+sub Default
+{
+ my ($expat, $str) = @_;
+
+# shift; deb ("Default", @_);
+
+ if ($_DP_in_prolog) # still processing Document prolog...
+ {
+#?? could try to store this text later
+#?? I've only seen whitespace here so far
+ }
+ elsif (!$_DP_end_doc) # ignore whitespace at end of Document
+ {
+# if ($expat->{NoExpand})
+# {
+ $str =~ /^&(.+);$/os;
+ return unless defined ($1);
+ # Got a TextDecl (<?xml ...?>) from an external entity here once
+
+ $_DP_elem->appendChild (
+ $_DP_doc->createEntityReference ($1));
+ undef $_DP_last_text;
+# }
+# else
+# {
+# $expat->{DOM_Element}->addText ($str);
+# }
+ }
+}
+
+# XML::Parser 2.19 added support for CdataStart and CdataEnd handlers
+# If they are not defined, the Default handler is called instead
+# with the text "<![CDATA[" and "]]"
+sub CdataStart
+{
+ $_DP_in_CDATA = 1;
+}
+
+sub CdataEnd
+{
+ $_DP_in_CDATA = 0;
+}
+
+my $START_MARKER = "__DOM__START__ENTITY__";
+my $END_MARKER = "__DOM__END__ENTITY__";
+
+sub Comment
+{
+ undef $_DP_last_text;
+
+ # These comments were inserted by ExternEnt handler
+ if ($_[1] =~ /(?:($START_MARKER)|($END_MARKER))/)
+ {
+ if ($1) # START
+ {
+ $_DP_level++;
+ }
+ else
+ {
+ $_DP_level--;
+ }
+ }
+ else
+ {
+ my $comment = $_DP_doc->createComment ($_[1]);
+ $_DP_elem->appendChild ($comment);
+ }
+}
+
+sub deb
+{
+# return;
+
+ my $name = shift;
+ print "$name (" . join(",", map {defined($_)?$_ : "(undef)"} @_) . ")\n";
+}
+
+sub Doctype
+{
+ my $expat = shift;
+# deb ("Doctype", @_);
+
+ $_DP_doctype->setParams (@_);
+ $_DP_saw_doctype = 1;
+}
+
+sub Attlist
+{
+ my $expat = shift;
+# deb ("Attlist", @_);
+
+ $_[5] = "Hidden" unless $_DP_expand_pent || $_DP_level == 0;
+ $_DP_doctype->addAttDef (@_);
+}
+
+sub XMLDecl
+{
+ my $expat = shift;
+# deb ("XMLDecl", @_);
+
+ undef $_DP_last_text;
+ $_DP_doc->setXMLDecl (new XML::DOM::XMLDecl ($_DP_doc, @_));
+}
+
+sub Entity
+{
+ my $expat = shift;
+# deb ("Entity", @_);
+
+ # Parameter Entities names are passed starting with '%'
+ my $parameter = 0;
+ if ($_[0] =~ /^%(.*)/s)
+ {
+ $_[0] = $1;
+ $parameter = 1;
+
+ if (defined $_[2]) # was sysid specified?
+ {
+ # Store the Entity mapping for use in ExternEnt
+ if (exists $expat->{DOM_Entity}->{$_[2]})
+ {
+ # If this ever happens, the name of entity may be the wrong one
+ # when writing out the Document.
+ XML::DOM::warning ("Entity $_[2] is known as %$_[0] and %" .
+ $expat->{DOM_Entity}->{$_[2]});
+ }
+ else
+ {
+ $expat->{DOM_Entity}->{$_[2]} = $_[0];
+ }
+ #?? remove this block when XML::Parser has better support
+ }
+ }
+
+ undef $_DP_last_text;
+
+ $_[5] = "Hidden" unless $_DP_expand_pent || $_DP_level == 0;
+ $_DP_doctype->addEntity ($parameter, @_);
+}
+
+#
+# Unparsed is called when it encounters e.g:
+#
+# <!ENTITY logo SYSTEM "http://server/logo.gif" NDATA gif>
+#
+sub Unparsed
+{
+ Entity (@_); # same as regular ENTITY, as far as DOM is concerned
+}
+
+sub Element
+{
+ shift;
+# deb ("Element", @_);
+
+ undef $_DP_last_text;
+ push @_, "Hidden" unless $_DP_expand_pent || $_DP_level == 0;
+ $_DP_doctype->addElementDecl (@_);
+}
+
+sub Notation
+{
+ shift;
+# deb ("Notation", @_);
+
+ undef $_DP_last_text;
+ $_[4] = "Hidden" unless $_DP_expand_pent || $_DP_level == 0;
+ $_DP_doctype->addNotation (@_);
+}
+
+sub Proc
+{
+ shift;
+# deb ("Proc", @_);
+
+ undef $_DP_last_text;
+ push @_, "Hidden" unless $_DP_expand_pent || $_DP_level == 0;
+ $_DP_elem->appendChild ($_DP_doc->createProcessingInstruction (@_));
+}
+
+#
+# ExternEnt is called when an external entity, such as:
+#
+# <!ENTITY externalEntity PUBLIC "-//Enno//TEXT Enno's description//EN"
+# "http://server/descr.txt">
+#
+# is referenced in the document, e.g. with: &externalEntity;
+# If ExternEnt is not specified, the entity reference is passed to the Default
+# handler as e.g. "&externalEntity;", where an EntityReference object is added.
+#
+# Also for %externalEntity; references in the DTD itself.
+#
+# It can also be called when XML::Parser parses the DOCTYPE header
+# (just before calling the DocType handler), when it contains a
+# reference like "docbook.dtd" below:
+#
+# <!DOCTYPE book PUBLIC "-//Norman Walsh//DTD DocBk XML V3.1.3//EN"
+# "docbook.dtd" [
+# ... rest of DTD ...
+#
+sub ExternEnt
+{
+ my ($expat, $base, $sysid, $pubid) = @_;
+# deb ("ExternEnt", @_);
+
+ # Invoke XML::Parser's default ExternEnt handler
+ my $content;
+ if ($XML::Parser::have_LWP)
+ {
+ $content = XML::Parser::lwp_ext_ent_handler (@_);
+ }
+ else
+ {
+ $content = XML::Parser::file_ext_ent_handler (@_);
+ }
+
+ if ($_DP_expand_pent)
+ {
+ return $content;
+ }
+ else
+ {
+ my $entname = $expat->{DOM_Entity}->{$sysid};
+ if (defined $entname)
+ {
+ $_DP_doctype->appendChild ($_DP_doc->createEntityReference ($entname, 1));
+ # Wrap the contents in special comments, so we know when we reach the
+ # end of parsing the entity. This way we can omit the contents from
+ # the DTD, when ExpandParamEnt is set to 0.
+
+ return "<!-- $START_MARKER sysid=[$sysid] -->" .
+ $content . "<!-- $END_MARKER sysid=[$sysid] -->";
+ }
+ else
+ {
+ # We either read the entity ref'd by the system id in the
+ # <!DOCTYPE> header, or the entity was undefined.
+ # In either case, don't bother with maintaining the entity
+ # reference, just expand the contents.
+ return "<!-- $START_MARKER sysid=[DTD] -->" .
+ $content . "<!-- $END_MARKER sysid=[DTD] -->";
+ }
+ }
+}
+
+1; # module return code
+
+__END__
+
+=head1 NAME
+
+XML::DOM - A perl module for building DOM Level 1 compliant document structures
+
+=head1 SYNOPSIS
+
+ use XML::DOM;
+
+ my $parser = new XML::DOM::Parser;
+ my $doc = $parser->parsefile ("file.xml");
+
+ # print all HREF attributes of all CODEBASE elements
+ my $nodes = $doc->getElementsByTagName ("CODEBASE");
+ my $n = $nodes->getLength;
+
+ for (my $i = 0; $i < $n; $i++)
+ {
+ my $node = $nodes->item ($i);
+ my $href = $node->getAttributeNode ("HREF");
+ print $href->getValue . "\n";
+ }
+
+ # Print doc file
+ $doc->printToFile ("out.xml");
+
+ # Print to string
+ print $doc->toString;
+
+ # Avoid memory leaks - cleanup circular references for garbage collection
+ $doc->dispose;
+
+=head1 DESCRIPTION
+
+This module extends the XML::Parser module by Clark Cooper.
+The XML::Parser module is built on top of XML::Parser::Expat,
+which is a lower level interface to James Clark's expat library.
+
+XML::DOM::Parser is derived from XML::Parser. It parses XML strings or files
+and builds a data structure that conforms to the API of the Document Object
+Model as described at http://www.w3.org/TR/REC-DOM-Level-1.
+See the XML::Parser manpage for other available features of the
+XML::DOM::Parser class.
+Note that the 'Style' property should not be used (it is set internally.)
+
+The XML::Parser I<NoExpand> option is more or less supported, in that it will
+generate EntityReference objects whenever an entity reference is encountered
+in character data. I'm not sure how useful this is. Any comments are welcome.
+
+As described in the synopsis, when you create an XML::DOM::Parser object,
+the parse and parsefile methods create an I<XML::DOM::Document> object
+from the specified input. This Document object can then be examined, modified and
+written back out to a file or converted to a string.
+
+When using XML::DOM with XML::Parser version 2.19 and up, setting the
+XML::DOM::Parser option I<KeepCDATA> to 1 will store CDATASections in
+CDATASection nodes, instead of converting them to Text nodes.
+Subsequent CDATASection nodes will be merged into one. Let me know if this
+is a problem.
+
+When using XML::Parser 2.27 and above, you can suppress expansion of
+parameter entity references (e.g. %pent;) in the DTD, by setting I<ParseParamEnt>
+to 1 and I<ExpandParamEnt> to 0. See L<Hidden Nodes|/_Hidden_Nodes_> for details.
+
+A Document has a tree structure consisting of I<Node> objects. A Node may contain
+other nodes, depending on its type.
+A Document may have Element, Text, Comment, and CDATASection nodes.
+Element nodes may have Attr, Element, Text, Comment, and CDATASection nodes.
+The other nodes may not have any child nodes.
+
+This module adds several node types that are not part of the DOM spec (yet.)
+These are: ElementDecl (for <!ELEMENT ...> declarations), AttlistDecl (for
+<!ATTLIST ...> declarations), XMLDecl (for <?xml ...?> declarations) and AttDef
+(for attribute definitions in an AttlistDecl.)
+
+=head1 XML::DOM Classes
+
+The XML::DOM module stores XML documents in a tree structure with a root node
+of type XML::DOM::Document. Different nodes in tree represent different
+parts of the XML file. The DOM Level 1 Specification defines the following
+node types:
+
+=over 4
+
+=item * L<XML::DOM::Node> - Super class of all node types
+
+=item * L<XML::DOM::Document> - The root of the XML document
+
+=item * L<XML::DOM::DocumentType> - Describes the document structure: <!DOCTYPE root [ ... ]>
+
+=item * L<XML::DOM::Element> - An XML element: <elem attr="val"> ... </elem>
+
+=item * L<XML::DOM::Attr> - An XML element attribute: name="value"
+
+=item * L<XML::DOM::CharacterData> - Super class of Text, Comment and CDATASection
+
+=item * L<XML::DOM::Text> - Text in an XML element
+
+=item * L<XML::DOM::CDATASection> - Escaped block of text: <![CDATA[ text ]]>
+
+=item * L<XML::DOM::Comment> - An XML comment: <!-- comment -->
+
+=item * L<XML::DOM::EntityReference> - Refers to an ENTITY: &ent; or %ent;
+
+=item * L<XML::DOM::Entity> - An ENTITY definition: <!ENTITY ...>
+
+=item * L<XML::DOM::ProcessingInstruction> - <?PI target>
+
+=item * L<XML::DOM::DocumentFragment> - Lightweight node for cut & paste
+
+=item * L<XML::DOM::Notation> - An NOTATION definition: <!NOTATION ...>
+
+=back
+
+In addition, the XML::DOM module contains the following nodes that are not part
+of the DOM Level 1 Specification:
+
+=over 4
+
+=item * L<XML::DOM::ElementDecl> - Defines an element: <!ELEMENT ...>
+
+=item * L<XML::DOM::AttlistDecl> - Defines one or more attributes in an <!ATTLIST ...>
+
+=item * L<XML::DOM::AttDef> - Defines one attribute in an <!ATTLIST ...>
+
+=item * L<XML::DOM::XMLDecl> - An XML declaration: <?xml version="1.0" ...>
+
+=back
+
+Other classes that are part of the DOM Level 1 Spec:
+
+=over 4
+
+=item * L<XML::DOM::Implementation> - Provides information about this implementation. Currently it doesn't do much.
+
+=item * L<XML::DOM::NodeList> - Used internally to store a node's child nodes. Also returned by getElementsByTagName.
+
+=item * L<XML::DOM::NamedNodeMap> - Used internally to store an element's attributes.
+
+=back
+
+Other classes that are not part of the DOM Level 1 Spec:
+
+=over 4
+
+=item * L<XML::DOM::Parser> - An non-validating XML parser that creates XML::DOM::Documents
+
+=item * L<XML::DOM::ValParser> - A validating XML parser that creates XML::DOM::Documents. It uses L<XML::Checker> to check against the DocumentType (DTD)
+
+=item * L<XML::Handler::BuildDOM> - A PerlSAX handler that creates XML::DOM::Documents.
+
+=back
+
+=head1 XML::DOM package
+
+=over 4
+
+=item Constant definitions
+
+The following predefined constants indicate which type of node it is.
+
+=back
+
+ UNKNOWN_NODE (0) The node type is unknown (not part of DOM)
+
+ ELEMENT_NODE (1) The node is an Element.
+ ATTRIBUTE_NODE (2) The node is an Attr.
+ TEXT_NODE (3) The node is a Text node.
+ CDATA_SECTION_NODE (4) The node is a CDATASection.
+ ENTITY_REFERENCE_NODE (5) The node is an EntityReference.
+ ENTITY_NODE (6) The node is an Entity.
+ PROCESSING_INSTRUCTION_NODE (7) The node is a ProcessingInstruction.
+ COMMENT_NODE (8) The node is a Comment.
+ DOCUMENT_NODE (9) The node is a Document.
+ DOCUMENT_TYPE_NODE (10) The node is a DocumentType.
+ DOCUMENT_FRAGMENT_NODE (11) The node is a DocumentFragment.
+ NOTATION_NODE (12) The node is a Notation.
+
+ ELEMENT_DECL_NODE (13) The node is an ElementDecl (not part of DOM)
+ ATT_DEF_NODE (14) The node is an AttDef (not part of DOM)
+ XML_DECL_NODE (15) The node is an XMLDecl (not part of DOM)
+ ATTLIST_DECL_NODE (16) The node is an AttlistDecl (not part of DOM)
+
+ Usage:
+
+ if ($node->getNodeType == ELEMENT_NODE)
+ {
+ print "It's an Element";
+ }
+
+B<Not In DOM Spec>: The DOM Spec does not mention UNKNOWN_NODE and,
+quite frankly, you should never encounter it. The last 4 node types were added
+to support the 4 added node classes.
+
+=head2 Global Variables
+
+=over 4
+
+=item $VERSION
+
+The variable $XML::DOM::VERSION contains the version number of this
+implementation, e.g. "1.07".
+
+=back
+
+=head2 METHODS
+
+These methods are not part of the DOM Level 1 Specification.
+
+=over 4
+
+=item getIgnoreReadOnly and ignoreReadOnly (readOnly)
+
+The DOM Level 1 Spec does not allow you to edit certain sections of the document,
+e.g. the DocumentType, so by default this implementation throws DOMExceptions
+(i.e. NO_MODIFICATION_ALLOWED_ERR) when you try to edit a readonly node.
+These readonly checks can be disabled by (temporarily) setting the global
+IgnoreReadOnly flag.
+
+The ignoreReadOnly method sets the global IgnoreReadOnly flag and returns its
+previous value. The getIgnoreReadOnly method simply returns its current value.
+
+ my $oldIgnore = XML::DOM::ignoreReadOnly (1);
+ eval {
+ ... do whatever you want, catching any other exceptions ...
+ };
+ XML::DOM::ignoreReadOnly ($oldIgnore); # restore previous value
+
+Another way to do it, using a local variable:
+
+ { # start new scope
+ local $XML::DOM::IgnoreReadOnly = 1;
+ ... do whatever you want, don't worry about exceptions ...
+ } # end of scope ($IgnoreReadOnly is set back to its previous value)
+
+
+=item isValidName (name)
+
+Whether the specified name is a valid "Name" as specified in the XML spec.
+Characters with Unicode values > 127 are now also supported.
+
+=item getAllowReservedNames and allowReservedNames (boolean)
+
+The first method returns whether reserved names are allowed.
+The second takes a boolean argument and sets whether reserved names are allowed.
+The initial value is 1 (i.e. allow reserved names.)
+
+The XML spec states that "Names" starting with (X|x)(M|m)(L|l)
+are reserved for future use. (Amusingly enough, the XML version of the XML spec
+(REC-xml-19980210.xml) breaks that very rule by defining an ENTITY with the name
+'xmlpio'.)
+A "Name" in this context means the Name token as found in the BNF rules in the
+XML spec.
+
+XML::DOM only checks for errors when you modify the DOM tree, not when the
+DOM tree is built by the XML::DOM::Parser.
+
+=item setTagCompression (funcref)
+
+There are 3 possible styles for printing empty Element tags:
+
+=over 4
+
+=item Style 0
+
+ <empty/> or <empty attr="val"/>
+
+XML::DOM uses this style by default for all Elements.
+
+=item Style 1
+
+ <empty></empty> or <empty attr="val"></empty>
+
+=item Style 2
+
+ <empty /> or <empty attr="val" />
+
+This style is sometimes desired when using XHTML.
+(Note the extra space before the slash "/")
+See L<http://www.w3.org/TR/xhtml1> Appendix C for more details.
+
+=back
+
+By default XML::DOM compresses all empty Element tags (style 0.)
+You can control which style is used for a particular Element by calling
+XML::DOM::setTagCompression with a reference to a function that takes
+2 arguments. The first is the tag name of the Element, the second is the
+XML::DOM::Element that is being printed.
+The function should return 0, 1 or 2 to indicate which style should be used to
+print the empty tag. E.g.
+
+ XML::DOM::setTagCompression (\&my_tag_compression);
+
+ sub my_tag_compression
+ {
+ my ($tag, $elem) = @_;
+
+ # Print empty br, hr and img tags like this: <br />
+ return 2 if $tag =~ /^(br|hr|img)$/;
+
+ # Print other empty tags like this: <empty></empty>
+ return 1;
+ }
+
+=back
+
+=head1 IMPLEMENTATION DETAILS
+
+=over 4
+
+=item * Perl Mappings
+
+The value undef was used when the DOM Spec said null.
+
+The DOM Spec says: Applications must encode DOMString using UTF-16 (defined in
+Appendix C.3 of [UNICODE] and Amendment 1 of [ISO-10646]).
+In this implementation we use plain old Perl strings encoded in UTF-8 instead of
+UTF-16.
+
+=item * Text and CDATASection nodes
+
+The Expat parser expands EntityReferences and CDataSection sections to
+raw strings and does not indicate where it was found.
+This implementation does therefore convert both to Text nodes at parse time.
+CDATASection and EntityReference nodes that are added to an existing Document
+(by the user) will be preserved.
+
+Also, subsequent Text nodes are always merged at parse time. Text nodes that are
+added later can be merged with the normalize method. Consider using the addText
+method when adding Text nodes.
+
+=item * Printing and toString
+
+When printing (and converting an XML Document to a string) the strings have to
+encoded differently depending on where they occur. E.g. in a CDATASection all
+substrings are allowed except for "]]>". In regular text, certain characters are
+not allowed, e.g. ">" has to be converted to ">".
+These routines should be verified by someone who knows the details.
+
+=item * Quotes
+
+Certain sections in XML are quoted, like attribute values in an Element.
+XML::Parser strips these quotes and the print methods in this implementation
+always uses double quotes, so when parsing and printing a document, single quotes
+may be converted to double quotes. The default value of an attribute definition
+(AttDef) in an AttlistDecl, however, will maintain its quotes.
+
+=item * AttlistDecl
+
+Attribute declarations for a certain Element are always merged into a single
+AttlistDecl object.
+
+=item * Comments
+
+Comments in the DOCTYPE section are not kept in the right place. They will become
+child nodes of the Document.
+
+=item * Hidden Nodes
+
+Previous versions of XML::DOM would expand parameter entity references
+(like B<%pent;>), so when printing the DTD, it would print the contents
+of the external entity, instead of the parameter entity reference.
+With this release (1.27), you can prevent this by setting the XML::DOM::Parser
+options ParseParamEnt => 1 and ExpandParamEnt => 0.
+
+When it is parsing the contents of the external entities, it *DOES* still add
+the nodes to the DocumentType, but it marks these nodes by setting
+the 'Hidden' property. In addition, it adds an EntityReference node to the
+DocumentType node.
+
+When printing the DocumentType node (or when using to_expat() or to_sax()),
+the 'Hidden' nodes are suppressed, so you will see the parameter entity
+reference instead of the contents of the external entities. See test case
+t/dom_extent.t for an example.
+
+The reason for adding the 'Hidden' nodes to the DocumentType node, is that
+the nodes may contain <!ENTITY> definitions that are referenced further
+in the document. (Simply not adding the nodes to the DocumentType could
+cause such entity references to be expanded incorrectly.)
+
+Note that you need XML::Parser 2.27 or higher for this to work correctly.
+
+=back
+
+=head1 SEE ALSO
+
+The Japanese version of this document by Takanori Kawai (Hippo2000)
+at L<http://member.nifty.ne.jp/hippo2000/perltips/xml/dom.htm>
+
+The DOM Level 1 specification at L<http://www.w3.org/TR/REC-DOM-Level-1>
+
+The XML spec (Extensible Markup Language 1.0) at L<http://www.w3.org/TR/REC-xml>
+
+The L<XML::Parser> and L<XML::Parser::Expat> manual pages.
+
+=head1 CAVEATS
+
+The method getElementsByTagName() does not return a "live" NodeList.
+Whether this is an actual caveat is debatable, but a few people on the
+www-dom mailing list seemed to think so. I haven't decided yet. It's a pain
+to implement, it slows things down and the benefits seem marginal.
+Let me know what you think.
+
+(To subscribe to the www-dom mailing list send an email with the subject
+"subscribe" to www-dom-request@w3.org. I only look here occasionally, so don't
+send bug reports or suggestions about XML::DOM to this list, send them
+to enno@att.com instead.)
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+Thanks to Clark Cooper for his help with the initial version.
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/AttDef.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,36 @@
+=head1 NAME
+
+XML::DOM::AttDef - A single XML attribute definition in an ATTLIST in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::AttDef extends L<XML::DOM::Node>, but is not part of the DOM Level 1
+specification.
+
+Each object of this class represents one attribute definition in an AttlistDecl.
+
+=head2 METHODS
+
+=over 4
+
+=item getName
+
+Returns the attribute name.
+
+=item getDefault
+
+Returns the default value, or undef.
+
+=item isFixed
+
+Whether the attribute value is fixed (see #FIXED keyword.)
+
+=item isRequired
+
+Whether the attribute value is required (see #REQUIRED keyword.)
+
+=item isImplied
+
+Whether the attribute value is implied (see #IMPLIED keyword.)
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/AttlistDecl.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,45 @@
+=head1 NAME
+
+XML::DOM::AttlistDecl - An XML ATTLIST declaration in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::AttlistDecl extends L<XML::DOM::Node> but is not part of the
+DOM Level 1 specification.
+
+This node represents an ATTLIST declaration, e.g.
+
+ <!ATTLIST person
+ sex (male|female) #REQUIRED
+ hair CDATA "bold"
+ eyes (none|one|two) "two"
+ species (human) #FIXED "human">
+
+Each attribute definition is stored a separate AttDef node. The AttDef nodes can
+be retrieved with getAttDef and added with addAttDef.
+(The AttDef nodes are stored in a NamedNodeMap internally.)
+
+=head2 METHODS
+
+=over 4
+
+=item getName
+
+Returns the Element tagName.
+
+=item getAttDef (attrName)
+
+Returns the AttDef node for the attribute with the specified name.
+
+=item addAttDef (attrName, type, default, [ fixed ])
+
+Adds a AttDef node for the attribute with the specified name.
+
+Parameters:
+ I<attrName> the attribute name.
+ I<type> the attribute type (e.g. "CDATA" or "(male|female)".)
+ I<default> the default value enclosed in quotes (!), the string #IMPLIED or
+ the string #REQUIRED.
+ I<fixed> whether the attribute is '#FIXED' (default is 0.)
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/Attr.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,67 @@
+=head1 NAME
+
+XML::DOM::Attr - An XML attribute in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::Attr extends L<XML::DOM::Node>.
+
+The Attr nodes built by the XML::DOM::Parser always have one child node
+which is a Text node containing the expanded string value (i.e. EntityReferences
+are always expanded.) EntityReferences may be added when modifying or creating
+a new Document.
+
+The Attr interface represents an attribute in an Element object.
+Typically the allowable values for the attribute are defined in a
+document type definition.
+
+Attr objects inherit the Node interface, but since they are not
+actually child nodes of the element they describe, the DOM does not
+consider them part of the document tree. Thus, the Node attributes
+parentNode, previousSibling, and nextSibling have a undef value for Attr
+objects. The DOM takes the view that attributes are properties of
+elements rather than having a separate identity from the elements they
+are associated with; this should make it more efficient to implement
+such features as default attributes associated with all elements of a
+given type. Furthermore, Attr nodes may not be immediate children of a
+DocumentFragment. However, they can be associated with Element nodes
+contained within a DocumentFragment. In short, users and implementors
+of the DOM need to be aware that Attr nodes have some things in common
+with other objects inheriting the Node interface, but they also are
+quite distinct.
+
+The attribute's effective value is determined as follows: if this
+attribute has been explicitly assigned any value, that value is the
+attribute's effective value; otherwise, if there is a declaration for
+this attribute, and that declaration includes a default value, then
+that default value is the attribute's effective value; otherwise, the
+attribute does not exist on this element in the structure model until
+it has been explicitly added. Note that the nodeValue attribute on the
+Attr instance can also be used to retrieve the string version of the
+attribute's value(s).
+
+In XML, where the value of an attribute can contain entity references,
+the child nodes of the Attr node provide a representation in which
+entity references are not expanded. These child nodes may be either
+Text or EntityReference nodes. Because the attribute type may be
+unknown, there are no tokenized attribute values.
+
+=head2 METHODS
+
+=over 4
+
+=item getValue
+
+On retrieval, the value of the attribute is returned as a string.
+Character and general entity references are replaced with their values.
+
+=item setValue (str)
+
+DOM Spec: On setting, this creates a Text node with the unparsed contents of the
+string.
+
+=item getName
+
+Returns the name of this attribute.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/CDATASection.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,31 @@
+=head1 NAME
+
+XML::DOM::CDATASection - Escaping XML text blocks in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::CDATASection extends L<XML::DOM::CharacterData> which extends
+L<XML::DOM::Node>.
+
+CDATA sections are used to escape blocks of text containing characters
+that would otherwise be regarded as markup. The only delimiter that is
+recognized in a CDATA section is the "]]>" string that ends the CDATA
+section. CDATA sections can not be nested. The primary purpose is for
+including material such as XML fragments, without needing to escape all
+the delimiters.
+
+The DOMString attribute of the Text node holds the text that is
+contained by the CDATA section. Note that this may contain characters
+that need to be escaped outside of CDATA sections and that, depending
+on the character encoding ("charset") chosen for serialization, it may
+be impossible to write out some characters as part of a CDATA section.
+
+The CDATASection interface inherits the CharacterData interface through
+the Text interface. Adjacent CDATASections nodes are not merged by use
+of the Element.normalize() method.
+
+B<NOTE:> XML::DOM::Parser and XML::DOM::ValParser convert all CDATASections
+to regular text by default.
+To preserve CDATASections, set the parser option KeepCDATA to 1.
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/CharacterData.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,87 @@
+=head1 NAME
+
+XML::DOM::CharacterData - Common interface for Text, CDATASections and Comments
+
+=head1 DESCRIPTION
+
+XML::DOM::CharacterData extends L<XML::DOM::Node>
+
+The CharacterData interface extends Node with a set of attributes and
+methods for accessing character data in the DOM. For clarity this set
+is defined here rather than on each object that uses these attributes
+and methods. No DOM objects correspond directly to CharacterData,
+though Text, Comment and CDATASection do inherit the interface from it.
+All offsets in this interface start from 0.
+
+=head2 METHODS
+
+=over 4
+
+=item getData and setData (data)
+
+The character data of the node that implements this
+interface. The DOM implementation may not put arbitrary
+limits on the amount of data that may be stored in a
+CharacterData node. However, implementation limits may mean
+that the entirety of a node's data may not fit into a single
+DOMString. In such cases, the user may call substringData to
+retrieve the data in appropriately sized pieces.
+
+=item getLength
+
+The number of characters that are available through data and
+the substringData method below. This may have the value zero,
+i.e., CharacterData nodes may be empty.
+
+=item substringData (offset, count)
+
+Extracts a range of data from the node.
+
+Parameters:
+ I<offset> Start offset of substring to extract.
+ I<count> The number of characters to extract.
+
+Return Value: The specified substring. If the sum of offset and count
+exceeds the length, then all characters to the end of
+the data are returned.
+
+=item appendData (str)
+
+Appends the string to the end of the character data of the
+node. Upon success, data provides access to the concatenation
+of data and the DOMString specified.
+
+=item insertData (offset, arg)
+
+Inserts a string at the specified character offset.
+
+Parameters:
+ I<offset> The character offset at which to insert.
+ I<arg> The DOMString to insert.
+
+=item deleteData (offset, count)
+
+Removes a range of characters from the node.
+Upon success, data and length reflect the change.
+If the sum of offset and count exceeds length then all characters
+from offset to the end of the data are deleted.
+
+Parameters:
+ I<offset> The offset from which to remove characters.
+ I<count> The number of characters to delete.
+
+=item replaceData (offset, count, arg)
+
+Replaces the characters starting at the specified character
+offset with the specified string.
+
+Parameters:
+ I<offset> The offset from which to start replacing.
+ I<count> The number of characters to replace.
+ I<arg> The DOMString with which the range must be replaced.
+
+If the sum of offset and count exceeds length, then all characters to the end of
+the data are replaced (i.e., the effect is the same as a remove method call with
+the same range, followed by an append method invocation).
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/Comment.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,14 @@
+=head1 NAME
+
+XML::DOM::Comment - An XML comment in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::Comment extends L<XML::DOM::CharacterData> which extends
+L<XML::DOM::Node>.
+
+This node represents the content of a comment, i.e., all the characters
+between the starting '<!--' and ending '-->'. Note that this is the
+definition of a comment in XML, and, in practice, HTML, although some
+HTML tools may implement the full SGML comment structure.
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/DOMException.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,103 @@
+#
+# 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:
+#
+######################################################################
+package XML::DOM::DOMException;
+######################################################################
+
+use Exporter;
+
+use overload '""' => \&stringify;
+use vars qw ( @ISA @EXPORT @ErrorNames );
+
+BEGIN
+{
+ @ISA = qw( Exporter );
+ @EXPORT = qw( INDEX_SIZE_ERR
+ DOMSTRING_SIZE_ERR
+ HIERARCHY_REQUEST_ERR
+ WRONG_DOCUMENT_ERR
+ INVALID_CHARACTER_ERR
+ NO_DATA_ALLOWED_ERR
+ NO_MODIFICATION_ALLOWED_ERR
+ NOT_FOUND_ERR
+ NOT_SUPPORTED_ERR
+ INUSE_ATTRIBUTE_ERR
+ );
+}
+
+sub UNKNOWN_ERR () {0;} # not in the DOM Spec!
+sub INDEX_SIZE_ERR () {1;}
+sub DOMSTRING_SIZE_ERR () {2;}
+sub HIERARCHY_REQUEST_ERR () {3;}
+sub WRONG_DOCUMENT_ERR () {4;}
+sub INVALID_CHARACTER_ERR () {5;}
+sub NO_DATA_ALLOWED_ERR () {6;}
+sub NO_MODIFICATION_ALLOWED_ERR () {7;}
+sub NOT_FOUND_ERR () {8;}
+sub NOT_SUPPORTED_ERR () {9;}
+sub INUSE_ATTRIBUTE_ERR () {10;}
+
+@ErrorNames = (
+ "UNKNOWN_ERR",
+ "INDEX_SIZE_ERR",
+ "DOMSTRING_SIZE_ERR",
+ "HIERARCHY_REQUEST_ERR",
+ "WRONG_DOCUMENT_ERR",
+ "INVALID_CHARACTER_ERR",
+ "NO_DATA_ALLOWED_ERR",
+ "NO_MODIFICATION_ALLOWED_ERR",
+ "NOT_FOUND_ERR",
+ "NOT_SUPPORTED_ERR",
+ "INUSE_ATTRIBUTE_ERR"
+ );
+sub new
+{
+ my ($type, $code, $msg) = @_;
+ my $self = bless {Code => $code}, $type;
+
+ $self->{Message} = $msg if defined $msg;
+
+# print "=> Exception: " . $self->stringify . "\n";
+ $self;
+}
+
+sub getCode
+{
+ $_[0]->{Code};
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub getName
+{
+ $ErrorNames[$_[0]->{Code}];
+}
+
+sub getMessage
+{
+ $_[0]->{Message};
+}
+
+sub stringify
+{
+ my $self = shift;
+
+ "XML::DOM::DOMException(Code=" . $self->getCode . ", Name=" .
+ $self->getName . ", Message=" . $self->getMessage . ")";
+}
+
+1; # package return code
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/DOMImplementation.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,24 @@
+=head1 NAME
+
+XML::DOM::DOMImplementation - Information about XML::DOM implementation
+
+=head1 DESCRIPTION
+
+The DOMImplementation interface provides a number of methods for
+performing operations that are independent of any particular instance
+of the document object model.
+
+The DOM Level 1 does not specify a way of creating a document instance,
+and hence document creation is an operation specific to an
+implementation. Future Levels of the DOM specification are expected to
+provide methods for creating documents directly.
+
+=head2 METHODS
+
+=over 4
+
+=item hasFeature (feature, version)
+
+Returns 1 if and only if feature equals "XML" and version equals "1.0".
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/Document.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,220 @@
+=head1 NAME
+
+XML::DOM::Document - An XML document node in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::Document extends L<XML::DOM::Node>.
+
+It is the main root of the XML document structure as returned by
+XML::DOM::Parser::parse and XML::DOM::Parser::parsefile.
+
+Since elements, text nodes, comments, processing instructions, etc.
+cannot exist outside the context of a Document, the Document interface
+also contains the factory methods needed to create these objects. The
+Node objects created have a getOwnerDocument method which associates
+them with the Document within whose context they were created.
+
+=head2 METHODS
+
+=over 4
+
+=item getDocumentElement
+
+This is a convenience method that allows direct access to
+the child node that is the root Element of the document.
+
+=item getDoctype
+
+The Document Type Declaration (see DocumentType) associated
+with this document. For HTML documents as well as XML
+documents without a document type declaration this returns
+undef. The DOM Level 1 does not support editing the Document
+Type Declaration.
+
+B<Not In DOM Spec>: This implementation allows editing the doctype.
+See I<XML::DOM::ignoreReadOnly> for details.
+
+=item getImplementation
+
+The DOMImplementation object that handles this document. A
+DOM application may use objects from multiple implementations.
+
+=item createElement (tagName)
+
+Creates an element of the type specified. Note that the
+instance returned implements the Element interface, so
+attributes can be specified directly on the returned object.
+
+DOMExceptions:
+
+=over 4
+
+=item * INVALID_CHARACTER_ERR
+
+Raised if the tagName does not conform to the XML spec.
+
+=back
+
+=item createTextNode (data)
+
+Creates a Text node given the specified string.
+
+=item createComment (data)
+
+Creates a Comment node given the specified string.
+
+=item createCDATASection (data)
+
+Creates a CDATASection node given the specified string.
+
+=item createAttribute (name [, value [, specified ]])
+
+Creates an Attr of the given name. Note that the Attr
+instance can then be set on an Element using the setAttribute method.
+
+B<Not In DOM Spec>: The DOM Spec does not allow passing the value or the
+specified property in this method. In this implementation they are optional.
+
+Parameters:
+ I<value> The attribute's value. See Attr::setValue for details.
+ If the value is not supplied, the specified property is set to 0.
+ I<specified> Whether the attribute value was specified or whether the default
+ value was used. If not supplied, it's assumed to be 1.
+
+DOMExceptions:
+
+=over 4
+
+=item * INVALID_CHARACTER_ERR
+
+Raised if the name does not conform to the XML spec.
+
+=back
+
+=item createProcessingInstruction (target, data)
+
+Creates a ProcessingInstruction node given the specified name and data strings.
+
+Parameters:
+ I<target> The target part of the processing instruction.
+ I<data> The data for the node.
+
+DOMExceptions:
+
+=over 4
+
+=item * INVALID_CHARACTER_ERR
+
+Raised if the target does not conform to the XML spec.
+
+=back
+
+=item createDocumentFragment
+
+Creates an empty DocumentFragment object.
+
+=item createEntityReference (name)
+
+Creates an EntityReference object.
+
+=back
+
+=head2 Additional methods not in the DOM Spec
+
+=over 4
+
+=item getXMLDecl and setXMLDecl (xmlDecl)
+
+Returns the XMLDecl for this Document or undef if none was specified.
+Note that XMLDecl is not part of the list of child nodes.
+
+=item setDoctype (doctype)
+
+Sets or replaces the DocumentType.
+B<NOTE>: Don't use appendChild or insertBefore to set the DocumentType.
+Even though doctype will be part of the list of child nodes, it is handled
+specially.
+
+=item getDefaultAttrValue (elem, attr)
+
+Returns the default attribute value as a string or undef, if none is available.
+
+Parameters:
+ I<elem> The element tagName.
+ I<attr> The attribute name.
+
+=item getEntity (name)
+
+Returns the Entity with the specified name.
+
+=item createXMLDecl (version, encoding, standalone)
+
+Creates an XMLDecl object. All parameters may be undefined.
+
+=item createDocumentType (name, sysId, pubId)
+
+Creates a DocumentType object. SysId and pubId may be undefined.
+
+=item createNotation (name, base, sysId, pubId)
+
+Creates a new Notation object. Consider using
+XML::DOM::DocumentType::addNotation!
+
+=item createEntity (parameter, notationName, value, sysId, pubId, ndata)
+
+Creates an Entity object. Consider using XML::DOM::DocumentType::addEntity!
+
+=item createElementDecl (name, model)
+
+Creates an ElementDecl object.
+
+DOMExceptions:
+
+=over 4
+
+=item * INVALID_CHARACTER_ERR
+
+Raised if the element name (tagName) does not conform to the XML spec.
+
+=back
+
+=item createAttlistDecl (name)
+
+Creates an AttlistDecl object.
+
+DOMExceptions:
+
+=over 4
+
+=item * INVALID_CHARACTER_ERR
+
+Raised if the element name (tagName) does not conform to the XML spec.
+
+=back
+
+=item expandEntity (entity [, parameter])
+
+Expands the specified entity or parameter entity (if parameter=1) and returns
+its value as a string, or undef if the entity does not exist.
+(The entity name should not contain the '%', '&' or ';' delimiters.)
+
+=item check ( [$checker] )
+
+Uses the specified L<XML::Checker> to validate the document.
+If no XML::Checker is supplied, a new XML::Checker is created.
+See L<XML::Checker> for details.
+
+=item check_sax ( [$checker] )
+
+Similar to check() except it uses the SAX interface to XML::Checker instead of
+the expat interface. This method may disappear or replace check() at some time.
+
+=item createChecker ()
+
+Creates an XML::Checker based on the document's DTD.
+The $checker can be reused to check any elements within the document.
+Create a new L<XML::Checker> whenever the DOCTYPE section of the document
+is altered!
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/DocumentFragment.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,40 @@
+=head1 NAME
+
+XML::DOM::DocumentFragment - Facilitates cut & paste in XML::DOM documents
+
+=head1 DESCRIPTION
+
+XML::DOM::DocumentFragment extends L<XML::DOM::Node>
+
+DocumentFragment is a "lightweight" or "minimal" Document object. It is
+very common to want to be able to extract a portion of a document's
+tree or to create a new fragment of a document. Imagine implementing a
+user command like cut or rearranging a document by moving fragments
+around. It is desirable to have an object which can hold such fragments
+and it is quite natural to use a Node for this purpose. While it is
+true that a Document object could fulfil this role, a Document object
+can potentially be a heavyweight object, depending on the underlying
+implementation. What is really needed for this is a very lightweight
+object. DocumentFragment is such an object.
+
+Furthermore, various operations -- such as inserting nodes as children
+of another Node -- may take DocumentFragment objects as arguments; this
+results in all the child nodes of the DocumentFragment being moved to
+the child list of this node.
+
+The children of a DocumentFragment node are zero or more nodes
+representing the tops of any sub-trees defining the structure of the
+document. DocumentFragment nodes do not need to be well-formed XML
+documents (although they do need to follow the rules imposed upon
+well-formed XML parsed entities, which can have multiple top nodes).
+For example, a DocumentFragment might have only one child and that
+child node could be a Text node. Such a structure model represents
+neither an HTML document nor a well-formed XML document.
+
+When a DocumentFragment is inserted into a Document (or indeed any
+other Node that may take children) the children of the DocumentFragment
+and not the DocumentFragment itself are inserted into the Node. This
+makes the DocumentFragment very useful when the user wishes to create
+nodes that are siblings; the DocumentFragment acts as the parent of
+these nodes so that the user can use the standard methods from the Node
+interface, such as insertBefore() and appendChild().
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/DocumentType.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,182 @@
+=head1 NAME
+
+XML::DOM::DocumentType - An XML document type (DTD) in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::DocumentType extends L<XML::DOM::Node>.
+
+Each Document has a doctype attribute whose value is either null or a
+DocumentType object. The DocumentType interface in the DOM Level 1 Core
+provides an interface to the list of entities that are defined for the
+document, and little else because the effect of namespaces and the
+various XML scheme efforts on DTD representation are not clearly
+understood as of this writing.
+The DOM Level 1 doesn't support editing DocumentType nodes.
+
+B<Not In DOM Spec>: This implementation has added a lot of extra
+functionality to the DOM Level 1 interface.
+To allow editing of the DocumentType nodes, see XML::DOM::ignoreReadOnly.
+
+=head2 METHODS
+
+=over 4
+
+=item getName
+
+Returns the name of the DTD, i.e. the name immediately following the
+DOCTYPE keyword.
+
+=item getEntities
+
+A NamedNodeMap containing the general entities, both external
+and internal, declared in the DTD. Duplicates are discarded.
+For example in:
+
+ <!DOCTYPE ex SYSTEM "ex.dtd" [
+ <!ENTITY foo "foo">
+ <!ENTITY bar "bar">
+ <!ENTITY % baz "baz">
+ ]>
+ <ex/>
+
+the interface provides access to foo and bar but not baz.
+Every node in this map also implements the Entity interface.
+
+The DOM Level 1 does not support editing entities, therefore
+entities cannot be altered in any way.
+
+B<Not In DOM Spec>: See XML::DOM::ignoreReadOnly to edit the DocumentType etc.
+
+=item getNotations
+
+A NamedNodeMap containing the notations declared in the DTD.
+Duplicates are discarded. Every node in this map also
+implements the Notation interface.
+
+The DOM Level 1 does not support editing notations, therefore
+notations cannot be altered in any way.
+
+B<Not In DOM Spec>: See XML::DOM::ignoreReadOnly to edit the DocumentType etc.
+
+=head2 Additional methods not in the DOM Spec
+
+=item Creating and setting the DocumentType
+
+A new DocumentType can be created with:
+
+ $doctype = $doc->createDocumentType ($name, $sysId, $pubId, $internal);
+
+To set (or replace) the DocumentType for a particular document, use:
+
+ $doc->setDocType ($doctype);
+
+=item getSysId and setSysId (sysId)
+
+Returns or sets the system id.
+
+=item getPubId and setPubId (pudId)
+
+Returns or sets the public id.
+
+=item setName (name)
+
+Sets the name of the DTD, i.e. the name immediately following the
+DOCTYPE keyword. Note that this should always be the same as the element
+tag name of the root element.
+
+=item getAttlistDecl (elemName)
+
+Returns the AttlistDecl for the Element with the specified name, or undef.
+
+=item getElementDecl (elemName)
+
+Returns the ElementDecl for the Element with the specified name, or undef.
+
+=item getEntity (entityName)
+
+Returns the Entity with the specified name, or undef.
+
+=item addAttlistDecl (elemName)
+
+Adds a new AttDecl node with the specified elemName if one doesn't exist yet.
+Returns the AttlistDecl (new or existing) node.
+
+=item addElementDecl (elemName, model)
+
+Adds a new ElementDecl node with the specified elemName and model if one doesn't
+exist yet.
+Returns the AttlistDecl (new or existing) node. The model is ignored if one
+already existed.
+
+=item addEntity (parameter, notationName, value, sysId, pubId, ndata)
+
+Adds a new Entity node. Don't use createEntity and appendChild, because it should
+be added to the internal NamedNodeMap containing the entities.
+
+Parameters:
+ I<parameter> whether it is a parameter entity (%ent;) or not (&ent;).
+ I<notationName> the entity name.
+ I<value> the entity value.
+ I<sysId> the system id (if any.)
+ I<pubId> the public id (if any.)
+ I<ndata> the NDATA declaration (if any, for general unparsed entities.)
+
+SysId, pubId and ndata may be undefined.
+
+DOMExceptions:
+
+=over 4
+
+=item * INVALID_CHARACTER_ERR
+
+Raised if the notationName does not conform to the XML spec.
+
+=back
+
+=item addNotation (name, base, sysId, pubId)
+
+Adds a new Notation object.
+
+Parameters:
+ I<name> the notation name.
+ I<base> the base to be used for resolving a relative URI.
+ I<sysId> the system id.
+ I<pubId> the public id.
+
+Base, sysId, and pubId may all be undefined.
+(These parameters are passed by the XML::Parser Notation handler.)
+
+DOMExceptions:
+
+=over 4
+
+=item * INVALID_CHARACTER_ERR
+
+Raised if the notationName does not conform to the XML spec.
+
+=back
+
+=item addAttDef (elemName, attrName, type, default, fixed)
+
+Adds a new attribute definition. It will add the AttDef node to the AttlistDecl
+if it exists. If an AttDef with the specified attrName already exists for the
+given elemName, this function only generates a warning.
+
+See XML::DOM::AttDef::new for the other parameters.
+
+=item getDefaultAttrValue (elem, attr)
+
+Returns the default attribute value as a string or undef, if none is available.
+
+Parameters:
+ I<elem> The element tagName.
+ I<attr> The attribute name.
+
+=item expandEntity (entity [, parameter])
+
+Expands the specified entity or parameter entity (if parameter=1) and returns
+its value as a string, or undef if the entity does not exist.
+(The entity name should not contain the '%', '&' or ';' delimiters.)
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/Element.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,189 @@
+=head1 NAME
+
+XML::DOM::Element - An XML element node in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::Element extends L<XML::DOM::Node>.
+
+By far the vast majority of objects (apart from text) that authors
+encounter when traversing a document are Element nodes. Assume the
+following XML document:
+
+ <elementExample id="demo">
+ <subelement1/>
+ <subelement2><subsubelement/></subelement2>
+ </elementExample>
+
+When represented using DOM, the top node is an Element node for
+"elementExample", which contains two child Element nodes, one for
+"subelement1" and one for "subelement2". "subelement1" contains no
+child nodes.
+
+Elements may have attributes associated with them; since the Element
+interface inherits from Node, the generic Node interface method
+getAttributes may be used to retrieve the set of all attributes for an
+element. There are methods on the Element interface to retrieve either
+an Attr object by name or an attribute value by name. In XML, where an
+attribute value may contain entity references, an Attr object should be
+retrieved to examine the possibly fairly complex sub-tree representing
+the attribute value. On the other hand, in HTML, where all attributes
+have simple string values, methods to directly access an attribute
+value can safely be used as a convenience.
+
+=head2 METHODS
+
+=over 4
+
+=item getTagName
+
+The name of the element. For example, in:
+
+ <elementExample id="demo">
+ ...
+ </elementExample>
+
+tagName has the value "elementExample". Note that this is
+case-preserving in XML, as are all of the operations of the
+DOM.
+
+=item getAttribute (name)
+
+Retrieves an attribute value by name.
+
+Return Value: The Attr value as a string, or the empty string if that
+attribute does not have a specified or default value.
+
+=item setAttribute (name, value)
+
+Adds a new attribute. If an attribute with that name is
+already present in the element, its value is changed to be
+that of the value parameter. This value is a simple string,
+it is not parsed as it is being set. So any markup (such as
+syntax to be recognized as an entity reference) is treated as
+literal text, and needs to be appropriately escaped by the
+implementation when it is written out. In order to assign an
+attribute value that contains entity references, the user
+must create an Attr node plus any Text and EntityReference
+nodes, build the appropriate subtree, and use
+setAttributeNode to assign it as the value of an attribute.
+
+
+DOMExceptions:
+
+=over 4
+
+=item * INVALID_CHARACTER_ERR
+
+Raised if the specified name contains an invalid character.
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this node is readonly.
+
+=back
+
+=item removeAttribute (name)
+
+Removes an attribute by name. If the removed attribute has a
+default value it is immediately replaced.
+
+DOMExceptions:
+
+=over 4
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this node is readonly.
+
+=back
+
+=item getAttributeNode
+
+Retrieves an Attr node by name.
+
+Return Value: The Attr node with the specified attribute name or undef
+if there is no such attribute.
+
+=item setAttributeNode (attr)
+
+Adds a new attribute. If an attribute with that name is
+already present in the element, it is replaced by the new one.
+
+Return Value: If the newAttr attribute replaces an existing attribute
+with the same name, the previously existing Attr node is
+returned, otherwise undef is returned.
+
+DOMExceptions:
+
+=over 4
+
+=item * WRONG_DOCUMENT_ERR
+
+Raised if newAttr was created from a different document than the one that created
+the element.
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this node is readonly.
+
+=item * INUSE_ATTRIBUTE_ERR
+
+Raised if newAttr is already an attribute of another Element object. The DOM
+user must explicitly clone Attr nodes to re-use them in other elements.
+
+=back
+
+=item removeAttributeNode (oldAttr)
+
+Removes the specified attribute. If the removed Attr has a default value it is
+immediately replaced. If the Attr already is the default value, nothing happens
+and nothing is returned.
+
+Parameters:
+ I<oldAttr> The Attr node to remove from the attribute list.
+
+Return Value: The Attr node that was removed.
+
+DOMExceptions:
+
+=over 4
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this node is readonly.
+
+=item * NOT_FOUND_ERR
+
+Raised if oldAttr is not an attribute of the element.
+
+=back
+
+=head2 Additional methods not in the DOM Spec
+
+=over 4
+
+=item setTagName (newTagName)
+
+Sets the tag name of the Element. Note that this method is not portable
+between DOM implementations.
+
+DOMExceptions:
+
+=over 4
+
+=item * INVALID_CHARACTER_ERR
+
+Raised if the specified name contains an invalid character.
+
+=back
+
+=item check ($checker)
+
+Uses the specified L<XML::Checker> to validate the document.
+NOTE: an XML::Checker must be supplied. The checker can be created in
+different ways, e.g. when parsing a document with XML::DOM::ValParser,
+or with XML::DOM::Document::createChecker().
+See L<XML::Checker> for more info.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/ElementDecl.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,27 @@
+=head1 NAME
+
+XML::DOM::ElementDecl - An XML ELEMENT declaration in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::ElementDecl extends L<XML::DOM::Node> but is not part of the
+DOM Level 1 specification.
+
+This node represents an Element declaration, e.g.
+
+ <!ELEMENT address (street+, city, state, zip, country?)>
+
+=head2 METHODS
+
+=over 4
+
+=item getName
+
+Returns the Element tagName.
+
+=item getModel and setModel (model)
+
+Returns and sets the model as a string, e.g.
+"(street+, city, state, zip, country?)" in the above example.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/Entity.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,56 @@
+=head1 NAME
+
+XML::DOM::Entity - An XML ENTITY in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::Entity extends L<XML::DOM::Node>.
+
+This node represents an Entity declaration, e.g.
+
+ <!ENTITY % draft 'INCLUDE'>
+
+ <!ENTITY hatch-pic SYSTEM "../grafix/OpenHatch.gif" NDATA gif>
+
+The first one is called a parameter entity and is referenced like this: %draft;
+The 2nd is a (regular) entity and is referenced like this: &hatch-pic;
+
+=head2 METHODS
+
+=over 4
+
+=item getNotationName
+
+Returns the name of the notation for the entity.
+
+I<Not Implemented> The DOM Spec says: For unparsed entities, the name of the
+notation for the entity. For parsed entities, this is null.
+(This implementation does not support unparsed entities.)
+
+=item getSysId
+
+Returns the system id, or undef.
+
+=item getPubId
+
+Returns the public id, or undef.
+
+=back
+
+=head2 Additional methods not in the DOM Spec
+
+=over 4
+
+=item isParameterEntity
+
+Whether it is a parameter entity (%ent;) or not (&ent;)
+
+=item getValue
+
+Returns the entity value.
+
+=item getNdata
+
+Returns the NDATA declaration (for general unparsed entities), or undef.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/EntityReference.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,27 @@
+=head1 NAME
+
+XML::DOM::EntityReference - An XML ENTITY reference in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::EntityReference extends L<XML::DOM::Node>.
+
+EntityReference objects may be inserted into the structure model when
+an entity reference is in the source document, or when the user wishes
+to insert an entity reference. Note that character references and
+references to predefined entities are considered to be expanded by the
+HTML or XML processor so that characters are represented by their
+Unicode equivalent rather than by an entity reference. Moreover, the
+XML processor may completely expand references to entities while
+building the structure model, instead of providing EntityReference
+objects. If it does provide such objects, then for a given
+EntityReference node, it may be that there is no Entity node
+representing the referenced entity; but if such an Entity exists, then
+the child list of the EntityReference node is the same as that of the
+Entity node. As with the Entity node, all descendants of the
+EntityReference are readonly.
+
+The resolution of the children of the EntityReference (the replacement
+value of the referenced Entity) may be lazily evaluated; actions by the
+user (such as calling the childNodes method on the EntityReference
+node) are assumed to trigger the evaluation.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/NamedNodeMap.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,271 @@
+######################################################################
+package XML::DOM::NamedNodeMap;
+######################################################################
+
+use strict;
+
+use Carp;
+use XML::DOM::DOMException;
+use XML::DOM::NodeList;
+
+use vars qw( $Special );
+
+# Constant definition:
+# Note: a real Name should have at least 1 char, so nobody else should use this
+$Special = "";
+
+sub new
+{
+ my ($class, %args) = @_;
+
+ $args{Values} = new XML::DOM::NodeList;
+
+ # Store all NamedNodeMap properties in element $Special
+ bless { $Special => \%args}, $class;
+}
+
+sub getNamedItem
+{
+ # Don't return the $Special item!
+ ($_[1] eq $Special) ? undef : $_[0]->{$_[1]};
+}
+
+sub setNamedItem
+{
+ my ($self, $node) = @_;
+ my $prop = $self->{$Special};
+
+ my $name = $node->getNodeName;
+
+ if ($XML::DOM::SafeMode)
+ {
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR)
+ if $self->isReadOnly;
+
+ croak new XML::DOM::DOMException (WRONG_DOCUMENT_ERR)
+ if $node->[XML::DOM::Node::_Doc] != $prop->{Doc};
+
+ croak new XML::DOM::DOMException (INUSE_ATTRIBUTE_ERR)
+ if defined ($node->[XML::DOM::Node::_UsedIn]);
+
+ croak new XML::DOM::DOMException (INVALID_CHARACTER_ERR,
+ "can't add name with NodeName [$name] to NamedNodeMap")
+ if $name eq $Special;
+ }
+
+ my $values = $prop->{Values};
+ my $index = -1;
+
+ my $prev = $self->{$name};
+ if (defined $prev)
+ {
+ # decouple previous node
+ $prev->decoupleUsedIn;
+
+ # find index of $prev
+ $index = 0;
+ for my $val (@{$values})
+ {
+ last if ($val == $prev);
+ $index++;
+ }
+ }
+
+ $self->{$name} = $node;
+ $node->[XML::DOM::Node::_UsedIn] = $self;
+
+ if ($index == -1)
+ {
+ push (@{$values}, $node);
+ }
+ else # replace previous node with new node
+ {
+ splice (@{$values}, $index, 1, $node);
+ }
+
+ $prev;
+}
+
+sub removeNamedItem
+{
+ my ($self, $name) = @_;
+
+ # Be careful that user doesn't delete $Special node!
+ croak new XML::DOM::DOMException (NOT_FOUND_ERR)
+ if $name eq $Special;
+
+ my $node = $self->{$name};
+
+ croak new XML::DOM::DOMException (NOT_FOUND_ERR)
+ unless defined $node;
+
+ # The DOM Spec doesn't mention this Exception - I think it's an oversight
+ croak new XML::DOM::DOMException (NO_MODIFICATION_ALLOWED_ERR)
+ if $self->isReadOnly;
+
+ $node->decoupleUsedIn;
+ delete $self->{$name};
+
+ # remove node from Values list
+ my $values = $self->getValues;
+ my $index = 0;
+ for my $val (@{$values})
+ {
+ if ($val == $node)
+ {
+ splice (@{$values}, $index, 1, ());
+ last;
+ }
+ $index++;
+ }
+ $node;
+}
+
+# The following 2 are really bogus. DOM should use an iterator instead (Clark)
+
+sub item
+{
+ my ($self, $item) = @_;
+ $self->{$Special}->{Values}->[$item];
+}
+
+sub getLength
+{
+ my ($self) = @_;
+ my $vals = $self->{$Special}->{Values};
+ int (@$vals);
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub isReadOnly
+{
+ return 0 if $XML::DOM::IgnoreReadOnly;
+
+ my $used = $_[0]->{$Special}->{UsedIn};
+ defined $used ? $used->isReadOnly : 0;
+}
+
+sub cloneNode
+{
+ my ($self, $deep) = @_;
+ my $prop = $self->{$Special};
+
+ my $map = new XML::DOM::NamedNodeMap (Doc => $prop->{Doc});
+ # Not copying Parent property on purpose!
+
+ local $XML::DOM::IgnoreReadOnly = 1; # temporarily...
+
+ for my $val (@{$prop->{Values}})
+ {
+ my $key = $val->getNodeName;
+
+ my $newNode = $val->cloneNode ($deep);
+ $newNode->[XML::DOM::Node::_UsedIn] = $map;
+ $map->{$key} = $newNode;
+ push (@{$map->{$Special}->{Values}}, $newNode);
+ }
+
+ $map;
+}
+
+sub setOwnerDocument
+{
+ my ($self, $doc) = @_;
+ my $special = $self->{$Special};
+
+ $special->{Doc} = $doc;
+ for my $kid (@{$special->{Values}})
+ {
+ $kid->setOwnerDocument ($doc);
+ }
+}
+
+sub getChildIndex
+{
+ my ($self, $attr) = @_;
+ my $i = 0;
+ for my $kid (@{$self->{$Special}->{Values}})
+ {
+ return $i if $kid == $attr;
+ $i++;
+ }
+ -1; # not found
+}
+
+sub getValues
+{
+ wantarray ? @{ $_[0]->{$Special}->{Values} } : $_[0]->{$Special}->{Values};
+}
+
+# Remove circular dependencies. The NamedNodeMap and its values should
+# not be used afterwards.
+sub dispose
+{
+ my $self = shift;
+
+ for my $kid (@{$self->getValues})
+ {
+ undef $kid->[XML::DOM::Node::_UsedIn]; # was delete
+ $kid->dispose;
+ }
+
+ delete $self->{$Special}->{Doc};
+ delete $self->{$Special}->{Parent};
+ delete $self->{$Special}->{Values};
+
+ for my $key (keys %$self)
+ {
+ delete $self->{$key};
+ }
+}
+
+sub setParentNode
+{
+ $_[0]->{$Special}->{Parent} = $_[1];
+}
+
+sub getProperty
+{
+ $_[0]->{$Special}->{$_[1]};
+}
+
+#?? remove after debugging
+sub toString
+{
+ my ($self) = @_;
+ my $str = "NamedNodeMap[";
+ while (my ($key, $val) = each %$self)
+ {
+ if ($key eq $Special)
+ {
+ $str .= "##Special (";
+ while (my ($k, $v) = each %$val)
+ {
+ if ($k eq "Values")
+ {
+ $str .= $k . " => [";
+ for my $a (@$v)
+ {
+# $str .= $a->getNodeName . "=" . $a . ",";
+ $str .= $a->toString . ",";
+ }
+ $str .= "], ";
+ }
+ else
+ {
+ $str .= $k . " => " . $v . ", ";
+ }
+ }
+ $str .= "), ";
+ }
+ else
+ {
+ $str .= $key . " => " . $val . ", ";
+ }
+ }
+ $str . "]";
+}
+
+1; # package return code
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/NamedNodeMap.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,130 @@
+=head1 NAME
+
+XML::DOM::NamedNodeMap - A hash table interface for XML::DOM
+
+=head1 DESCRIPTION
+
+Objects implementing the NamedNodeMap interface are used to represent
+collections of nodes that can be accessed by name. Note that
+NamedNodeMap does not inherit from NodeList; NamedNodeMaps are not
+maintained in any particular order. Objects contained in an object
+implementing NamedNodeMap may also be accessed by an ordinal index, but
+this is simply to allow convenient enumeration of the contents of a
+NamedNodeMap, and does not imply that the DOM specifies an order to
+these Nodes.
+
+Note that in this implementation, the objects added to a NamedNodeMap
+are kept in order.
+
+=head2 METHODS
+
+=over 4
+
+=item getNamedItem (name)
+
+Retrieves a node specified by name.
+
+Return Value: A Node (of any type) with the specified name, or undef if
+the specified name did not identify any node in the map.
+
+=item setNamedItem (arg)
+
+Adds a node using its nodeName attribute.
+
+As the nodeName attribute is used to derive the name which
+the node must be stored under, multiple nodes of certain
+types (those that have a "special" string value) cannot be
+stored as the names would clash. This is seen as preferable
+to allowing nodes to be aliased.
+
+Parameters:
+ I<arg> A node to store in a named node map.
+
+The node will later be accessible using the value of the nodeName
+attribute of the node. If a node with that name is
+already present in the map, it is replaced by the new one.
+
+Return Value: If the new Node replaces an existing node with the same
+name the previously existing Node is returned, otherwise undef is returned.
+
+DOMExceptions:
+
+=over 4
+
+=item * WRONG_DOCUMENT_ERR
+
+Raised if arg was created from a different document than the one that
+created the NamedNodeMap.
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this NamedNodeMap is readonly.
+
+=item * INUSE_ATTRIBUTE_ERR
+
+Raised if arg is an Attr that is already an attribute of another Element object.
+The DOM user must explicitly clone Attr nodes to re-use them in other elements.
+
+=back
+
+=item removeNamedItem (name)
+
+Removes a node specified by name. If the removed node is an
+Attr with a default value it is immediately replaced.
+
+Return Value: The node removed from the map or undef if no node with
+such a name exists.
+
+DOMException:
+
+=over 4
+
+=item * NOT_FOUND_ERR
+
+Raised if there is no node named name in the map.
+
+=back
+
+=item item (index)
+
+Returns the indexth item in the map. If index is greater than
+or equal to the number of nodes in the map, this returns undef.
+
+Return Value: The node at the indexth position in the NamedNodeMap, or
+undef if that is not a valid index.
+
+=item getLength
+
+Returns the number of nodes in the map. The range of valid child node
+indices is 0 to length-1 inclusive.
+
+=back
+
+=head2 Additional methods not in the DOM Spec
+
+=over 4
+
+=item getValues
+
+Returns a NodeList with the nodes contained in the NamedNodeMap.
+The NodeList is "live", in that it reflects changes made to the NamedNodeMap.
+
+When this method is called in a list context, it returns a regular perl list
+containing the values. Note that this list is not "live". E.g.
+
+ @list = $map->getValues; # returns a perl list
+ $nodelist = $map->getValues; # returns a NodeList (object ref.)
+ for my $val ($map->getValues) # iterate over the values
+
+=item getChildIndex (node)
+
+Returns the index of the node in the NodeList as returned by getValues, or -1
+if the node is not in the NamedNodeMap.
+
+=item dispose
+
+Removes all circular references in this NamedNodeMap and its descendants so the
+objects can be claimed for garbage collection. The objects should not be used
+afterwards.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/Node.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,451 @@
+=head1 NAME
+
+XML::DOM::Node - Super class of all nodes in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::Node is the super class of all nodes in an XML::DOM document.
+This means that all nodes that subclass XML::DOM::Node also inherit all
+the methods that XML::DOM::Node implements.
+
+=head2 GLOBAL VARIABLES
+
+=over 4
+
+=item @NodeNames
+
+The variable @XML::DOM::Node::NodeNames maps the node type constants to strings.
+It is used by XML::DOM::Node::getNodeTypeName.
+
+=back
+
+=head2 METHODS
+
+=over 4
+
+=item getNodeType
+
+Return an integer indicating the node type. See XML::DOM constants.
+
+=item getNodeName
+
+Return a property or a hardcoded string, depending on the node type.
+Here are the corresponding functions or values:
+
+ Attr getName
+ AttDef getName
+ AttlistDecl getName
+ CDATASection "#cdata-section"
+ Comment "#comment"
+ Document "#document"
+ DocumentType getNodeName
+ DocumentFragment "#document-fragment"
+ Element getTagName
+ ElementDecl getName
+ EntityReference getEntityName
+ Entity getNotationName
+ Notation getName
+ ProcessingInstruction getTarget
+ Text "#text"
+ XMLDecl "#xml-declaration"
+
+B<Not In DOM Spec>: AttDef, AttlistDecl, ElementDecl and XMLDecl were added for
+completeness.
+
+=item getNodeValue and setNodeValue (value)
+
+Returns a string or undef, depending on the node type. This method is provided
+for completeness. In other languages it saves the programmer an upcast.
+The value is either available thru some other method defined in the subclass, or
+else undef is returned. Here are the corresponding methods:
+Attr::getValue, Text::getData, CDATASection::getData, Comment::getData,
+ProcessingInstruction::getData.
+
+=item getParentNode and setParentNode (parentNode)
+
+The parent of this node. All nodes, except Document,
+DocumentFragment, and Attr may have a parent. However, if a
+node has just been created and not yet added to the tree, or
+if it has been removed from the tree, this is undef.
+
+=item getChildNodes
+
+A NodeList that contains all children of this node. If there
+are no children, this is a NodeList containing no nodes. The
+content of the returned NodeList is "live" in the sense that,
+for instance, changes to the children of the node object that
+it was created from are immediately reflected in the nodes
+returned by the NodeList accessors; it is not a static
+snapshot of the content of the node. This is true for every
+NodeList, including the ones returned by the
+getElementsByTagName method.
+
+NOTE: this implementation does not return a "live" NodeList for
+getElementsByTagName. See L<CAVEATS>.
+
+When this method is called in a list context, it returns a regular perl list
+containing the child nodes. Note that this list is not "live". E.g.
+
+ @list = $node->getChildNodes; # returns a perl list
+ $nodelist = $node->getChildNodes; # returns a NodeList (object reference)
+ for my $kid ($node->getChildNodes) # iterate over the children of $node
+
+=item getFirstChild
+
+The first child of this node. If there is no such node, this returns undef.
+
+=item getLastChild
+
+The last child of this node. If there is no such node, this returns undef.
+
+=item getPreviousSibling
+
+The node immediately preceding this node. If there is no such
+node, this returns undef.
+
+=item getNextSibling
+
+The node immediately following this node. If there is no such node, this returns
+undef.
+
+=item getAttributes
+
+A NamedNodeMap containing the attributes (Attr nodes) of this node
+(if it is an Element) or undef otherwise.
+Note that adding/removing attributes from the returned object, also adds/removes
+attributes from the Element node that the NamedNodeMap came from.
+
+=item getOwnerDocument
+
+The Document object associated with this node. This is also
+the Document object used to create new nodes. When this node
+is a Document this is undef.
+
+=item insertBefore (newChild, refChild)
+
+Inserts the node newChild before the existing child node
+refChild. If refChild is undef, insert newChild at the end of
+the list of children.
+
+If newChild is a DocumentFragment object, all of its children
+are inserted, in the same order, before refChild. If the
+newChild is already in the tree, it is first removed.
+
+Return Value: The node being inserted.
+
+DOMExceptions:
+
+=over 4
+
+=item * HIERARCHY_REQUEST_ERR
+
+Raised if this node is of a type that does not allow children of the type of
+the newChild node, or if the node to insert is one of this node's ancestors.
+
+=item * WRONG_DOCUMENT_ERR
+
+Raised if newChild was created from a different document than the one that
+created this node.
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this node is readonly.
+
+=item * NOT_FOUND_ERR
+
+Raised if refChild is not a child of this node.
+
+=back
+
+=item replaceChild (newChild, oldChild)
+
+Replaces the child node oldChild with newChild in the list of
+children, and returns the oldChild node. If the newChild is
+already in the tree, it is first removed.
+
+Return Value: The node replaced.
+
+DOMExceptions:
+
+=over 4
+
+=item * HIERARCHY_REQUEST_ERR
+
+Raised if this node is of a type that does not allow children of the type of
+the newChild node, or it the node to put in is one of this node's ancestors.
+
+=item * WRONG_DOCUMENT_ERR
+
+Raised if newChild was created from a different document than the one that
+created this node.
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this node is readonly.
+
+=item * NOT_FOUND_ERR
+
+Raised if oldChild is not a child of this node.
+
+=back
+
+=item removeChild (oldChild)
+
+Removes the child node indicated by oldChild from the list of
+children, and returns it.
+
+Return Value: The node removed.
+
+DOMExceptions:
+
+=over 4
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this node is readonly.
+
+=item * NOT_FOUND_ERR
+
+Raised if oldChild is not a child of this node.
+
+=back
+
+=item appendChild (newChild)
+
+Adds the node newChild to the end of the list of children of
+this node. If the newChild is already in the tree, it is
+first removed. If it is a DocumentFragment object, the entire contents of
+the document fragment are moved into the child list of this node
+
+Return Value: The node added.
+
+DOMExceptions:
+
+=over 4
+
+=item * HIERARCHY_REQUEST_ERR
+
+Raised if this node is of a type that does not allow children of the type of
+the newChild node, or if the node to append is one of this node's ancestors.
+
+=item * WRONG_DOCUMENT_ERR
+
+Raised if newChild was created from a different document than the one that
+created this node.
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this node is readonly.
+
+=back
+
+=item hasChildNodes
+
+This is a convenience method to allow easy determination of
+whether a node has any children.
+
+Return Value: 1 if the node has any children, 0 otherwise.
+
+=item cloneNode (deep)
+
+Returns a duplicate of this node, i.e., serves as a generic
+copy constructor for nodes. The duplicate node has no parent
+(parentNode returns undef.).
+
+Cloning an Element copies all attributes and their values,
+including those generated by the XML processor to represent
+defaulted attributes, but this method does not copy any text
+it contains unless it is a deep clone, since the text is
+contained in a child Text node. Cloning any other type of
+node simply returns a copy of this node.
+
+Parameters:
+ I<deep> If true, recursively clone the subtree under the specified node.
+If false, clone only the node itself (and its attributes, if it is an Element).
+
+Return Value: The duplicate node.
+
+=item normalize
+
+Puts all Text nodes in the full depth of the sub-tree
+underneath this Element into a "normal" form where only
+markup (e.g., tags, comments, processing instructions, CDATA
+sections, and entity references) separates Text nodes, i.e.,
+there are no adjacent Text nodes. This can be used to ensure
+that the DOM view of a document is the same as if it were
+saved and re-loaded, and is useful when operations (such as
+XPointer lookups) that depend on a particular document tree
+structure are to be used.
+
+B<Not In DOM Spec>: In the DOM Spec this method is defined in the Element and
+Document class interfaces only, but it doesn't hurt to have it here...
+
+=item getElementsByTagName (name [, recurse])
+
+Returns a NodeList of all descendant elements with a given
+tag name, in the order in which they would be encountered in
+a preorder traversal of the Element tree.
+
+Parameters:
+ I<name> The name of the tag to match on. The special value "*" matches all tags.
+ I<recurse> Whether it should return only direct child nodes (0) or any descendant that matches the tag name (1). This argument is optional and defaults to 1. It is not part of the DOM spec.
+
+Return Value: A list of matching Element nodes.
+
+NOTE: this implementation does not return a "live" NodeList for
+getElementsByTagName. See L<CAVEATS>.
+
+When this method is called in a list context, it returns a regular perl list
+containing the result nodes. E.g.
+
+ @list = $node->getElementsByTagName("tag"); # returns a perl list
+ $nodelist = $node->getElementsByTagName("tag"); # returns a NodeList (object ref.)
+ for my $elem ($node->getElementsByTagName("tag")) # iterate over the result nodes
+
+=back
+
+=head2 Additional methods not in the DOM Spec
+
+=over 4
+
+=item getNodeTypeName
+
+Return the string describing the node type.
+E.g. returns "ELEMENT_NODE" if getNodeType returns ELEMENT_NODE.
+It uses @XML::DOM::Node::NodeNames.
+
+=item toString
+
+Returns the entire subtree as a string.
+
+=item printToFile (filename)
+
+Prints the entire subtree to the file with the specified filename.
+
+Croaks: if the file could not be opened for writing.
+
+=item printToFileHandle (handle)
+
+Prints the entire subtree to the file handle.
+E.g. to print to STDOUT:
+
+ $node->printToFileHandle (\*STDOUT);
+
+=item print (obj)
+
+Prints the entire subtree using the object's print method. E.g to print to a
+FileHandle object:
+
+ $f = new FileHandle ("file.out", "w");
+ $node->print ($f);
+
+=item getChildIndex (child)
+
+Returns the index of the child node in the list returned by getChildNodes.
+
+Return Value: the index or -1 if the node is not found.
+
+=item getChildAtIndex (index)
+
+Returns the child node at the specifed index or undef.
+
+=item addText (text)
+
+Appends the specified string to the last child if it is a Text node, or else
+appends a new Text node (with the specified text.)
+
+Return Value: the last child if it was a Text node or else the new Text node.
+
+=item dispose
+
+Removes all circular references in this node and its descendants so the
+objects can be claimed for garbage collection. The objects should not be used
+afterwards.
+
+=item setOwnerDocument (doc)
+
+Sets the ownerDocument property of this node and all its children (and
+attributes etc.) to the specified document.
+This allows the user to cut and paste document subtrees between different
+XML::DOM::Documents. The node should be removed from the original document
+first, before calling setOwnerDocument.
+
+This method does nothing when called on a Document node.
+
+=item isAncestor (parent)
+
+Returns 1 if parent is an ancestor of this node or if it is this node itself.
+
+=item expandEntityRefs (str)
+
+Expands all the entity references in the string and returns the result.
+The entity references can be character references (e.g. "{" or "ῂ"),
+default entity references (""", ">", "<", "'" and "&") or
+entity references defined in Entity objects as part of the DocumentType of
+the owning Document. Character references are expanded into UTF-8.
+Parameter entity references (e.g. %ent;) are not expanded.
+
+=item to_sax ( %HANDLERS )
+
+E.g.
+
+ $node->to_sax (DocumentHandler => $my_handler,
+ Handler => $handler2 );
+
+%HANDLERS may contain the following handlers:
+
+=over 4
+
+=item * DocumentHandler
+
+=item * DTDHandler
+
+=item * EntityResolver
+
+=item * Handler
+
+Default handler when one of the above is not specified
+
+=back
+
+Each XML::DOM::Node generates the appropriate SAX callbacks (for the
+appropriate SAX handler.) Different SAX handlers can be plugged in to
+accomplish different things, e.g. L<XML::Checker> would check the node
+(currently only Document and Element nodes are supported), L<XML::Handler::BuildDOM>
+would create a new DOM subtree (thereby, in essence, copying the Node)
+and in the near future, XML::Writer could print the node.
+All Perl SAX related work is still in flux, so this interface may change a
+little.
+
+See PerlSAX for the description of the SAX interface.
+
+=item check ( [$checker] )
+
+See descriptions for check() in L<XML::DOM::Document> and L<XML::DOM::Element>.
+
+=item xql ( @XQL_OPTIONS )
+
+To use the xql method, you must first I<use> L<XML::XQL> and L<XML::XQL::DOM>.
+This method is basically a shortcut for:
+
+ $query = new XML::XQL::Query ( @XQL_OPTIONS );
+ return $query->solve ($node);
+
+If the first parameter in @XQL_OPTIONS is the XQL expression, you can leave off
+the 'Expr' keyword, so:
+
+ $node->xql ("doc//elem1[@attr]", @other_options);
+
+is identical to:
+
+ $node->xql (Expr => "doc//elem1[@attr]", @other_options);
+
+See L<XML::XQL::Query> for other available XQL_OPTIONS.
+See L<XML::XQL> and L<XML::XQL::Tutorial> for more info.
+
+=item isHidden ()
+
+Whether the node is hidden.
+See L<Hidden Nodes|XML::DOM/_Hidden_Nodes_> for details.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/NodeList.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,46 @@
+######################################################################
+package XML::DOM::NodeList;
+######################################################################
+
+use vars qw ( $EMPTY );
+
+# Empty NodeList
+$EMPTY = new XML::DOM::NodeList;
+
+sub new
+{
+ bless [], $_[0];
+}
+
+sub item
+{
+ $_[0]->[$_[1]];
+}
+
+sub getLength
+{
+ int (@{$_[0]});
+}
+
+#------------------------------------------------------------
+# Extra method implementations
+
+sub dispose
+{
+ my $self = shift;
+ for my $kid (@{$self})
+ {
+ $kid->dispose;
+ }
+}
+
+sub setOwnerDocument
+{
+ my ($self, $doc) = @_;
+ for my $kid (@{$self})
+ {
+ $kid->setOwnerDocument ($doc);
+ }
+}
+
+1; # package return code
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/NodeList.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,46 @@
+=head1 NAME
+
+XML::DOM::NodeList - A node list as used by XML::DOM
+
+=head1 DESCRIPTION
+
+The NodeList interface provides the abstraction of an ordered
+collection of nodes, without defining or constraining how this
+collection is implemented.
+
+The items in the NodeList are accessible via an integral index,
+starting from 0.
+
+Although the DOM spec states that all NodeLists are "live" in that they
+allways reflect changes to the DOM tree, the NodeList returned by
+getElementsByTagName is not live in this implementation. See L<CAVEATS>
+for details.
+
+=head2 METHODS
+
+=over 4
+
+=item item (index)
+
+Returns the indexth item in the collection. If index is
+greater than or equal to the number of nodes in the list,
+this returns undef.
+
+=item getLength
+
+The number of nodes in the list. The range of valid child
+node indices is 0 to length-1 inclusive.
+
+=back
+
+=head2 Additional methods not in the DOM Spec
+
+=over 4
+
+=item dispose
+
+Removes all circular references in this NodeList and its descendants so the
+objects can be claimed for garbage collection. The objects should not be used
+afterwards.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/Notation.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,47 @@
+=head1 NAME
+
+XML::DOM::Notation - An XML NOTATION in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::Notation extends L<XML::DOM::Node>.
+
+This node represents a Notation, e.g.
+
+ <!NOTATION gs SYSTEM "GhostScript">
+
+ <!NOTATION name PUBLIC "pubId">
+
+ <!NOTATION name PUBLIC "pubId" "sysId">
+
+ <!NOTATION name SYSTEM "sysId">
+
+=head2 METHODS
+
+=over 4
+
+=item getName and setName (name)
+
+Returns (or sets) the Notation name, which is the first token after the
+NOTATION keyword.
+
+=item getSysId and setSysId (sysId)
+
+Returns (or sets) the system ID, which is the token after the optional
+SYSTEM keyword.
+
+=item getPubId and setPubId (pubId)
+
+Returns (or sets) the public ID, which is the token after the optional
+PUBLIC keyword.
+
+=item getBase
+
+This is passed by XML::Parser in the Notation handler.
+I don't know what it is yet.
+
+=item getNodeName
+
+Returns the same as getName.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/Parser.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,66 @@
+=head1 NAME
+
+XML::DOM::Parser - An XML::Parser that builds XML::DOM document structures
+
+=head1 SYNOPSIS
+
+ use XML::DOM;
+
+ my $parser = new XML::DOM::Parser;
+ my $doc = $parser->parsefile ("file.xml");
+
+=head1 DESCRIPTION
+
+XML::DOM::Parser extends L<XML::Parser>
+
+The XML::Parser module was written by Clark Cooper and
+is built on top of XML::Parser::Expat,
+which is a lower level interface to James Clark's expat library.
+
+XML::DOM::Parser parses XML strings or files
+and builds a data structure that conforms to the API of the Document Object
+Model as described at L<http://www.w3.org/TR/REC-DOM-Level-1>.
+See the L<XML::Parser> manpage for other additional properties of the
+XML::DOM::Parser class.
+Note that the 'Style' property should not be used (it is set internally.)
+
+The XML::Parser B<NoExpand> option is more or less supported, in that it will
+generate EntityReference objects whenever an entity reference is encountered
+in character data. I'm not sure how useful this is. Any comments are welcome.
+
+As described in the synopsis, when you create an XML::DOM::Parser object,
+the parse and parsefile methods create an L<XML::DOM::Document> object
+from the specified input. This Document object can then be examined, modified and
+written back out to a file or converted to a string.
+
+When using XML::DOM with XML::Parser version 2.19 and up, setting the
+XML::DOM::Parser option B<KeepCDATA> to 1 will store CDATASections in
+CDATASection nodes, instead of converting them to Text nodes.
+Subsequent CDATASection nodes will be merged into one. Let me know if this
+is a problem.
+
+=head1 Using LWP to parse URLs
+
+The parsefile() method now also supports URLs, e.g. I<http://www.erols.com/enno/xsa.xml>.
+It uses LWP to download the file and then calls parse() on the resulting string.
+By default it will use a L<LWP::UserAgent> that is created as follows:
+
+ use LWP::UserAgent;
+ $LWP_USER_AGENT = LWP::UserAgent->new;
+ $LWP_USER_AGENT->env_proxy;
+
+Note that env_proxy reads proxy settings from environment variables, which is what I need to
+do to get thru our firewall. If you want to use a different LWP::UserAgent, you can either set
+it globally with:
+
+ XML::DOM::Parser::set_LWP_UserAgent ($my_agent);
+
+or, you can specify it for a specific XML::DOM::Parser by passing it to the constructor:
+
+ my $parser = new XML::DOM::Parser (LWP_UserAgent => $my_agent);
+
+Currently, LWP is used when the filename (passed to parsefile) starts with one of
+the following URL schemes: http, https, ftp, wais, gopher, or file (followed by a colon.)
+If I missed one, please let me know.
+
+The LWP modules are part of libwww-perl which is available at CPAN.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/PerlSAX.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,46 @@
+package XML::DOM::PerlSAX;
+use strict;
+
+BEGIN
+{
+ if ($^W)
+ {
+ warn "XML::DOM::PerlSAX has been renamed to XML::Handler::DOM, "
+ "please modify your code accordingly.";
+ }
+}
+
+use XML::Handler::DOM;
+use vars qw{ @ISA };
+@ISA = qw{ XML::Handler::DOM };
+
+1; # package return code
+
+__END__
+
+=head1 NAME
+
+XML::DOM::PerlSAX - Old name of L<XML::Handler::BuildDOM>
+
+=head1 SYNOPSIS
+
+ See L<XML::DOM::BuildDOM>
+
+=head1 DESCRIPTION
+
+XML::DOM::PerlSAX was renamed to L<XML::Handler::BuildDOM> to comply
+with naming conventions for PerlSAX filters/handlers.
+
+For backward compatibility, this package will remain in existence
+(it simply includes XML::Handler::BuildDOM), but it will print a warning when
+running with I<'perl -w'>.
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+=head1 SEE ALSO
+
+L<XML::Handler::BuildDOM>, L<XML::DOM>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/ProcessingInstruction.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,32 @@
+=head1 NAME
+
+XML::DOM::ProcessingInstruction - An XML processing instruction in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::ProcessingInstruction extends L<XML::DOM::Node>.
+
+It represents a "processing instruction", used in XML as a way to keep
+processor-specific information in the text of the document. An example:
+
+ <?PI processing instruction?>
+
+Here, "PI" is the target and "processing instruction" is the data.
+
+=head2 METHODS
+
+=over 4
+
+=item getTarget
+
+The target of this processing instruction. XML defines this
+as being the first token following the markup that begins the
+processing instruction.
+
+=item getData and setData (data)
+
+The content of this processing instruction. This is from the
+first non white space character after the target to the
+character immediately preceding the ?>.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/Text.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,60 @@
+=head1 NAME
+
+XML::DOM::Text - A piece of XML text in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::Text extends L<XML::DOM::CharacterData>, which extends
+L<XML::DOM::Node>.
+
+The Text interface represents the textual content (termed character
+data in XML) of an Element or Attr. If there is no markup inside an
+element's content, the text is contained in a single object
+implementing the Text interface that is the only child of the element.
+If there is markup, it is parsed into a list of elements and Text nodes
+that form the list of children of the element.
+
+When a document is first made available via the DOM, there is only one
+Text node for each block of text. Users may create adjacent Text nodes
+that represent the contents of a given element without any intervening
+markup, but should be aware that there is no way to represent the
+separations between these nodes in XML or HTML, so they will not (in
+general) persist between DOM editing sessions. The normalize() method
+on Element merges any such adjacent Text objects into a single node for
+each block of text; this is recommended before employing operations
+that depend on a particular document structure, such as navigation with
+XPointers.
+
+=head2 METHODS
+
+=over 4
+
+=item splitText (offset)
+
+Breaks this Text node into two Text nodes at the specified
+offset, keeping both in the tree as siblings. This node then
+only contains all the content up to the offset point. And a
+new Text node, which is inserted as the next sibling of this
+node, contains all the content at and after the offset point.
+
+Parameters:
+ I<offset> The offset at which to split, starting from 0.
+
+Return Value: The new Text node.
+
+DOMExceptions:
+
+=over 4
+
+=item * INDEX_SIZE_ERR
+
+Raised if the specified offset is negative or greater than the number of
+characters in data.
+
+=item * NO_MODIFICATION_ALLOWED_ERR
+
+Raised if this node is readonly.
+
+=back
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/ValParser.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,123 @@
+#
+# Use XML::DOM::ValParser instead of XML::DOM::Parser and it will
+# use XML::Checker to validate XML at parse time.
+#
+
+package XML::DOM::ValParser;
+
+use strict;
+use XML::DOM;
+use XML::Checker::Parser;
+
+use vars qw( @ISA @SupportedHandlers );
+
+@ISA = qw( XML::Checker::Parser );
+
+# These XML::Parser handlers are currently supported by XML::DOM
+@SupportedHandlers = qw( Init Final Char Start End Default Doctype
+ CdataStart CdataEnd XMLDecl Entity Notation Proc
+ Default Comment Attlist Element Unparsed );
+
+sub new
+{
+ my ($class, %args) = @_;
+
+ my %handlers = ();
+ for (@SupportedHandlers)
+ {
+ my $domHandler = "XML::Parser::Dom::$_";
+ $handlers{$_} = \&$domHandler;
+ }
+ $args{Handlers} = \%handlers;
+ $class->SUPER::new (%args);
+}
+
+sub parse
+{
+ # Do what XML::DOM::Parser normally does.
+ # Temporarily override his @ISA, so that he thinks he's a
+ # XML::DOM::ValParser and calls the right SUPER::parse(),
+ # (otherwise he thinks he's an XML::DOM::Parser and you see runtime
+ # error: Can't call method "Init" on unblessed reference ...)
+ local @XML::DOM::Parser::ISA = @ISA;
+ local $XML::Checker::Parser::_skipInsignifWS = $_[0]->{SkipInsignifWS};
+ XML::DOM::Parser::parse (@_);
+}
+
+1; # package return code
+
+__END__
+
+=head1 NAME
+
+XML::DOM::ValParser - an XML::DOM::Parser that validates at parse time
+
+=head1 SYNOPSIS
+
+ use XML::DOM::ValParser;
+
+ my %expat_options = (KeepCDATA => 1,
+ Handlers => [ Unparsed => \&my_Unparsed_handler ]);
+ my $parser = new XML::DOM::ValParser (%expat_options);
+
+ eval {
+ local $XML::Checker::FAIL = \&my_fail;
+ my $doc = $parser->parsefile ("fail.xml");
+ ... XML::DOM::Document was created sucessfully ...
+ };
+ if ($@) {
+ # Either XML::Parser (expat) threw an exception or my_fail() died.
+ ... your error handling code here ...
+ # Note that the XML::DOM::Document is automatically disposed off and
+ # will be garbage collected
+ }
+
+ # Throws an exception (with die) when an error is encountered, this
+ # will stop the parsing process.
+ # Don't die if a warning or info message is encountered, just print a message.
+ sub my_fail {
+ my $code = shift;
+ die XML::Checker::error_string ($code, @_) if $code < 200;
+ XML::Checker::print_error ($code, @_);
+ }
+
+=head1 DESCRIPTION
+
+Use XML::DOM::ValParser wherever you would use L<XML::DOM::Parser> and
+your XML will be checked using L<XML::Checker> at parse time.
+
+See L<XML::DOM> for details on XML::DOM::Parser options.
+See L<XML::Checker> for details on setting the fail handler (my_fail.)
+
+The following handlers are currently supported, just like XML::DOM::Parser:
+Init, Final, Char, Start, End, Default, Doctype, CdataStart, CdataEnd,
+XMLDecl, Entity, Notation, Proc, Default, Comment, Attlist, Element, Unparsed.
+
+=head1 XML::DOM::ValParser
+
+XML::DOM::ValParser extends from L<XML::Checker::Parser>. It creates an
+L<XML::Checker> object and routes all event handlers through the checker,
+before processing the events to create the XML::DOM::Document.
+
+Just like L<XML::Checker::Parser>, the checker object can be retrieved with
+the getChecker() method and can be reused later on (provided that the DOCTYPE
+section of the XML::DOM::Document did not change in the mean time.)
+
+You can control which errors are fatal (and therefore should stop creation
+of the XML::DOM::Document) by filtering the appropriate error codes in
+the global $XML::Checker::FAIL handler
+(see L<XML::Checker/ERROR_HANDLING>) and
+calling I<die> or I<croak> appropriately.
+
+Just like XML::Checker::Parser, XML::DOM::ValParser supports the
+SkipExternalDTD and SkipInsignifWS options. See L<XML::Checker::Parser>
+for details.
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+=head1 SEE ALSO
+
+L<XML::DOM>, L<XML::Checker> (L<XML::Checker/SEE_ALSO>)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/DOM/XMLDecl.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,33 @@
+=head1 NAME
+
+XML::DOM::XMLDecl - XML declaration in XML::DOM
+
+=head1 DESCRIPTION
+
+XML::DOM::XMLDecl extends L<XML::DOM::Node>, but is not part of the DOM Level 1
+specification.
+
+It contains the XML declaration, e.g.
+
+ <?xml version="1.0" encoding="UTF-16" standalone="yes"?>
+
+See also XML::DOM::Document::getXMLDecl.
+
+=head2 METHODS
+
+=over 4
+
+=item getVersion and setVersion (version)
+
+Returns and sets the XML version. At the time of this writing the version should
+always be "1.0"
+
+=item getEncoding and setEncoding (encoding)
+
+undef may be specified for the encoding value.
+
+=item getStandalone and setStandalone (standalone)
+
+undef may be specified for the standalone value.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Filter/DetectWS.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,622 @@
+package XML::Filter::DetectWS;
+use strict;
+use XML::Filter::SAXT;
+
+#----------------------------------------------------------------------
+# CONSTANT DEFINITIONS
+#----------------------------------------------------------------------
+
+# Locations of whitespace
+sub WS_START (%) { 1 } # just after <a>
+sub WS_END (%) { 2 } # just before </a>
+sub WS_INTER (%) { 0 } # not at the start or end (i.e. intermediate)
+sub WS_ONLY (%) { 3 } # both START and END, i.e. between <a> and </a>
+
+# The states of the WhiteSpace detection code
+# for regular elements, i.e. elements that:
+# 1) don't have xml:space="preserve"
+# 2) have an ELEMENT model that allows text children (i.e. ANY or Mixed content)
+
+sub START (%) { 0 } # just saw <elem>
+sub ONLY_WS (%) { 1 } # saw <elem> followed by whitespace (only)
+sub ENDS_IN_WS (%) { 2 } # ends in whitespace (sofar)
+sub ENDS_IN_NON_WS (%) { 3 } # ends in non-ws text or non-text node (sofar)
+
+# NO_TEXT States: when <!ELEMENT> model does not allow text
+# (we assume that all text children are whitespace)
+sub NO_TEXT_START (%) { 4 } # just saw <elem>
+sub NO_TEXT_ONLY_WS (%) { 5 } # saw <elem> followed by whitespace (only)
+sub NO_TEXT_ENDS_IN_WS (%) { 6 } # ends in whitespace (sofar)
+sub NO_TEXT_ENDS_IN_NON_WS (%) { 7 } # ends in non-text node (sofar)
+
+# State for elements with xml:space="preserve" (all text is non-WS)
+sub PRESERVE_WS (%) { 8 }
+
+#----------------------------------------------------------------------
+# METHOD DEFINITIONS
+#----------------------------------------------------------------------
+
+# Constructor options:
+#
+# SkipIgnorableWS 1 means: don't forward ignorable_whitespace events
+# Handler SAX Handler that will receive the resulting events
+#
+
+sub new
+{
+ my ($class, %options) = @_;
+
+ my $self = bless \%options, $class;
+
+ $self->init_handlers;
+
+ $self;
+}
+
+# Does nothing
+sub noop {}
+
+sub init_handlers
+{
+ my ($self) = @_;
+ my %handlers;
+
+ my $handler = $self->{Handler};
+
+ for my $cb (map { @{$_} } values %XML::Filter::SAXT::SAX_HANDLERS)
+ {
+ if (UNIVERSAL::can ($handler, $cb))
+ {
+ $handlers{$cb} = eval "sub { \$handler->$cb (\@_) }";
+ }
+ else
+ {
+ $handlers{$cb} = \&noop;
+ }
+ }
+
+ if ($self->{SkipIgnorableWS})
+ {
+ delete $handlers{ignorable_whitespace}; # if it exists
+ }
+ elsif (UNIVERSAL::can ($handler, 'ignorable_whitespace'))
+ {
+ # Support ignorable_whitespace callback if it exists
+ # (if not, just use characters callback)
+ $handlers{ignorable_whitespace} =
+ sub { $handler->ignorable_whitespace (@_) };
+ }
+ else
+ {
+ $handlers{ignorable_whitespace} = $handlers{characters};
+ }
+
+ $handlers{ws} = $handlers{characters};
+#?? were should whitespace go?
+
+ # NOTE: 'cdata' is not a valid PerlSAX callback
+ if (UNIVERSAL::can ($handler, 'start_cdata') &&
+ UNIVERSAL::can ($handler, 'end_cdata'))
+ {
+ $handlers{cdata} = sub {
+ $handler->start_cdata;
+ $handler->characters (@_);
+ $handler->end_cdata;
+ }
+ }
+ else # pass CDATA as regular characters
+ {
+ $handlers{cdata} = $handlers{characters};
+ }
+
+ $self->{Callback} = \%handlers;
+}
+
+sub start_cdata
+{
+ my ($self, $event) = @_;
+
+ $self->{InCDATA} = 1;
+}
+
+sub end_cdata
+{
+ my ($self, $event) = @_;
+
+ $self->{InCDATA} = 0;
+}
+
+sub entity_reference
+{
+ my ($self, $event) = @_;
+
+ $self->push_event ('entity_reference', $event);
+
+ my $parent = $self->{ParentStack}->[-1];
+ $parent->{State} |= ENDS_IN_NON_WS unless $parent->{State} == PRESERVE_WS;
+}
+
+sub comment
+{
+ my ($self, $event) = @_;
+
+ $self->push_event ('comment', $event);
+
+ my $parent = $self->{ParentStack}->[-1];
+ $parent->{State} |= ENDS_IN_NON_WS unless $parent->{State} == PRESERVE_WS;
+}
+
+sub processing_instruction
+{
+ my ($self, $event) = @_;
+
+ $self->push_event ('processing_instruction', $event);
+
+ my $parent = $self->{ParentStack}->[-1];
+ $parent->{State} |= ENDS_IN_NON_WS unless $parent->{State} == PRESERVE_WS;
+}
+
+sub start_document
+{
+ my ($self, $event) = @_;
+
+ # Initialize initial state
+ $self->{ParentStack} = [];
+ $self->{EventQ} = [];
+ $self->{InCDATA} = 0;
+
+ $self->init_handlers;
+
+ $event = {} unless defined $event;
+ # Don't preserve WS by default (unless specified by the user)
+ $event->{PreserveWS} = defined ($self->{PreserveWS}) ?
+ $self->{PreserveWS} : 0;
+
+ # We don't need whitespace detection at the document level
+ $event->{State} = PRESERVE_WS;
+
+ $self->push_event ('start_document', $event);
+ push @{ $self->{ParentStack} }, $event;
+}
+
+sub end_document
+{
+ my ($self, $event) = @_;
+ $event = {} unless defined $event;
+
+ $self->push_event ('end_document', $event);
+
+ $self->flush;
+}
+
+sub start_element
+{
+ my ($self, $event) = @_;
+
+ my $pres = $event->{Attributes}->{'xml:space'};
+ if (defined $pres)
+ {
+ $event->{PreserveWS} = $pres eq "preserve";
+ }
+ else
+ {
+ $event->{PreserveWS} = $self->{ParentStack}->[-1]->{PreserveWS};
+ }
+
+ if ($self->{NoText}->{ $event->{Name} })
+ {
+ $event->{NoText} = 1;
+ }
+
+ $event->{State} = $self->get_init_state ($event);
+
+ $self->push_event ('start_element', $event);
+ push @{ $self->{ParentStack} }, $event;
+}
+
+sub end_element
+{
+ my ($self, $event) = @_;
+
+ # Mark previous whitespace event as the last event (WS_END)
+ # (if it's there)
+ my $prev = $self->{EventQ}->[-1];
+ $prev->{Loc} |= WS_END if exists $prev->{Loc};
+
+ $self->push_event ('end_element', $event);
+
+ my $elem = pop @{ $self->{ParentStack} };
+ delete $elem->{State};
+}
+
+sub characters
+{
+ my ($self, $event) = @_;
+
+ if ($self->{InCDATA})
+ {
+ # NOTE: 'cdata' is not a valid PerlSAX callback
+ $self->push_event ('cdata', $event);
+
+ my $parent = $self->{ParentStack}->[-1];
+ $parent->{State} |= ENDS_IN_NON_WS unless $parent->{State} == PRESERVE_WS;
+ return;
+ }
+
+ my $text = $event->{Data};
+ return unless length ($text);
+
+ my $state = $self->{ParentStack}->[-1]->{State};
+ if ($state == PRESERVE_WS)
+ {
+ $self->push_event ('characters', $event);
+ }
+ elsif ($state == NO_TEXT_START)
+ {
+ # ELEMENT model does not allow regular text.
+ # All characters are whitespace.
+ $self->push_event ('ignorable_whitespace', { Data => $text, Loc => WS_START });
+ $state = NO_TEXT_ONLY_WS;
+ }
+ elsif ($state == NO_TEXT_ONLY_WS)
+ {
+ $self->merge_text ($text, 'ignorable_whitespace', WS_START );
+ }
+ elsif ($state == NO_TEXT_ENDS_IN_NON_WS)
+ {
+ $self->push_event ('ignorable_whitespace', { Data => $text, Loc => WS_INTER });
+ $state = NO_TEXT_ENDS_IN_WS;
+ }
+ elsif ($state == NO_TEXT_ENDS_IN_WS)
+ {
+ $self->merge_text ($text, 'ignorable_whitespace', WS_INTER );
+ }
+ elsif ($state == START)
+ {
+#?? add support for full Unicode
+ $text =~ /^(\s*)(\S(?:.*\S)?)?(\s*)$/;
+ if (length $1)
+ {
+ $self->push_event ('ws', { Data => $1, Loc => WS_START });
+ $state = ONLY_WS;
+ }
+ if (length $2)
+ {
+ $self->push_event ('characters', { Data => $2 });
+ $state = ENDS_IN_NON_WS;
+ }
+ if (length $3)
+ {
+ $self->push_event ('ws', { Data => $3, Loc => WS_INTER });
+ $state = ENDS_IN_WS;
+ }
+ }
+ elsif ($state == ONLY_WS)
+ {
+ $text =~ /^(\s*)(\S(?:.*\S)?)?(\s*)$/;
+ if (length $1)
+ {
+ $self->merge_text ($1, 'ws', WS_START);
+ }
+ if (length $2)
+ {
+ $self->push_event ('characters', { Data => $2 });
+ $state = ENDS_IN_NON_WS;
+ }
+ if (length $3)
+ {
+ $self->push_event ('ws', { Data => $3, Loc => WS_INTER });
+ $state = ENDS_IN_WS;
+ }
+ }
+ else # state == ENDS_IN_WS or ENDS_IN_NON_WS
+ {
+ $text =~ /^(.*\S)?(\s*)$/;
+ if (length $1)
+ {
+ if ($state == ENDS_IN_NON_WS)
+ {
+ $self->merge_text ($1, 'characters');
+ }
+ else
+ {
+ $self->push_event ('characters', { Data => $1 });
+ $state = ENDS_IN_NON_WS;
+ }
+ }
+ if (length $2)
+ {
+ if ($state == ENDS_IN_WS)
+ {
+ $self->merge_text ($2, 'ws', WS_INTER);
+ }
+ else
+ {
+ $self->push_event ('ws', { Data => $2, Loc => WS_INTER });
+ $state = ENDS_IN_WS;
+ }
+ }
+ }
+
+ $self->{ParentStack}->[-1]->{State} = $state;
+}
+
+sub element_decl
+{
+ my ($self, $event) = @_;
+ my $tag = $event->{Name};
+ my $model = $event->{Model};
+
+ # Check the model to see if the elements may contain regular text
+ $self->{NoText}->{$tag} = ($model eq 'EMPTY' || $model !~ /\#PCDATA/);
+
+ $self->push_event ('element_decl', $event);
+}
+
+sub attlist_decl
+{
+ my ($self, $event) = @_;
+
+ my $prev = $self->{EventQ}->[-1];
+ if ($prev->{EventType} eq 'attlist_decl' &&
+ $prev->{ElementName} eq $event->{ElementName})
+ {
+ $prev->{MoreFollow} = 1;
+ $event->{First} = 0;
+ }
+ else
+ {
+ $event->{First} = 1;
+ }
+
+ $self->push_event ('attlist_decl', $event);
+}
+
+sub notation_decl
+{
+ my ($self, $event) = @_;
+ $self->push_event ('notation_decl', $event);
+}
+
+sub unparsed_entity_decl
+{
+ my ($self, $event) = @_;
+ $self->push_event ('unparsed_entity_decl', $event);
+}
+
+sub entity_decl
+{
+ my ($self, $event) = @_;
+ $self->push_event ('entity_decl', $event);
+}
+
+sub doctype_decl
+{
+ my ($self, $event) = @_;
+ $self->push_event ('doctype_decl', $event);
+}
+
+sub xml_decl
+{
+ my ($self, $event) = @_;
+ $self->push_event ('xml_decl', $event);
+}
+
+#?? what about set_document_locator, resolve_entity
+
+#
+# Determine the initial State for the current Element.
+# By default, we look at the PreserveWS property (i.e. value of xml:space.)
+# The user can override this to force xml:space="preserve" for a particular
+# element with e.g.
+#
+# sub get_init_state
+# {
+# my ($self, $event) = @_;
+# ($event->{Name} eq 'foo' || $event->{PreserveWS}) ? PRESERVE_WS : START;
+# }
+#
+sub get_init_state
+{
+ my ($self, $event) = @_;
+ my $tag = $event->{Name};
+
+ if ($self->{NoText}->{$tag}) # ELEMENT model does not allow text
+ {
+ return NO_TEXT_START;
+ }
+ $event->{PreserveWS} ? PRESERVE_WS : START;
+}
+
+sub push_event
+{
+ my ($self, $type, $event) = @_;
+
+ $event->{EventType} = $type;
+
+ $self->flush;
+ push @{ $self->{EventQ} }, $event;
+}
+
+# Merge text with previous event (if it has the same EventType)
+# or push a new text event
+sub merge_text
+{
+ my ($self, $str, $eventType, $wsLocation) = @_;
+ my $q = $self->{EventQ};
+
+ my $prev = $q->[-1];
+ if (defined $prev && $prev->{EventType} eq $eventType)
+ {
+ $prev->{Data} .= $str;
+ }
+ else
+ {
+ my $event = { Data => $str };
+ $event->{Loc} = $wsLocation if defined $wsLocation;
+ $self->push_event ($eventType, $event);
+ }
+}
+
+# Forward all events on the EventQ
+sub flush
+{
+ my ($self) = @_;
+
+ my $q = $self->{EventQ};
+ while (@$q)
+ {
+ my $event = shift @$q;
+ my $type = $event->{EventType};
+ delete $event->{EventType};
+
+ $self->{Callback}->{$type}->($event);
+ }
+}
+
+1; # package return code
+
+__END__
+
+=head1 NAME
+
+XML::Filter::DetectWS - A PerlSAX filter that detects ignorable whitespace
+
+=head1 SYNOPSIS
+
+ use XML::Filter::DetectWS;
+
+ my $detect = new XML::Filter::DetectWS (Handler => $handler,
+ SkipIgnorableWS => 1);
+
+=head1 DESCRIPTION
+
+This a PerlSAX filter that detects which character data contains
+ignorable whitespace and optionally filters it.
+
+Note that this is just a first stab at the implementation and it may
+change completely in the near future. Please provide feedback whether
+you like it or not, so I know whether I should change it.
+
+The XML spec defines ignorable whitespace as the character data found in elements
+that were defined in an <!ELEMENT> declaration with a model of 'EMPTY' or
+'Children' (Children is the rule that does not contain '#PCDATA'.)
+
+In addition, XML::Filter::DetectWS allows the user to define other whitespace to
+be I<ignorable>. The ignorable whitespace is passed to the PerlSAX Handler with
+the B<ignorable_whitespace> handler, provided that the Handler implements this
+method. (Otherwise it is passed to the characters handler.)
+If the B<SkipIgnorableWS> is set, the ignorable whitespace is simply
+discarded.
+
+XML::Filter::DetectWS also takes xml:space attributes into account. See below
+for details.
+
+CDATA sections are passed in the standard PerlSAX way (i.e. with surrounding
+start_cdata and end_cdata events), unless the Handler does not implement these
+methods. In that case, the CDATA section is simply passed to the characters
+method.
+
+=head1 Constructor Options
+
+=over 4
+
+=item * SkipIgnorableWS (Default: 0)
+
+When set, detected ignorable whitespace is discarded.
+
+=item * Handler
+
+The PerlSAX handler (or filter) that will receive the PerlSAX events from this
+filter.
+
+=back
+
+=head1 Current Implementation
+
+When determining which whitespace is ignorable, it first looks at the
+xml:space attribute of the parent element node (and its ancestors.)
+If the attribute value is "preserve", then it is *NOT* ignorable.
+(If someone took the trouble of adding xml:space="preserve", then that is
+the final answer...)
+
+If xml:space="default", then we look at the <!ELEMENT> definition of the parent
+element. If the model is 'EMPTY' or follows the 'Children' rule (i.e. does not
+contain '#PCDATA') then we know that the whitespace is ignorable.
+Otherwise we need input from the user somehow.
+
+The idea is that the API of DetectWS will be extended, so that you can
+specify/override e.g. which elements should behave as if xml:space="preserve"
+were set, and/or which elements should behave as if the <!ELEMENT> model was
+defined a certain way, etc.
+
+Please send feedback!
+
+The current implementation also detects whitespace after an element-start tag,
+whitespace before an element-end tag.
+It also detects whitespace before an element-start and after an element-end tag
+and before or after comments, processing instruction, cdata sections etc.,
+but this needs to be reimplemented.
+In either case, the detected whitespace is split off into its own PerlSAX
+characters event and an extra property 'Loc' is added. It can have 4 possible
+values:
+
+=over 4
+
+=item * 1 (WS_START) - whitespace immediately after element-start tag
+
+=item * 2 (WS_END) - whitespace just before element-end tag
+
+=item * 3 (WS_ONLY) - both WS_START and WS_END, i.e. it's the only text found between the start and end tag and it's all whitespace
+
+=item * 0 (WS_INTER) - none of the above, probably before an element-start tag,
+after an element-end tag, or before or after a comment, PI, cdata section etc.
+
+=back
+
+Note that WS_INTER may not be that useful, so this may change.
+
+=head1 xml:space attribute
+
+The XML spec states that: A special attribute
+named xml:space may be attached to an element
+to signal an intention that in that element,
+white space should be preserved by applications.
+In valid documents, this attribute, like any other, must be
+declared if it is used.
+When declared, it must be given as an
+enumerated type whose only
+possible values are "default" and "preserve".
+For example:
+
+ <!ATTLIST poem xml:space (default|preserve) 'preserve'>
+
+The value "default" signals that applications'
+default white-space processing modes are acceptable for this element; the
+value "preserve" indicates the intent that applications preserve
+all the white space.
+This declared intent is considered to apply to all elements within the content
+of the element where it is specified, unless overriden with another instance
+of the xml:space attribute.
+
+The root element of any document
+is considered to have signaled no intentions as regards application space
+handling, unless it provides a value for
+this attribute or the attribute is declared with a default value.
+
+[... end of excerpt ...]
+
+=head1 CAVEATS
+
+This code is highly experimental!
+It has not been tested well and the API may change.
+
+The code that detects of blocks of whitespace at potential indent positions
+may need some work. See
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Filter/Reindent.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,301 @@
+package XML::Filter::Reindent;
+use strict;
+use XML::Filter::DetectWS;
+
+use vars qw{ @ISA };
+@ISA = qw{ XML::Filter::DetectWS };
+
+sub MAYBE (%) { 2 }
+
+sub new
+{
+ my $class = shift;
+ my $self = $class->SUPER::new (@_);
+
+ # Use one space per indent level (by default)
+ $self->{Tab} = " " unless defined $self->{Tab};
+
+ # Note that this is a PerlSAX filter so we use the XML newline ("\x0A"),
+ # not the Perl output newline ("\n"), by default.
+ $self->{Newline} = "\x0A" unless defined $self->{Newline};
+
+ $self;
+}
+
+# Indent the element if its parent element says so
+sub indent_element
+{
+ my ($self, $event, $parent_says_indent) = @_;
+ return $parent_says_indent;
+}
+
+# Always indent children unless element (or its ancestor) has
+# xml:space="preserve" attribute
+sub indent_children
+{
+ my ($self, $event) = @_;
+ return $event->{PreserveWS} ? 0 : MAYBE;
+}
+
+sub start_element
+{
+ my ($self, $event) = @_;
+
+ my $parent = $self->{ParentStack}->[-1];
+ my $level = $self->{Level}++;
+ $self->SUPER::start_element ($event);
+
+ my $parent_says_indent = $parent->{IndentChildren} ? 1 : 0;
+ # init with 1 if parent says MAYBE
+ $event->{Indent} = $self->indent_element ($event, $parent_says_indent) ?
+ $level : undef;
+
+ $event->{IndentChildren} = $self->indent_children ($event);
+}
+
+sub end_element
+{
+ my ($self, $event) = @_;
+ my $start_element = $self->{ParentStack}->[-1];
+
+ if ($start_element->{IndentChildren} == MAYBE)
+ {
+ my $q = $self->{EventQ};
+ my $prev = $q->[-1];
+
+ if ($prev == $start_element)
+ {
+ # End tag follows start tag: compress tag
+ $start_element->{Compress} = 1;
+ $event->{Compress} = 1;
+#?? could detect if it contains only ignorable_ws
+ }
+ elsif ($prev->{EventType} eq 'characters')
+ {
+ if ($q->[-2] == $start_element)
+ {
+ # Element has only one child, a text node.
+ # Print element as: <a>text here</a>
+ delete $prev->{Indent};
+ $start_element->{IndentChildren} = 0;
+ }
+ }
+ }
+
+ my $level = --$self->{Level};
+ $event->{Indent} = $start_element->{IndentChildren} ? $level : undef;
+
+ my $compress = $start_element->{Compress};
+ if ($compress)
+ {
+ $event->{Compress} = $compress;
+ delete $event->{Indent};
+ }
+
+ $self->SUPER::end_element ($event);
+}
+
+sub end_document
+{
+ my ($self, $event) = @_;
+
+ $self->push_event ('end_document', $event || {});
+ $self->flush (0); # send remaining events
+}
+
+sub push_event
+{
+ my ($self, $type, $event) = @_;
+
+ $event->{EventType} = $type;
+ if ($type =~ /^(characters|comment|processing_instruction|entity_reference|cdata)$/)
+ {
+ my $indent_kids = $self->{ParentStack}->[-1]->{IndentChildren} ? 1 : 0;
+ $event->{Indent} = $indent_kids ? $self->{Level} : undef;
+ }
+
+ my $q = $self->{EventQ};
+ push @$q, $event;
+
+ $self->flush (4); # keep 4 events on the stack (maybe 3 is enough)
+}
+
+sub flush
+{
+ my ($self, $keep) = @_;
+ my $q = $self->{EventQ};
+
+ while (@$q > $keep)
+ {
+ my $head = $q->[0];
+# print "head=" . $head->{EventType} . " indent=" . $head->{Indent} . "\n";
+
+ if ($head->{EventType} =~ /ws|ignorable/)
+ {
+ my $next = $q->[1];
+ my $indent = $next->{Indent};
+
+ if (defined $indent) # fix existing indent
+ {
+ $head->{Data} = $self->{Newline} . ($self->{Tab} x $indent);
+ $self->send (2);
+ }
+ else # remove existing indent
+ {
+ shift @$q;
+ $self->send (1);
+ }
+#?? remove keys: Indent, ...
+ }
+ else
+ {
+ my $indent = $head->{Indent};
+
+ if (defined $indent) # insert indent
+ {
+ unshift @$q, { EventType => 'ws',
+ Data => $self->{Newline} . ($self->{Tab} x $indent) };
+ $self->send (2);
+ }
+ else # no indent - leave as is
+ {
+ $self->send (1);
+ }
+ }
+ }
+}
+
+sub send
+{
+ my ($self, $i) = @_;
+
+ my $q = $self->{EventQ};
+
+ while ($i--)
+ {
+ my $event = shift @$q;
+ my $type = $event->{EventType};
+ delete $event->{EventType};
+
+#print "TYPE=$type " . join(",", map { "$_=" . $event->{$_} } keys %$event) . "\n";
+ $self->{Callback}->{$type}->($event);
+ }
+}
+
+1; # package return code
+
+=head1 NAME
+
+XML::Filter::Reindent - Reformats whitespace for pretty printing XML
+
+=head1 SYNOPSIS
+
+ use XML::Handler::Composer;
+ use XML::Filter::Reindent;
+
+ my $composer = new XML::Handler::Composer (%OPTIONS);
+ my $indent = new XML::Filter::Reindent (Handler => $composer, %OPTIONS);
+
+=head1 DESCRIPTION
+
+XML::Filter::Reindent is a sub class of L<XML::Filter::DetectWS>.
+
+XML::Filter::Reindent can be used as a PerlSAX filter to reformat an
+XML document before sending it to a PerlSAX handler that prints it
+(like L<XML::Handler::Composer>.)
+
+Like L<XML::Filter::DetectWS>, it detects ignorable whitespace and blocks of
+whitespace characters in certain places. It uses this information and
+information supplied by the user to determine where whitespace may be
+modified, deleted or inserted.
+Based on the indent settings, it then modifies, inserts and deletes characters
+and ignorable_whitespace events accordingly.
+
+This is just a first stab at the implementation.
+It may be buggy and may change completely!
+
+=head1 Constructor Options
+
+=over 4
+
+=item * Handler
+
+The PerlSAX handler (or filter) that will receive the PerlSAX events from this
+filter.
+
+=item * Tab (Default: one space)
+
+The number of spaces per indent level for elements etc. in document content.
+
+=item * Newline (Default: "\x0A")
+
+The newline to use when re-indenting.
+The default is the internal newline used by L<XML::Parser>, L<XML::DOM> etc.,
+and should be fine when used in combination with L<XML::Handler::Composer>.
+
+=back
+
+=head1 $self->indent_children ($start_element_event)
+
+This method determines whether children of a certain element
+may be reformatted.
+The default implementation checks the PreserveWS parameter of the specified
+start_element event and returns 0 if it is set or MAYBE otherwise.
+The value MAYBE (2) indicates that further investigation is needed, e.g.
+by examining the element contents. A value of 1 means yes, indent the
+child nodes, no further investigation is needed.
+
+NOTE: the PreserveWS parameter is set by the parent class,
+L<XML::Filter::DetectWS>, when the element or one of its ancestors has
+the attribute xml:space="preserve".
+
+Override this method to tweak the behavior of this class.
+
+=head1 $self->indent_element ($start_element_event, $parent_says_indent)
+
+This method determines whether a certain element may be re-indented.
+The default implementation returns the value of the $parent_says_indent
+parameter, which was set to the value returned by indent_children for the
+parent element. In other words, the element will be re-indented if the
+parent element allows it.
+
+Override this method to tweak the behavior of this class.
+I'm not sure how useful this hook is. Please provide feedback!
+
+=head1 Current Implementation
+
+The current implementation puts all incoming Perl SAX events in a queue for
+further processing. When determining which nodes should be re-indented,
+it sometimes needs information from previous events, hence the use of the
+queue.
+
+The parameter (Compress => 1) is added to
+matching start_element and end_element events with no events in between
+This indicates to an XML printer that a compressed notation can be used,
+e.g <foo/>.
+
+If an element allows reformatting of its contents (xml:space="preserve" was
+not active and indent_children returned MAYBE), the element
+contents will be reformatted unless it only has one child node and that
+child is a regular text node (characters event.)
+In that case, the element will be printed as <foo>text contents</foo>.
+
+If you want element nodes with just one text child to be reindented as well,
+simply override indent_children to return 1 instead of MAYBE (2.)
+
+This behavior may be changed or extended in the future.
+
+=head1 CAVEATS
+
+This code is highly experimental!
+It has not been tested well and the API may change.
+
+The code that detects blocks of whitespace at potential indent positions
+may need some work.
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Filter/SAXT.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,188 @@
+#
+# To do:
+# - later: ErrorHandler, Locale?
+
+package XML::Filter::SAXT;
+use strict;
+
+use vars qw( %SAX_HANDLERS );
+
+%SAX_HANDLERS = ( DocumentHandler =>
+ [ "start_document",
+ "end_document",
+ "start_element",
+ "end_element",
+ "characters",
+ "processing_instruction",
+ "comment",
+ "start_cdata",
+ "end_cdata",
+ "entity_reference",
+ "set_document_locator" # !! passes {Locator=>$perlsax}
+ ],
+
+ DTDHandler =>
+ [ "notation_decl",
+ "unparsed_entity_decl",
+ "entity_decl",
+ "element_decl",
+ "attlist_decl",
+ "doctype_decl",
+ "xml_decl"
+ ],
+
+ EntityResolver =>
+ [ "resolve_entity" ]);
+
+#
+# Usage:
+#
+# $saxt = new XML::Filter::SAXT ( { Handler => $out0 },
+# { DocumentHandler => $out1 },
+# { DTDHandler => $out3,
+# Handler => $out4
+# }
+# );
+#
+# $perlsax = new XML::Parser::PerlSAX ( Handler => $saxt );
+# $perlsax->parse ( [OPTIONS] );
+#
+sub new
+{
+ my ($class, @out) = @_;
+
+ my $self = bless { Out => \@out }, $class;
+
+ for (my $i = 0; $i < @out; $i++)
+ {
+ for my $handler (keys %SAX_HANDLERS)
+ {
+ my $callbacks = $SAX_HANDLERS{$handler};
+ my $h = ($self->{Out}->[$i]->{$handler} ||= $self->{Out}->[$i]->{Handler});
+ next unless defined $h;
+
+ for my $cb (@$callbacks)
+ {
+ if (UNIVERSAL::can ($h, $cb))
+ {
+ $self->{$cb} .= "\$out->[$i]->{$handler}->$cb (\@_);\n";
+ }
+ }
+ }
+ }
+
+ for my $handler (keys %SAX_HANDLERS)
+ {
+ my $callbacks = $SAX_HANDLERS{$handler};
+ for my $cb (@$callbacks)
+ {
+ my $code = $self->{$cb};
+ if (defined $code)
+ {
+ $self->{$cb} =
+ eval "sub { my \$out = shift->{Out}; $code }";
+ }
+ else
+ {
+ $self->{$cb} = \&noop;
+ }
+ }
+ }
+ return $self;
+}
+
+sub noop
+{
+ # does nothing
+}
+
+for my $cb (map { @{ $_ } } values %SAX_HANDLERS)
+{
+ eval "sub $cb { shift->{$cb}->(\@_); }";
+}
+
+1; # package return code
+
+__END__
+
+=head1 NAME
+
+XML::Filter::SAXT - Replicates SAX events to several SAX event handlers
+
+=head1 SYNOPSIS
+
+ $saxt = new XML::Filter::SAXT ( { Handler => $out1 },
+ { DocumentHandler => $out2 },
+ { DTDHandler => $out3,
+ Handler => $out4
+ }
+ );
+
+ $perlsax = new XML::Parser::PerlSAX ( Handler => $saxt );
+ $perlsax->parse ( [OPTIONS] );
+
+=head1 DESCRIPTION
+
+SAXT is like the Unix 'tee' command in that it multiplexes the input stream
+to several output streams. In this case, the input stream is a PerlSAX event
+producer (like XML::Parser::PerlSAX) and the output streams are PerlSAX
+handlers or filters.
+
+The SAXT constructor takes a list of hash references. Each hash specifies
+an output handler. The hash keys can be: DocumentHandler, DTDHandler,
+EntityResolver or Handler, where Handler is a combination of the previous three
+and acts as the default handler.
+E.g. if DocumentHandler is not specified, it will try to use Handler.
+
+=head2 EXAMPLE
+
+In this example we use L<XML::Parser::PerlSAX> to parse an XML file and
+to invoke the PerlSAX callbacks of our SAXT object. The SAXT object then
+forwards the callbacks to L<XML::Checker>, which will 'die' if it encounters
+an error, and to L<XML::Hqandler::BuildDOM>, which will store the XML in an
+L<XML::DOM::Document>.
+
+ use XML::Parser::PerlSAX;
+ use XML::Filter::SAXT;
+ use XML::Handler::BuildDOM;
+ use XML::Checker;
+
+ my $checker = new XML::Checker;
+ my $builder = new XML::Handler::BuildDOM (KeepCDATA => 1);
+ my $tee = new XML::Filter::SAXT ( { Handler => $checker },
+ { Handler => $builder } );
+
+ my $parser = new XML::Parser::PerlSAX (Handler => $tee);
+ eval
+ {
+ # This is how you set the error handler for XML::Checker
+ local $XML::Checker::FAIL = \&my_fail;
+
+ my $dom_document = $parser->parsefile ("file.xml");
+ ... your code here ...
+ };
+ if ($@)
+ {
+ # Either XML::Parser::PerlSAX threw an exception (bad XML)
+ # or XML::Checker found an error and my_fail died.
+ ... your error handling code here ...
+ }
+
+ # XML::Checker error handler
+ sub my_fail
+ {
+ my $code = shift;
+ die XML::Checker::error_string ($code, @_)
+ if $code < 200; # warnings and info messages are >= 200
+ }
+
+=head1 CAVEATS
+
+This is still alpha software.
+Package names and interfaces are subject to change.
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Handler/BuildDOM.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,338 @@
+package XML::Handler::BuildDOM;
+use strict;
+use XML::DOM;
+
+#
+# TODO:
+# - add support for parameter entity references
+# - expand API: insert Elements in the tree or stuff into DocType etc.
+
+sub new
+{
+ my ($class, %args) = @_;
+ bless \%args, $class;
+}
+
+#-------- PerlSAX Handler methods ------------------------------
+
+sub start_document # was Init
+{
+ my $self = shift;
+
+ # Define Document if it's not set & not obtainable from Element or DocType
+ $self->{Document} ||=
+ (defined $self->{Element} ? $self->{Element}->getOwnerDocument : undef)
+ || (defined $self->{DocType} ? $self->{DocType}->getOwnerDocument : undef)
+ || new XML::DOM::Document();
+
+ $self->{Element} ||= $self->{Document};
+
+ unless (defined $self->{DocType})
+ {
+ $self->{DocType} = $self->{Document}->getDoctype
+ if defined $self->{Document};
+
+ unless (defined $self->{Doctype})
+ {
+#?? should be $doc->createDocType for extensibility!
+ $self->{DocType} = new XML::DOM::DocumentType ($self->{Document});
+ $self->{Document}->setDoctype ($self->{DocType});
+ }
+ }
+
+ # Prepare for document prolog
+ $self->{InProlog} = 1;
+
+ # We haven't passed the root element yet
+ $self->{EndDoc} = 0;
+
+ undef $self->{LastText};
+}
+
+sub end_document # was Final
+{
+ my $self = shift;
+ unless ($self->{SawDocType})
+ {
+ my $doctype = $self->{Document}->removeDoctype;
+ $doctype->dispose;
+#?? do we always want to destroy the Doctype?
+ }
+ $self->{Document};
+}
+
+sub characters # was Char
+{
+ my $self = $_[0];
+ my $str = $_[1]->{Data};
+
+ if ($self->{InCDATA} && $self->{KeepCDATA})
+ {
+ undef $self->{LastText};
+ # Merge text with previous node if possible
+ $self->{Element}->addCDATA ($str);
+ }
+ else
+ {
+ # Merge text with previous node if possible
+ # Used to be: $expat->{DOM_Element}->addText ($str);
+ if ($self->{LastText})
+ {
+ $self->{LastText}->appendData ($str);
+ }
+ else
+ {
+ $self->{LastText} = $self->{Document}->createTextNode ($str);
+ $self->{Element}->appendChild ($self->{LastText});
+ }
+ }
+}
+
+sub start_element # was Start
+{
+ my ($self, $hash) = @_;
+ my $elem = $hash->{Name};
+ my $attr = $hash->{Attributes};
+
+ my $parent = $self->{Element};
+ my $doc = $self->{Document};
+
+ if ($parent == $doc)
+ {
+ # End of document prolog, i.e. start of first Element
+ $self->{InProlog} = 0;
+ }
+
+ undef $self->{LastText};
+ my $node = $doc->createElement ($elem);
+ $self->{Element} = $node;
+ $parent->appendChild ($node);
+
+ my $i = 0;
+ my $n = scalar keys %$attr;
+ return unless $n;
+
+ if (exists $hash->{AttributeOrder})
+ {
+ my $defaulted = $hash->{Defaulted};
+ my @order = @{ $hash->{AttributeOrder} };
+
+ # Specified attributes
+ for (my $i = 0; $i < $defaulted; $i++)
+ {
+ my $a = $order[$i];
+ my $att = $doc->createAttribute ($a, $attr->{$a}, 1);
+ $node->setAttributeNode ($att);
+ }
+
+ # Defaulted attributes
+ for (my $i = $defaulted; $i < @order; $i++)
+ {
+ my $a = $order[$i];
+ my $att = $doc->createAttribute ($elem, $attr->{$a}, 0);
+ $node->setAttributeNode ($att);
+ }
+ }
+ else
+ {
+ # We're assuming that all attributes were specified (1)
+ for my $a (keys %$attr)
+ {
+ my $att = $doc->createAttribute ($a, $attr->{$a}, 1);
+ $node->setAttributeNode ($att);
+ }
+ }
+}
+
+sub end_element
+{
+ my $self = shift;
+ $self->{Element} = $self->{Element}->getParentNode;
+ undef $self->{LastText};
+
+ # Check for end of root element
+ $self->{EndDoc} = 1 if ($self->{Element} == $self->{Document});
+}
+
+sub entity_reference # was Default
+{
+ my $self = $_[0];
+ my $name = $_[1]->{Name};
+
+ $self->{Element}->appendChild (
+ $self->{Document}->createEntityReference ($name));
+ undef $self->{LastText};
+}
+
+sub start_cdata
+{
+ my $self = shift;
+ $self->{InCDATA} = 1;
+}
+
+sub end_cdata
+{
+ my $self = shift;
+ $self->{InCDATA} = 0;
+}
+
+sub comment
+{
+ my $self = $_[0];
+
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ undef $self->{LastText};
+ my $comment = $self->{Document}->createComment ($_[1]->{Data});
+ $self->{Element}->appendChild ($comment);
+}
+
+sub doctype_decl
+{
+ my ($self, $hash) = @_;
+
+ $self->{DocType}->setParams ($hash->{Name}, $hash->{SystemId},
+ $hash->{PublicId}, $hash->{Internal});
+ $self->{SawDocType} = 1;
+}
+
+sub attlist_decl
+{
+ my ($self, $hash) = @_;
+
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ $self->{DocType}->addAttDef ($hash->{ElementName},
+ $hash->{AttributeName},
+ $hash->{Type},
+ $hash->{Default},
+ $hash->{Fixed});
+}
+
+sub xml_decl
+{
+ my ($self, $hash) = @_;
+
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ undef $self->{LastText};
+ $self->{Document}->setXMLDecl (new XML::DOM::XMLDecl ($self->{Document},
+ $hash->{Version},
+ $hash->{Encoding},
+ $hash->{Standalone}));
+}
+
+sub entity_decl
+{
+ my ($self, $hash) = @_;
+
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ # Parameter Entities names are passed starting with '%'
+ my $parameter = 0;
+
+#?? parameter entities currently not supported by PerlSAX!
+
+ undef $self->{LastText};
+ $self->{DocType}->addEntity ($parameter, $hash->{Name}, $hash->{Value},
+ $hash->{SystemId}, $hash->{PublicId},
+ $hash->{Notation});
+}
+
+# Unparsed is called when it encounters e.g:
+#
+# <!ENTITY logo SYSTEM "http://server/logo.gif" NDATA gif>
+#
+sub unparsed_decl
+{
+ my ($self, $hash) = @_;
+
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ # same as regular ENTITY, as far as DOM is concerned
+ $self->entity_decl ($hash);
+}
+
+sub element_decl
+{
+ my ($self, $hash) = @_;
+
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ undef $self->{LastText};
+ $self->{DocType}->addElementDecl ($hash->{Name}, $hash->{Model});
+}
+
+sub notation_decl
+{
+ my ($self, $hash) = @_;
+
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ undef $self->{LastText};
+ $self->{DocType}->addNotation ($hash->{Name}, $hash->{Base},
+ $hash->{SystemId}, $hash->{PublicId});
+}
+
+sub processing_instruction
+{
+ my ($self, $hash) = @_;
+
+ local $XML::DOM::IgnoreReadOnly = 1;
+
+ undef $self->{LastText};
+ $self->{Element}->appendChild (new XML::DOM::ProcessingInstruction
+ ($self->{Document}, $hash->{Target}, $hash->{Data}));
+}
+
+return 1;
+
+__END__
+
+=head1 NAME
+
+XML::Handler::BuildDOM - PerlSAX handler that creates XML::DOM document structures
+
+=head1 SYNOPSIS
+
+ use XML::Handler::BuildDOM;
+ use XML::Parser::PerlSAX;
+
+ my $handler = new XML::Handler::BuildDOM (KeepCDATA => 1);
+ my $parser = new XML::Parser::PerlSAX (Handler => $handler);
+
+ my $doc = $parser->parsefile ("file.xml");
+
+=head1 DESCRIPTION
+
+XML::Handler::BuildDOM creates L<XML::DOM> document structures
+(i.e. L<XML::DOM::Document>) from PerlSAX events.
+
+This class used to be called L<XML::PerlSAX::DOM> prior to libxml-enno 1.0.1.
+
+=head2 CONSTRUCTOR OPTIONS
+
+The XML::Handler::BuildDOM constructor supports the following options:
+
+=over 4
+
+=item * KeepCDATA => 1
+
+If set to 0 (default), CDATASections will be converted to regular text.
+
+=item * Document => $doc
+
+If undefined, start_document will extract it from Element or DocType (if set),
+otherwise it will create a new XML::DOM::Document.
+
+=item * Element => $elem
+
+If undefined, it is set to Document. This will be the insertion point (or parent)
+for the nodes defined by the following callbacks.
+
+=item * DocType => $doctype
+
+If undefined, start_document will extract it from Document (if possible).
+Otherwise it adds a new XML::DOM::DocumentType to the Document.
+
+=back
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Handler/CanonXMLWriter.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,180 @@
+#
+# Copyright (C) 1998, 1999 Ken MacLeod
+# XML::Handler::CanonXMLWriter is free software; you can redistribute
+# it and/or modify it under the same terms as Perl itself.
+#
+# $Id: CanonXMLWriter.pm,v 1.2 1999/12/22 21:15:00 kmacleod Exp $
+#
+
+use strict;
+
+package XML::Handler::CanonXMLWriter;
+use vars qw{ $VERSION %char_entities };
+
+# will be substituted by make-rel script
+$VERSION = "0.07";
+
+%char_entities = (
+ "\x09" => '	',
+ "\x0a" => ' ',
+ "\x0d" => ' ',
+ '&' => '&',
+ '<' => '<',
+ '>' => '>',
+ '"' => '"',
+);
+
+sub new {
+ my ($class, %args) = @_;
+
+ my $self = \%args;
+ return bless $self, $class;
+}
+
+sub start_document {
+ my $self = shift; my $document = shift;
+
+ $self->{'_text_array'} = [];
+}
+
+sub end_document {
+ my $self = shift; my $document = shift;
+
+ if (defined $self->{IOHandle}) {
+ return ();
+ } else {
+ my $text = join ('', @{$self->{'_text_array'}});
+ undef $self->{'_text_array'};
+ return $text;
+ }
+}
+
+sub start_element {
+ my $self = shift; my $element = shift;
+
+ $self->_print('<' . $element->{Name});
+ my $key;
+ my $attrs = $element->{Attributes};
+ foreach $key (sort keys %$attrs) {
+ $self->_print(" $key=\"" . $self->_escape($attrs->{$key}) . '"');
+ }
+ $self->_print('>');
+}
+
+sub end_element {
+ my $self = shift; my $element = shift;
+
+ $self->_print('</' . $element->{Name} . '>');
+}
+
+sub characters {
+ my $self = shift; my $characters = shift;
+
+ $self->_print($self->_escape($characters->{Data}));
+}
+
+sub ignorable_whitespace {
+ my $self = shift; my $characters = shift;
+
+ $self->_print($self->_escape($characters->{Data}));
+}
+
+sub processing_instruction {
+ my $self = shift; my $pi = shift;
+
+ $self->_print('<?' . $pi->{Target} . ' ' . $pi->{Data} . '?>');
+}
+
+sub entity {
+ # entities don't occur in text
+ return ();
+}
+
+sub comment {
+ my $self = shift; my $comment = shift;
+
+ if ($self->{PrintComments}) {
+ $self->_print('<!--' . $comment->{Data} . '-->');
+ } else {
+ return ();
+ }
+}
+
+sub _print {
+ my $self = shift; my $string = shift;
+
+ if (defined $self->{IOHandle}) {
+ $self->{IOHandle}->print($string);
+ return ();
+ } else {
+ push @{$self->{'_text_array'}}, $string;
+ }
+}
+
+sub _escape {
+ my $self = shift; my $string = shift;
+
+ $string =~ s/([\x09\x0a\x0d&<>"])/$char_entities{$1}/ge;
+ return $string;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Handler::CanonXMLWriter - output XML in canonical XML format
+
+=head1 SYNOPSIS
+
+ use XML::Handler::CanonXMLWriter;
+
+ $writer = XML::Handler::CanonXMLWriter OPTIONS;
+ $parser->parse(Handler => $writer);
+
+=head1 DESCRIPTION
+
+C<XML::Handler::CanonXMLWriter> is a PerlSAX handler that will return
+a string or write a stream of canonical XML for an XML instance and it's
+content.
+
+C<XML::Handler::CanonXMLWriter> objects hold the options used for
+writing the XML objects. Options can be supplied when the the object
+is created,
+
+ $writer = new XML::Handler::CanonXMLWriter PrintComments => 1;
+
+or modified at any time before calling the parser's `C<parse()>' method:
+
+ $writer->{PrintComments} = 0;
+
+=head1 OPTIONS
+
+=over 4
+
+=item IOHandle
+
+IOHandle contains a handle for writing the canonical XML to. If an
+IOHandle is not provided, the canonical XML string will be returned
+from `C<parse()>'.
+
+=item PrintComments
+
+By default comments are not written to the output. Setting comment to
+a true value will include comments in the output.
+
+=back
+
+=head1 AUTHOR
+
+Ken MacLeod, ken@bitsko.slc.ut.us
+
+=head1 SEE ALSO
+
+perl(1), PerlSAX
+
+James Clark's Canonical XML definition
+<http://www.jclark.com/xml/canonxml.html>
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Handler/Composer.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,821 @@
+package XML::Handler::Composer;
+use strict;
+use XML::UM;
+use Carp;
+
+use vars qw{ %DEFAULT_QUOTES %XML_MAPPING_CRITERIA };
+
+%DEFAULT_QUOTES = (
+ XMLDecl => '"',
+ Attr => '"',
+ Entity => '"',
+ SystemLiteral => '"',
+ );
+
+%XML_MAPPING_CRITERIA =
+(
+ Text =>
+ {
+ '<' => '<',
+ '&' => '&',
+
+ ']]>' => ']]>',
+ },
+
+ CDataSection =>
+ {
+ ']]>' => ']]>', # NOTE: this won't be translated back correctly
+ },
+
+ Attr => # attribute value (assuming double quotes "" are used)
+ {
+# '"' => '"', # Use ("'" => ''') when using single quotes
+ '<' => '<',
+ '&' => '&',
+ },
+
+ Entity => # entity value (assuming double quotes "" are used)
+ {
+# '"' => '"', # Use ("'" => ''') when using single quotes
+ '%' => '%',
+ '&' => '&',
+ },
+
+ Comment =>
+ {
+ '--' => '--', # NOTE: this won't be translated back correctly
+ },
+
+ ProcessingInstruction =>
+ {
+ '?>' => '?>', # not sure if this will be translated back correctly
+ },
+
+ # The SYSTEM and PUBLIC identifiers in DOCTYPE declaration (quoted strings)
+ SystemLiteral =>
+ {
+# '"' => '"', # Use ("'" => ''') when using single quotes
+ },
+
+);
+
+sub new
+{
+ my ($class, %options) = @_;
+ my $self = bless \%options, $class;
+
+ $self->{EndWithNewline} = 1 unless defined $self->{EndWithNewline};
+
+ if (defined $self->{Newline})
+ {
+ $self->{ConvertNewlines} = 1;
+ }
+ else
+ {
+ # Use this when printing newlines in case the user didn't specify one
+ $self->{Newline} = "\x0A";
+ }
+
+ $self->{DocTypeIndent} = $self->{Newline} . " "
+ unless defined $self->{DocTypeIndent};
+
+ $self->{IndentAttlist} = " " unless defined $self->{IndentAttlist};
+
+ $self->{Print} = sub { print @_ } unless defined $self->{Print};
+
+ $self->{Quote} ||= {};
+ for my $q (keys %DEFAULT_QUOTES)
+ {
+ $self->{Quote}->{$q} ||= $DEFAULT_QUOTES{$q};
+ }
+
+ # Convert to UTF-8 by default, i.e. when <?xml encoding=...?> is missing
+ # and no {Encoding} is specified.
+ # Note that the internal representation *is* UTF-8, so we
+ # simply return the (string) parameter.
+ $self->{Encode} = sub { shift } unless defined $self->{Encode};
+
+ # Convert unmapped characters to hexadecimal constants a la '号'
+ $self->{EncodeUnmapped} = \&XML::UM::encode_unmapped_hex
+ unless defined $self->{EncodeUnmapped};
+
+ my $encoding = $self->{Encoding};
+ $self->setEncoding ($encoding) if defined $encoding;
+
+ $self->initMappers;
+
+ $self;
+}
+
+#
+# Setup the mapping routines that convert '<' to '<' etc.
+# for the specific XML constructs.
+#
+sub initMappers
+{
+ my $self = shift;
+ my %escape;
+ my $convert_newlines = $self->{ConvertNewlines};
+
+ for my $n (qw{ Text Comment CDataSection Attr SystemLiteral
+ ProcessingInstruction Entity })
+ {
+ $escape{$n} = $self->create_utf8_mapper ($n, $convert_newlines);
+ }
+
+ # Text with xml:space="preserve", should not have newlines converted.
+ $escape{TextPreserveNL} = $self->create_utf8_mapper ('Text', 0);
+ # (If newline conversion is inactive, $escape{TextPreserveNL} does the
+ # same as $escape{Text} defined above ...)
+
+ $self->{Escape} = \%escape;
+}
+
+sub setEncoding
+{
+ my ($self, $encoding) = @_;
+
+ $self->{Encode} = XML::UM::get_encode (
+ Encoding => $encoding, EncodeUnmapped => $self->{EncodeUnmapped});
+}
+
+sub create_utf8_mapper
+{
+ my ($self, $construct, $convert_newlines) = @_;
+
+ my $c = $XML_MAPPING_CRITERIA{$construct};
+ croak "no XML mapping criteria defined for $construct"
+ unless defined $c;
+
+ my %hash = %$c;
+
+ # If this construct appears between quotes in the XML document
+ # (and it has a quoting character defined),
+ # ensure that the quoting character is appropriately converted
+ # to " or '
+ my $quote = $self->{Quote}->{$construct};
+ if (defined $quote)
+ {
+ $hash{$quote} = $quote eq '"' ? '"' : ''';
+ }
+
+ if ($convert_newlines)
+ {
+ $hash{"\x0A"} = $self->{Newline};
+ }
+
+ gen_utf8_subst (%hash);
+}
+
+#
+# Converts a string literal e.g. "ABC" into '\x41\x42\x43'
+# so it can be stuffed into a regular expression
+#
+sub str_to_hex # static
+{
+ my $s = shift;
+
+ $s =~ s/(.)/ sprintf ("\\x%02x", ord ($1)) /egos;
+
+ $s;
+}
+
+#
+# In later perl versions (5.005_55 and up) we can simply say:
+#
+# use utf8;
+# $literals = join ("|", map { str_to_hex ($_) } keys %hash);
+# $s =~ s/($literals)/$hash{$1}/ego;
+#
+
+sub gen_utf8_subst # static
+{
+ my (%hash) = @_;
+
+ my $code = 'sub { my $s = shift; $s =~ s/(';
+ $code .= join ("|", map { str_to_hex ($_) } keys %hash);
+ $code .= ')|(';
+ $code .= '[\\x00-\\xBF]|[\\xC0-\\xDF].|[\\xE0-\\xEF]..|[\\xF0-\\xFF]...';
+ $code .= ')/ defined ($1) ? $hash{$1} : $2 /ego; $s }';
+
+ my $f = eval $code;
+ croak "XML::Handler::Composer - can't eval code: $code\nReason: $@" if $@;
+
+ $f;
+}
+
+# This should be optimized!
+sub print
+{
+ my ($self, $str) = @_;
+ $self->{Print}->($self->{Encode}->($str));
+}
+
+# Used by start_element. It determines the style in which empty elements
+# are printed. The default implementation returns "/>" so they are printed
+# like this: <a/>
+# Override this method to support e.g. XHTML style tags.
+sub get_compressed_element_suffix
+{
+ my ($self, $event) = @_;
+
+ "/>";
+
+ # return " />" for XHTML style, or
+ # "><$tagName/>" for uncompressed tags (where $tagName is $event->{Name})
+}
+
+#----- PerlSAX handlers -------------------------------------------------------
+
+sub start_document
+{
+ my ($self) = @_;
+
+ $self->{InCDATA} = 0;
+ $self->{DTD} = undef;
+ $self->{PreserveWS} = 0; # root element has xml:space="default"
+ $self->{PreserveStack} = [];
+ $self->{PrintedXmlDecl} = 0; # whether <?xml ...?> was printed
+}
+
+sub end_document
+{
+ my ($self) = @_;
+
+ # Print final Newline at the end of the XML document (if desired)
+ $self->print ($self->{Newline}) if $self->{EndWithNewline};
+}
+
+# This event is received *AFTER* the Notation, Element, Attlist etc. events
+# that are contained within the DTD.
+sub doctype_decl
+{
+ my ($self, $event) = @_;
+ $self->flush_xml_decl;
+
+ my $q = $self->{Quote}->{SystemLiteral};
+ my $escape_literal = $self->{Escape}->{SystemLiteral};
+
+ my $name = $event->{Name};
+ my $sysId = $event->{SystemId};
+ $sysId = &$escape_literal ($sysId) if defined $sysId;
+ my $pubId = $event->{PublicId};
+ $pubId = &$escape_literal ($pubId) if defined $pubId;
+
+ my $str = "<!DOCTYPE $name";
+ if (defined $pubId)
+ {
+ $str .= " PUBLIC $q$pubId$q $q$sysId$q";
+ }
+ elsif (defined $sysId)
+ {
+ $str .= " SYSTEM $q$sysId$q";
+ }
+
+ my $dtd_contents = $self->{DTD};
+ my $nl = $self->{Newline};
+
+ if (defined $dtd_contents)
+ {
+ delete $self->{DTD};
+
+ $str .= " [$dtd_contents$nl]>$nl";
+ }
+ else
+ {
+ $str .= ">$nl";
+ }
+ $self->print ($str);
+}
+
+sub start_element
+{
+ my ($self, $event) = @_;
+
+ my $preserve_stack = $self->{PreserveStack};
+ if (@$preserve_stack == 0)
+ {
+ # This is the root element. Print the <?xml ...?> declaration now if
+ # it wasn't printed and it should be.
+ $self->flush_xml_decl;
+ }
+
+ my $str = "<" . $event->{Name};
+
+ my $suffix = ">";
+ if ($event->{Compress})
+ {
+ $suffix = $self->get_compressed_element_suffix ($event);
+ }
+
+ # Push PreserveWS state of parent element on the stack
+ push @{ $preserve_stack }, $self->{PreserveWS};
+ $self->{PreserveWS} = $event->{PreserveWS};
+
+ my $ha = $event->{Attributes};
+ my @attr;
+ if (exists $event->{AttributeOrder})
+ {
+ my $defaulted = $event->{Defaulted};
+ if (defined $defaulted && !$self->{PrintDefaultAttr})
+ {
+ if ($defaulted > 0)
+ {
+ @attr = @{ $event->{AttributeOrder} }[0 .. $defaulted - 1];
+ }
+ # else: all attributes are defaulted i.e. @attr = ();
+ }
+ else # no attr are defaulted
+ {
+ @attr = @{ $event->{AttributeOrder} };
+ }
+ }
+ else # no attr order defined
+ {
+ @attr = keys %$ha;
+ }
+
+ my $escape = $self->{Escape}->{Attr};
+ my $q = $self->{Quote}->{Attr};
+
+ for (my $i = 0; $i < @attr; $i++)
+ {
+#?? could print a newline every so often...
+ my $name = $attr[$i];
+ my $val = &$escape ($ha->{$name});
+ $str .= " $name=$q$val$q";
+ }
+ $str .= $suffix;
+
+ $self->print ($str);
+}
+
+sub end_element
+{
+ my ($self, $event) = @_;
+
+ $self->{PreserveWS} = pop @{ $self->{PreserveStack} };
+
+ return if $event->{Compress};
+
+ $self->print ("</" . $event->{Name} . ">");
+}
+
+sub characters
+{
+ my ($self, $event) = @_;
+
+ if ($self->{InCDATA})
+ {
+#?? should this use $self->{PreserveWS} ?
+
+ my $esc = $self->{Escape}->{CDataSection};
+ $self->print (&$esc ($event->{Data}));
+ }
+ else # regular text
+ {
+ my $esc = $self->{PreserveWS} ?
+ $self->{Escape}->{TextPreserveNL} :
+ $self->{Escape}->{Text};
+
+ $self->print (&$esc ($event->{Data}));
+ }
+}
+
+sub start_cdata
+{
+ my $self = shift;
+ $self->{InCDATA} = 1;
+
+ $self->print ("<![CDATA[");
+}
+
+sub end_cdata
+{
+ my $self = shift;
+ $self->{InCDATA} = 0;
+
+ $self->print ("]]>");
+}
+
+sub comment
+{
+ my ($self, $event) = @_;
+ $self->flush_xml_decl;
+
+ my $esc = $self->{Escape}->{Comment};
+#?? still need to support comments in the DTD
+
+ $self->print ("<!--" . &$esc ($event->{Data}) . "-->");
+}
+
+sub entity_reference
+{
+ my ($self, $event) = @_;
+ $self->flush_xml_decl;
+
+ my $par = $event->{Parameter} ? '%' : '&';
+#?? parameter entities (like %par;) are NOT supported!
+# PerlSAX::handle_default should be fixed!
+
+ $self->print ($par . $event->{Name} . ";");
+}
+
+sub unparsed_entity_decl
+{
+ my ($self, $event) = @_;
+ $self->flush_xml_decl;
+
+ $self->entity_decl ($event);
+}
+
+sub notation_decl
+{
+ my ($self, $event) = @_;
+ $self->flush_xml_decl;
+
+ my $name = $event->{Name};
+ my $sysId = $event->{SystemId};
+ my $pubId = $event->{PublicId};
+
+ my $q = $self->{Quote}->{SystemLiteral};
+ my $escape = $self->{Escape}->{SystemLiteral};
+
+ $sysId = &$escape ($sysId) if defined $sysId;
+ $pubId = &$escape ($pubId) if defined $pubId;
+
+ my $str = $self->{DocTypeIndent} . "<!NOTATION $name";
+
+ if (defined $pubId)
+ {
+ $str .= " PUBLIC $q$pubId$q";
+ }
+ if (defined $sysId)
+ {
+ $str .= " SYSTEM $q$sysId$q";
+ }
+ $str .= ">";
+
+ $self->{DTD} .= $str;
+}
+
+sub element_decl
+{
+ my ($self, $event) = @_;
+ $self->flush_xml_decl;
+
+ my $name = $event->{Name};
+ my $model = $event->{Model};
+
+ $self->{DTD} .= $self->{DocTypeIndent} . "<!ELEMENT $name $model>";
+}
+
+sub entity_decl
+{
+ my ($self, $event) = @_;
+ $self->flush_xml_decl;
+
+ my $name = $event->{Name};
+
+ my $par = "";
+ if ($name =~ /^%/)
+ {
+ # It's a parameter entity (i.e. %ent; instead of &ent;)
+ $name = substr ($name, 1);
+ $par = "% ";
+ }
+
+ my $str = $self->{DocTypeIndent} . "<!ENTITY $par$name";
+
+ my $value = $event->{Value};
+ my $sysId = $event->{SysId};
+ my $pubId = $event->{PubId};
+ my $ndata = $event->{Ndata};
+
+ my $q = $self->{Quote}->{SystemLiteral};
+ my $escape = $self->{Escape}->{SystemLiteral};
+
+ if (defined $value)
+ {
+#?? use {Entity} quote etc...
+ my $esc = $self->{Escape}->{Entity};
+ my $p = $self->{Quote}->{Entity};
+ $str .= " $p" . &$esc ($value) . $p;
+ }
+ if (defined $pubId)
+ {
+ $str .= " PUBLIC $q" . &$escape ($pubId) . $q;
+ }
+ elsif (defined $sysId)
+ {
+ $str .= " SYSTEM";
+ }
+
+ if (defined $sysId)
+ {
+ $str .= " $q" . &$escape ($sysId) . $q;
+ }
+ $str .= " NDATA $ndata" if defined $ndata;
+ $str .= ">";
+
+ $self->{DTD} .= $str;
+}
+
+sub attlist_decl
+{
+ my ($self, $event) = @_;
+ $self->flush_xml_decl;
+
+ my $elem = $event->{ElementName};
+
+ my $str = $event->{AttributeName} . " " . $event->{Type};
+ $str .= " #FIXED" if defined $event->{Fixed};
+
+ $str = $str;
+
+ my $def = $event->{Default};
+ if (defined $def)
+ {
+ $str .= " $def";
+
+ # Note sometimes Default is a value with quotes.
+ # We'll use the existing quotes in that case...
+ }
+
+ my $indent;
+ if (!exists($event->{First}) || $event->{First})
+ {
+ $self->{DTD} .= $self->{DocTypeIndent} . "<!ATTLIST $elem";
+
+ if ($event->{MoreFollow})
+ {
+ $indent = $self->{Newline} . $self->{IndentAttlist};
+ }
+ else
+ {
+ $indent = " ";
+ }
+ }
+ else
+ {
+ $indent = $self->{Newline} . $self->{IndentAttlist};
+ }
+
+ $self->{DTD} .= $indent . $str;
+
+ unless ($event->{MoreFollow})
+ {
+ $self->{DTD} .= '>';
+ }
+}
+
+sub xml_decl
+{
+ my ($self, $event) = @_;
+ return if $self->{PrintedXmlDecl}; # already printed it
+
+ my $version = $event->{Version};
+ my $encoding = $event->{Encoding};
+ if (defined $self->{Encoding})
+ {
+ $encoding = $self->{Encoding};
+ }
+ else
+ {
+ $self->setEncoding ($encoding) if defined $encoding;
+ }
+
+ my $standalone = $event->{Standalone};
+ $standalone = ($standalone ? "yes" : "no") if defined $standalone;
+
+ my $q = $self->{Quote}->{XMLDecl};
+ my $nl = $self->{Newline};
+
+ my $str = "<?xml";
+ $str .= " version=$q$version$q" if defined $version;
+ $str .= " encoding=$q$encoding$q" if defined $encoding;
+ $str .= " standalone=$q$standalone$q" if defined $standalone;
+ $str .= "?>$nl$nl";
+
+ $self->print ($str);
+ $self->{PrintedXmlDecl} = 1;
+}
+
+#
+# Prints the <xml ...?> declaration if it wasn't already printed
+# *and* the user wanted it to be printed (because s/he set $self->{Encoding})
+#
+sub flush_xml_decl
+{
+ my ($self) = @_;
+ return if $self->{PrintedXmlDecl};
+
+ if (defined $self->{Encoding})
+ {
+ $self->xml_decl ({ Version => '1.0', Encoding => $self->{Encoding} });
+ }
+
+ # If it wasn't printed just now, it doesn't need to be printed at all,
+ # so pretend we did print it.
+ $self->{PrintedXmlDecl} = 1;
+}
+
+sub processing_instruction
+{
+ my ($self, $event) = @_;
+ $self->flush_xml_decl;
+
+ my $escape = $self->{Escape}->{ProcessingInstruction};
+
+ my $str = "<?" . $event->{Target} . " " .
+ &$escape ($event->{Data}). "?>";
+
+ $self->print ($str);
+}
+
+1; # package return code
+
+__END__
+
+=head1 NAME
+
+XML::Handler::Composer - Another XML printer/writer/generator
+
+=head1 SYNOPSIS
+
+use XML::Handler::Composer;
+
+my $composer = new XML::Handler::Composer ( [OPTIONS] );
+
+=head1 DESCRIPTION
+
+XML::Handler::Composer is similar to XML::Writer, XML::Handler::XMLWriter,
+XML::Handler::YAWriter etc. in that it generates XML output.
+
+This implementation may not be fast and it may not be the best solution for
+your particular problem, but it has some features that may be missing in the
+other implementations:
+
+=over 4
+
+=item * Supports every output encoding that L<XML::UM> supports
+
+L<XML::UM> supports every encoding for which there is a mapping file
+in the L<XML::Encoding> distribution.
+
+=item * Pretty printing
+
+When used with L<XML::Filter::Reindent>.
+
+=item * Fine control over which kind of quotes are used
+
+See options below.
+
+=item * Supports PerlSAX interface
+
+=back
+
+=head1 Constructor Options
+
+=over 4
+
+=item * EndWithNewline (Default: 1)
+
+Whether to print a newline at the end of the file (i.e. after the root element)
+
+=item * Newline (Default: undef)
+
+If defined, which newline to use for printing.
+(Note that XML::Parser etc. convert newlines into "\x0A".)
+
+If undef, newlines will not be converted and XML::Handler::Composer will
+use "\x0A" when printing.
+
+A value of "\n" will convert the internal newlines into the platform
+specific line separator.
+
+See the PreserveWS option in the characters event (below) for finer control
+over when newline conversion is active.
+
+=item * DocTypeIndent (Default: a Newline and 2 spaces)
+
+Newline plus indent that is used to separate lines inside the DTD.
+
+=item * IndentAttList (Default: 8 spaces)
+
+Indent used when printing an <!ATTLIST> declaration that has more than one
+attribute definition, e.g.
+
+ <!ATTLIST my_elem
+ attr1 CDATA "foo"
+ attr2 CDATA "bar"
+ >
+
+=item * Quote (Default: { XMLDecl => '"', Attr => '"', Entity => '"', SystemLiteral => '"' })
+
+Quote contains a reference to a hash that defines which quoting characters
+to use when printing XML declarations (XMLDecl), attribute values (Attr),
+<!ENTITY> values (Entity) and system/public literals (SystemLiteral)
+as found in <!DOCTYPE>, <!ENTITY> declarations etc.
+
+=item * PrintDefaultAttr (Default: 0)
+
+If 1, prints attribute values regardless of whether they are default
+attribute values (as defined in <!ATTLIST> declarations.)
+Normally, default attributes are not printed.
+
+=item * Encoding (Default: undef)
+
+Defines the output encoding (if specified.)
+Note that future calls to the xml_decl() handler may override this setting
+(if they contain an Encoding definition.)
+
+=item * EncodeUnmapped (Default: \&XML::UM::encode_unmapped_dec)
+
+Defines how Unicode characters not found in the mapping file (of the
+specified encoding) are printed.
+By default, they are converted to decimal entity references, like '{'
+
+Use \&XML::UM::encode_unmapped_hex for hexadecimal constants, like '«'
+
+=item * Print (Default: sub { print @_ }, which prints to stdout)
+
+The subroutine that is used to print the encoded XML output.
+The default prints the string to stdout.
+
+=back
+
+=head1 Method: get_compressed_element_suffix ($event)
+
+Override this method to support the different styles for printing
+empty elements in compressed notation, e.g. <p/>, <p></p>, <p />, <p>.
+
+The default returns "/>", which results in <p/>.
+Use " />" for XHTML style elements or ">" for certain HTML style elements.
+
+The $event parameter is the hash reference that was received from the
+start_element() handler.
+
+=head1 Extra PerlSAX event information
+
+XML::Handler::Composer relies on hints from previous SAX filters to
+format certain parts of the XML.
+These SAX filters (e.g. XML::Filter::Reindent) pass extra information by adding
+name/value pairs to the appropriate PerlSAX events (the events themselves are
+hash references.)
+
+=over 4
+
+=item * entity_reference: Parameter => 1
+
+If Parameter is 1, it means that it is a parameter entity reference.
+A parameter entity is referenced with %ent; instead of &ent; and the
+entity declaration starts with <!ENTITY % ent ...> instead of <!ENTITY ent ...>
+
+NOTE: This should be added to the PerlSAX interface!
+
+=item * start_element/end_element: Compress => 1
+
+If Compress is 1 in both the start_element and end_element event, the element
+will be printed in compressed form, e.g. <a/> instead of <a></a>.
+
+=item * start_element: PreserveWS => 1
+
+If newline conversion is active (i.e. Newline was defined in the constructor),
+then newlines will *NOT* be converted in text (character events) within this
+element.
+
+=item * attlist_decl: First, MoreFollow
+
+The First and MoreFollow options can be used to force successive <!ATTLIST>
+declarations for the same element to be merged, e.g.
+
+ <!ATTLIST my_elem
+ attr1 CDATA "foo"
+ attr2 CDATA "bar"
+ attr3 CDATA "quux"
+ >
+
+In this example, the attlist_decl event for foo should contain
+(First => 1, MoreFollow => 1) and the event for bar should contain
+(MoreFollow => 1). The quux event should have no extra info.
+
+'First' indicates that the event is the first of a sequence.
+'MoreFollow' indicates that more events will follow in this sequence.
+
+If neither option is set by the preceding PerlSAX filter, each attribute
+definition will be printed as a separate <!ATTLIST> line.
+
+=back
+
+=head1 CAVEATS
+
+This code is highly experimental!
+It has not been tested well and the API may change.
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Handler/PrintEvents.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,67 @@
+#
+# This PerlSAX handler prints out all the PerlSAX events/callbacks
+# it receives. Very useful when debugging.
+#
+
+package XML::Handler::PrintEvents;
+use strict;
+use XML::Filter::SAXT;
+
+my @EXTRA_HANDLERS = ( 'ignorable_whitespace' );
+
+sub new
+{
+ my ($class, %options) = @_;
+ bless \%options, $class;
+}
+
+sub print_event
+{
+ my ($self, $event_name, $event) = @_;
+
+ printf "%-22s ", $event_name;
+ if (defined $event)
+ {
+ print join (", ", map { "$_ => [" .
+ (defined $event->{$_} ? $event->{$_} : "(undef)")
+ . "]" } keys %$event);
+ }
+ print "\n";
+}
+
+#
+# This generates the PerlSAX handler methods for PrintEvents.
+# They basically forward the event to print_event() while adding the callback
+# (event) name.
+#
+for my $cb (@EXTRA_HANDLERS, map { @{$_} } values %XML::Filter::SAXT::SAX_HANDLERS)
+{
+ eval "sub $cb { shift->print_event ('$cb', \@_) }";
+}
+
+1; # package return code
+
+__END__
+
+=head1 NAME
+
+XML::Handler::PrintEvents - Prints PerlSAX events (for debugging)
+
+=head1 SYNOPSIS
+
+use XML::Handler::PrintEvents;
+
+my $pr = new XML::Handler::PrintEvents;
+
+=head1 DESCRIPTION
+
+This PerlSAX handler prints the PerlSAX events it receives to STDOUT.
+It can be useful when debugging PerlSAX filters.
+It supports all PerlSAX handler including ignorable_whitespace.
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Handler/Sample.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,101 @@
+# This template file is in the Public Domain.
+# You may do anything you want with this file.
+#
+# $Id: Sample.pm,v 1.4 1999/08/16 16:04:03 kmacleod Exp $
+#
+
+package XML::Handler::Sample;
+
+use vars qw{ $AUTOLOAD };
+
+sub new {
+ my $type = shift;
+ my $self = ( $#_ == 0 ) ? shift : { @_ };
+
+ return bless $self, $type;
+}
+
+# Basic PerlSAX
+sub start_document { print "start_document\n"; }
+sub end_document { print "end_document\n"; }
+sub start_element { print "start_element\n"; }
+sub end_element { print "end_element\n"; }
+sub characters { print "characters\n"; }
+sub processing_instruction { print "processing_instruction\n"; }
+sub ignorable_whitespace { print "ignorable_whitespace\n"; }
+
+# Additional expat callbacks in XML::Parser::PerlSAX
+sub comment { print "comment\n"; }
+sub notation_decl { print "notation_decl\n"; }
+sub unparsed_entity_decl { print "unparsed_entity_decl\n"; }
+sub entity_decl { print "entity_decl\n"; }
+sub element_decl { print "element_decl\n"; }
+sub doctype_decl { print "doctype_decl\n"; }
+sub xml_decl { print "xml_decl\n"; }
+
+# Additional SP/nsgmls callbacks in XML::ESISParser
+sub start_subdoc { print "start_subdoc\n"; }
+sub end_subdoc { print "start_subdoc\n"; }
+sub appinfo { print "appinfo\n"; }
+sub internal_entity_ref { print "sdata\n"; }
+sub external_entity_ref { print "sdata\n"; }
+sub record_end { print "record_end\n"; }
+sub internal_entity_decl { print "internal_entity_decl\n"; }
+sub external_entity_decl { print "external_entity_decl\n"; }
+sub external_sgml_entity_decl { print "external_sgml_entity_decl\n"; }
+sub subdoc_entity_decl { print "subdoc_entity_decl\n"; }
+sub notation { print "notation\n"; }
+sub error { print "error\n"; }
+sub conforming { print "conforming\n"; }
+
+# Others
+sub AUTOLOAD {
+ my $self = shift;
+
+ my $method = $AUTOLOAD;
+ $method =~ s/.*:://;
+ return if $method eq 'DESTROY';
+
+ print "UNRECOGNIZED $method\n";
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Handler::Sample - a trivial PerlSAX handler
+
+=head1 SYNOPSIS
+
+ use XML::Parser::PerlSAX;
+ use XML::Handler::Sample;
+
+ $my_handler = XML::Handler::Sample->new;
+
+ XML::Parser::PerlSAX->new->parse(Source => { SystemId => 'REC-xml-19980210.xml' },
+ Handler => $my_handler);
+
+=head1 DESCRIPTION
+
+C<XML::Handler::Sample> is a trivial PerlSAX handler that prints out
+the name of each event it receives. The source for
+C<XML::Handler::Sample> lists all the currently known PerlSAX
+handler methods.
+
+C<XML::Handler::Sample> is intended for Perl module authors who wish
+to look at example PerlSAX handler modules. C<XML::Handler::Sample>
+can be used as a template for writing your own PerlSAX handler
+modules. C<XML::Handler::Sample> is in the Public Domain and can be
+used for any purpose without restriction.
+
+=head1 AUTHOR
+
+Ken MacLeod, ken@bitsko.slc.ut.us
+
+=head1 SEE ALSO
+
+perl(1), PerlSAX.pod(3)
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Handler/Subs.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,177 @@
+#
+# Copyright (C) 1999 Ken MacLeod
+# XML::Handler::XMLWriter is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+# $Id: Subs.pm,v 1.2 1999/12/22 21:15:00 kmacleod Exp $
+#
+
+use strict;
+
+package XML::Handler::Subs;
+
+use UNIVERSAL;
+
+use vars qw{ $VERSION };
+
+# will be substituted by make-rel script
+$VERSION = "0.07";
+
+sub new {
+ my $type = shift;
+ my $self = ($#_ == 0) ? { %{ (shift) } } : { @_ };
+
+ return bless $self, $type;
+}
+
+sub start_document {
+ my ($self, $document) = @_;
+
+ $self->{Names} = [];
+ $self->{Nodes} = [];
+}
+
+sub end_document {
+ my ($self, $document) = @_;
+
+ delete $self->{Names};
+ delete $self->{Nodes};
+
+ return();
+}
+
+sub start_element {
+ my ($self, $element) = @_;
+
+ push @{$self->{Names}}, $element->{Name};
+ push @{$self->{Nodes}}, $element;
+
+ my $el_name = "s_" . $element->{Name};
+ $el_name =~ s/[^a-zA-Z0-9_]/_/g;
+ if ($self->can($el_name)) {
+ $self->$el_name($element);
+ return 1;
+ }
+
+ return 0;
+}
+
+sub end_element {
+ my ($self, $element) = @_;
+
+ my $called_sub = 0;
+ my $el_name = "e_" . $element->{Name};
+ $el_name =~ s/[^a-zA-Z0-9_]/_/g;
+ if ($self->can(${el_name})) {
+ $self->$el_name($element);
+ $called_sub = 1;
+ }
+
+ pop @{$self->{Names}};
+ pop @{$self->{Nodes}};
+
+ return $called_sub;
+}
+
+sub in_element {
+ my ($self, $name) = @_;
+
+ return ($self->{Names}[-1] eq $name);
+}
+
+sub within_element {
+ my ($self, $name) = @_;
+
+ my $count = 0;
+ foreach my $el_name (@{$self->{Names}}) {
+ $count ++ if ($el_name eq $name);
+ }
+
+ return $count;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Handler::Subs - a PerlSAX handler base class for calling user-defined subs
+
+=head1 SYNOPSIS
+
+ use XML::Handler::Subs;
+
+ package MyHandlers;
+ use vars qw{ @ISA };
+
+ sub s_NAME { my ($self, $element) = @_ };
+ sub e_NAME { my ($self, $element) = @_ };
+
+ $self->{Names}; # an array of names
+ $self->{Nodes}; # an array of $element nodes
+
+ $handler = MyHandlers->new();
+ $self->in_element($name);
+ $self->within_element($name);
+
+=head1 DESCRIPTION
+
+C<XML::Handler::Subs> is a base class for PerlSAX handlers.
+C<XML::Handler::Subs> is subclassed to implement complete behavior and
+to add element-specific handling.
+
+Each time an element starts, a method by that name prefixed with `s_'
+is called with the element to be processed. Each time an element
+ends, a method with that name prefixed with `e_' is called. Any
+special characters in the element name are replaced by underscores.
+
+Subclassing XML::Handler::Subs in this way is similar to
+XML::Parser's Subs style.
+
+XML::Handler::Subs maintains a stack of element names,
+`C<$self->{Names}', and a stack of element nodes, `C<$self->{Nodes}>'
+that can be used by subclasses. The current element is pushed on the
+stacks before calling an element-name start method and popped off the
+stacks after calling the element-name end method. The
+`C<in_element()>' and `C<within_element()>' calls use these stacks.
+
+If the subclass implements `C<start_document()>', `C<end_document()>',
+`C<start_element()>', and `C<end_element()>', be sure to use
+`C<SUPER::>' to call the the superclass methods also. See perlobj(1)
+for details on SUPER::. `C<SUPER::start_element()>' and
+`C<SUPER::end_element()>' return 1 if an element-name method is
+called, they return 0 if no method was called.
+
+XML::Handler::Subs does not implement any other PerlSAX handlers.
+
+XML::Handler::Subs supports the following methods:
+
+=over 4
+
+=item new( I<OPTIONS> )
+
+A basic `C<new()>' method. `C<new()>' takes a list of key, value
+pairs or a hash and creates and returns a hash with those options; the
+hash is blessed into the subclass.
+
+=item in_element($name)
+
+Returns true if `C<$name>' is equal to the name of the innermost
+currently opened element.
+
+=item within_element($name)
+
+Returns the number of times the `C<$name>' appears in Names.
+
+=back
+
+=head1 AUTHOR
+
+Ken MacLeod, ken@bitsko.slc.ut.us
+
+=head1 SEE ALSO
+
+perl(1), PerlSAX.pod(3)
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Handler/XMLWriter.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,313 @@
+#
+# Copyright (C) 1999 Ken MacLeod
+# Portions derived from code in XML::Writer by David Megginson
+# XML::Handler::XMLWriter is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+# $Id: XMLWriter.pm,v 1.2 1999/12/22 21:15:00 kmacleod Exp $
+#
+
+use strict;
+
+package XML::Handler::XMLWriter;
+use XML::Handler::Subs;
+
+use vars qw{ $VERSION @ISA $escapes };
+
+# will be substituted by make-rel script
+$VERSION = "0.07";
+
+@ISA = qw{ XML::Handler::Subs };
+
+$escapes = { '&' => '&',
+ '<' => '<',
+ '>' => '>',
+ '"' => '"'
+ };
+
+sub start_document {
+ my ($self, $document) = @_;
+
+ $self->SUPER::start_document($document);
+
+ # create a temporary Output_ in case we're creating a standard
+ # output file that we'll delete later.
+ if (!$self->{AsString} && !defined($self->{Output})) {
+ require IO::File;
+ import IO::File;
+ $self->{Output_} = new IO::File(">-");
+ } elsif (defined($self->{Output})) {
+ $self->{Output_} = $self->{Output};
+ }
+
+ if ($self->{AsString}) {
+ $self->{Strings} = [];
+ }
+
+ $self->print("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+
+ # FIXME support Doctype declarations
+}
+
+sub end_document {
+ my ($self, $document) = @_;
+
+ if (defined($self->{Output_})) {
+ $self->{Output_}->print("\n");
+ delete $self->{Output_};
+ }
+
+ my $string = undef;
+ if (defined($self->{AsString})) {
+ push @{$self->{Strings}}, "\n";
+ $string = join('', @{$self->{Strings}});
+ delete $self->{Strings};
+ }
+
+ $self->SUPER::end_document($document);
+
+ return($string);
+}
+
+sub start_element {
+ my ($self, $element) = @_;
+
+ if ($self->SUPER::start_element($element) == 0) {
+ $self->print_start_element($element);
+ }
+}
+
+sub print_start_element {
+ my ($self, $element) = @_;
+
+ my $output = "<$element->{Name}";
+ if (defined($element->{Attributes})) {
+ foreach my $name (sort keys %{$element->{Attributes}}) {
+ my $esc_value = $element->{Attributes}{$name};
+ $esc_value =~ s/([\&\<\>\"])/$escapes->{$1}/ge;
+ $output .= " $name=\"$esc_value\"";
+ }
+ }
+
+ if ($self->{Newlines}) {
+ $output .= "\n";
+ }
+
+ $output .= ">";
+
+ $self->print($output);
+}
+
+sub end_element {
+ my ($self, $element) = @_;
+
+ if ($self->SUPER::end_element($element) == 0) {
+ $self->print_end_element($element);
+ }
+}
+
+sub print_end_element {
+ my ($self, $element) = @_;
+
+ my $output = "</$element->{Name}"
+ . ($self->{Newlines} ? "\n" : "") . ">";
+
+ $self->print($output);
+}
+sub characters {
+ my ($self, $characters) = @_;
+
+ my $output = $characters->{Data};
+
+ $output =~ s/([\&\<\>])/$escapes->{$1}/ge;
+
+ $self->print($output);
+}
+
+sub processing_instruction {
+ my ($self, $pi) = @_;
+
+ my $nl = ($#{$self->{Names}} == -1) ? "\n" : "";
+
+ my $output;
+ if ($self->{IsSGML}) {
+ $output = "<?$pi->{Data}>\n";
+ } else {
+ if ($pi->{Data}) {
+ $output = "<?$pi->{Target} $pi->{Data}?>$nl";
+ } else {
+ $output = "<?$pi->{Target}?>$nl";
+ }
+ }
+
+ $self->print($output);
+}
+
+sub ignorable_whitespace {
+ my ($self, $whitespace) = @_;
+
+ $self->print($whitespace->{Data});
+}
+
+sub comment {
+ my ($self, $comment) = @_;
+
+ my $nl = ($#{$self->{Names}} == -1) ? "\n" : "";
+
+ my $output = "<!-- $comment->{Data} -->$nl";
+
+ $self->print($output);
+}
+
+sub print {
+ my ($self, $output) = @_;
+
+ $self->{Output_}->print($output)
+ if (defined($self->{Output_}));
+
+ push(@{$self->{Strings}}, $output)
+ if (defined($self->{AsString}));
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::Handler::XMLWriter - a PerlSAX handler for writing readable XML
+
+=head1 SYNOPSIS
+
+ use XML::Parser::PerlSAX;
+ use XML::Handler::XMLWriter;
+
+ $my_handler = XML::Handler::XMLWriter->new( I<OPTIONS> );
+
+ XML::Parser::PerlSAX->new->parse(Source => { SystemId => 'REC-xml-19980210.xml' },
+ Handler => $my_handler);
+
+=head1 DESCRIPTION
+
+C<XML::Handler::XMLWriter> is a PerlSAX handler for writing readable
+XML (in contrast to Canonical XML, for example).
+XML::Handler::XMLWriter can be used with a parser to reformat XML,
+with XML::DOM or XML::Grove to write out XML, or with other PerlSAX
+modules that generate events.
+
+C<XML::Handler::XMLWriter> is intended to be used with PerlSAX event
+generators and does not perform any checking itself (for example,
+matching start and end element events). If you want to generate XML
+directly from your Perl code, use the XML::Writer module. XML::Writer
+has an easy to use interface and performs many checks to make sure
+that the XML you generate is well-formed.
+
+C<XML::Handler::XMLWriter> is a subclass of C<XML::Handler::Subs>.
+C<XML::Handler::XMLWriter> can be further subclassed to alter it's
+behavior or to add element-specific handling. In the subclass, each
+time an element starts, a method by that name prefixed with `s_' is
+called with the element to be processed. Each time an element ends, a
+method with that name prefixed with `e_' is called. Any special
+characters in the element name are replaced by underscores. If there
+isn't a start or end method for an element, the default action is to
+write the start or end tag. Start and end methods can use the
+`C<print_start_element()>' and `C<print_end_element()>' methods to
+print start or end tags. Subclasses can call the `C<print()>' method
+to write additional output.
+
+Subclassing XML::Handler::XMLWriter in this way is similar to
+XML::Parser's Stream style.
+
+XML::Handler::Subs maintains a stack of element names,
+`C<$self->{Names}', and a stack of element nodes, `C<$self->{Nodes}>'
+that can be used by subclasses. The current element is pushed on the
+stacks before calling an element-name start method and popped off the
+stacks after calling the element-name end method.
+
+See XML::Handler::Subs for additional methods.
+
+In addition to the standard PerlSAX handler methods (see PerlSAX for
+descriptions), XML::Handler::XMLWriter supports the following methods:
+
+=over 4
+
+=item new( I<OPTIONS> )
+
+Creates and returns a new instance of XML::Handler::XMLWriter with the
+given I<OPTIONS>. Options may be changed at any time by modifying
+them directly in the hash returned. I<OPTIONS> can be a list of key,
+value pairs or a hash. The following I<OPTIONS> are supported:
+
+=over 4
+
+=item Output
+
+An IO::Handle or one of it's subclasses (such as IO::File), if this
+parameter is not present and the AsString option is not used, the
+module will write to standard output.
+
+=item AsString
+
+Return the generated XML as a string from the `C<parse()>' method of
+the PerlSAX event generator.
+
+=item Newlines
+
+A true or false value; if this parameter is present and its value is
+true, then the module will insert an extra newline before the closing
+delimiter of start, end, and empty tags to guarantee that the document
+does not end up as a single, long line. If the paramter is not
+present, the module will not insert the newlines.
+
+=item IsSGML
+
+A true or false value; if this parameter is present and its value is
+true, then the module will generate SGML rather than XML.
+
+=back
+
+=item print_start_element($element)
+
+Print a start tag for `C<$element>'. This is the default action for
+the PerlSAX `C<start_element()>' handler, but subclasses may use this
+if they define a start method for an element.
+
+=item print_end_element($element)
+
+Prints an end tag for `C<$element>'. This is the default action for
+the PerlSAX `C<end_element()>' handler, but subclasses may use this
+if they define a start method for an element.
+
+=item print($output)
+
+Write `C<$output>' to Output and/or append it to the string to be
+returned. Subclasses may use this to write additional output.
+
+=back
+
+=head1 TODO
+
+=over 4
+
+=item *
+
+An Elements option that provides finer control over newlines than the
+Newlines option, where you can choose before and after newline for
+element start and end tags. Inspired by the Python XMLWriter.
+
+=item *
+
+Support Doctype and XML declarations.
+
+=back
+
+=head1 AUTHOR
+
+Ken MacLeod, ken@bitsko.slc.ut.us
+This module is partially derived from XML::Writer by David Megginson.
+
+=head1 SEE ALSO
+
+perl(1), PerlSAX.pod(3)
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Parser.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,466 @@
+=head1 WARNING
+
+This manual page was copied from the XML::Parser distribution (version 2.27)
+written by Clark Cooper. You can find newer versions at CPAN.
+
+=head1 NAME
+
+XML::Parser - A perl module for parsing XML documents
+
+=head1 SYNOPSIS
+
+ use XML::Parser;
+
+ $p1 = new XML::Parser(Style => 'Debug');
+ $p1->parsefile('REC-xml-19980210.xml');
+ $p1->parse('<foo id="me">Hello World</foo>');
+
+ # Alternative
+ $p2 = new XML::Parser(Handlers => {Start => \&handle_start,
+ End => \&handle_end,
+ Char => \&handle_char});
+ $p2->parse($socket);
+
+ # Another alternative
+ $p3 = new XML::Parser(ErrorContext => 2);
+
+ $p3->setHandlers(Char => \&text,
+ Default => \&other);
+
+ open(FOO, 'xmlgenerator |');
+ $p3->parse(*FOO, ProtocolEncoding => 'ISO-8859-1');
+ close(FOO);
+
+ $p3->parsefile('junk.xml', ErrorContext => 3);
+
+=head1 DESCRIPTION
+
+This module provides ways to parse XML documents. It is built on top of
+L<XML::Parser::Expat>, which is a lower level interface to James Clark's
+expat library. Each call to one of the parsing methods creates a new
+instance of XML::Parser::Expat which is then used to parse the document.
+Expat options may be provided when the XML::Parser object is created.
+These options are then passed on to the Expat object on each parse call.
+They can also be given as extra arguments to the parse methods, in which
+case they override options given at XML::Parser creation time.
+
+The behavior of the parser is controlled either by C<L</Style>> and/or
+C<L</Handlers>> options, or by L</setHandlers> method. These all provide
+mechanisms for XML::Parser to set the handlers needed by XML::Parser::Expat.
+If neither C<Style> nor C<Handlers> are specified, then parsing just
+checks the document for being well-formed.
+
+When underlying handlers get called, they receive as their first parameter
+the I<Expat> object, not the Parser object.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This is a class method, the constructor for XML::Parser. Options are passed
+as keyword value pairs. Recognized options are:
+
+=over 4
+
+=item * Style
+
+This option provides an easy way to create a given style of parser. The
+built in styles are: L<"Debug">, L<"Subs">, L<"Tree">, L<"Objects">,
+and L<"Stream">.
+Custom styles can be provided by giving a full package name containing
+at least one '::'. This package should then have subs defined for each
+handler it wishes to have installed. See L<"STYLES"> below
+for a discussion of each built in style.
+
+=item * Handlers
+
+When provided, this option should be an anonymous hash containing as
+keys the type of handler and as values a sub reference to handle that
+type of event. All the handlers get passed as their 1st parameter the
+instance of expat that is parsing the document. Further details on
+handlers can be found in L<"HANDLERS">. Any handler set here
+overrides the corresponding handler set with the Style option.
+
+=item * Pkg
+
+Some styles will refer to subs defined in this package. If not provided,
+it defaults to the package which called the constructor.
+
+=item * ErrorContext
+
+This is an Expat option. When this option is defined, errors are reported
+in context. The value should be the number of lines to show on either side
+of the line in which the error occurred.
+
+=item * ProtocolEncoding
+
+This is an Expat option. This sets the protocol encoding name. It defaults
+to none. The built-in encodings are: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and
+C<US-ASCII>. Other encodings may be used if they have encoding maps in one
+of the directories in the @Encoding_Path list. Check L<"ENCODINGS"> for
+more information on encoding maps. Setting the protocol encoding overrides
+any encoding in the XML declaration.
+
+=item * Namespaces
+
+This is an Expat option. If this is set to a true value, then namespace
+processing is done during the parse. See L<XML::Parser::Expat/"Namespaces">
+for further discussion of namespace processing.
+
+=item * NoExpand
+
+This is an Expat option. Normally, the parser will try to expand references
+to entities defined in the internal subset. If this option is set to a true
+value, and a default handler is also set, then the default handler will be
+called when an entity reference is seen in text. This has no effect if a
+default handler has not been registered, and it has no effect on the expansion
+of entity references inside attribute values.
+
+=item * Stream_Delimiter
+
+This is an Expat option. It takes a string value. When this string is found
+alone on a line while parsing from a stream, then the parse is ended as if it
+saw an end of file. The intended use is with a stream of xml documents in a
+MIME multipart format. The string should not contain a trailing newline.
+
+=item * ParseParamEnt
+
+This is an Expat option. Unless standalone is set to "yes" in the XML
+declaration, setting this to a true value allows the external DTD to be read,
+and parameter entities to be parsed and expanded.
+
+=item * Non-Expat-Options
+
+If provided, this should be an anonymous hash whose keys are options that
+shouldn't be passed to Expat. This should only be of concern to those
+subclassing XML::Parser.
+
+=back
+
+=item setHandlers(TYPE, HANDLER [, TYPE, HANDLER [...]])
+
+This method registers handlers for various parser events. It overrides any
+previous handlers registered through the Style or Handler options or through
+earlier calls to setHandlers. By providing a false or undefined value as
+the handler, the existing handler can be unset.
+
+This method returns a list of type, handler pairs corresponding to the
+input. The handlers returned are the ones that were in effect prior to
+the call.
+
+See a description of the handler types in L<"HANDLERS">.
+
+=item parse(SOURCE [, OPT => OPT_VALUE [...]])
+
+The SOURCE parameter should either be a string containing the whole XML
+document, or it should be an open IO::Handle. Constructor options to
+XML::Parser::Expat given as keyword-value pairs may follow the SOURCE
+parameter. These override, for this call, any options or attributes passed
+through from the XML::Parser instance.
+
+A die call is thrown if a parse error occurs. Otherwise it will return 1
+or whatever is returned from the B<Final> handler, if one is installed.
+In other words, what parse may return depends on the style.
+
+=item parsestring
+
+This is just an alias for parse for backwards compatibility.
+
+=item parsefile(FILE [, OPT => OPT_VALUE [...]])
+
+Open FILE for reading, then call parse with the open handle. The file
+is closed no matter how parse returns. Returns what parse returns.
+
+=item parse_start([ OPT => OPT_VALUE [...]])
+
+Create and return a new instance of XML::Parser::ExpatNB. Constructor
+options may be provided. If an init handler has been provided, it is
+called before returning the ExpatNB object. Documents are parsed by
+making incremental calls to the parse_more method of this object, which
+takes a string. A single call to the parse_done method of this object,
+which takes no arguments, indicates that the document is finished.
+
+If there is a final handler installed, it is executed by the parse_done
+method before returning and the parse_done method returns whatever is
+returned by the final handler.
+
+=back
+
+=head1 HANDLERS
+
+Expat is an event based parser. As the parser recognizes parts of the
+document (say the start or end tag for an XML element), then any handlers
+registered for that type of an event are called with suitable parameters.
+All handlers receive an instance of XML::Parser::Expat as their first
+argument. See L<XML::Parser::Expat/"METHODS"> for a discussion of the
+methods that can be called on this object.
+
+=head2 Init (Expat)
+
+This is called just before the parsing of the document starts.
+
+=head2 Final (Expat)
+
+This is called just after parsing has finished, but only if no errors
+occurred during the parse. Parse returns what this returns.
+
+=head2 Start (Expat, Element [, Attr, Val [,...]])
+
+This event is generated when an XML start tag is recognized. Element is the
+name of the XML element type that is opened with the start tag. The Attr &
+Val pairs are generated for each attribute in the start tag.
+
+=head2 End (Expat, Element)
+
+This event is generated when an XML end tag is recognized. Note that
+an XML empty tag (<foo/>) generates both a start and an end event.
+
+=head2 Char (Expat, String)
+
+This event is generated when non-markup is recognized. The non-markup
+sequence of characters is in String. A single non-markup sequence of
+characters may generate multiple calls to this handler. Whatever the
+encoding of the string in the original document, this is given to the
+handler in UTF-8.
+
+=head2 Proc (Expat, Target, Data)
+
+This event is generated when a processing instruction is recognized.
+
+=head2 Comment (Expat, Data)
+
+This event is generated when a comment is recognized.
+
+=head2 CdataStart (Expat)
+
+This is called at the start of a CDATA section.
+
+=head2 CdataEnd (Expat)
+
+This is called at the end of a CDATA section.
+
+=head2 Default (Expat, String)
+
+This is called for any characters that don't have a registered handler.
+This includes both characters that are part of markup for which no
+events are generated (markup declarations) and characters that
+could generate events, but for which no handler has been registered.
+
+Whatever the encoding in the original document, the string is returned to
+the handler in UTF-8.
+
+=head2 Unparsed (Expat, Entity, Base, Sysid, Pubid, Notation)
+
+This is called for a declaration of an unparsed entity. Entity is the name
+of the entity. Base is the base to be used for resolving a relative URI.
+Sysid is the system id. Pubid is the public id. Notation is the notation
+name. Base and Pubid may be undefined.
+
+=head2 Notation (Expat, Notation, Base, Sysid, Pubid)
+
+This is called for a declaration of notation. Notation is the notation name.
+Base is the base to be used for resolving a relative URI. Sysid is the system
+id. Pubid is the public id. Base, Sysid, and Pubid may all be undefined.
+
+=head2 ExternEnt (Expat, Base, Sysid, Pubid)
+
+This is called when an external entity is referenced. Base is the base to be
+used for resolving a relative URI. Sysid is the system id. Pubid is the public
+id. Base, and Pubid may be undefined.
+
+This handler should either return a string, which represents the contents of
+the external entity, or return an open filehandle that can be read to obtain
+the contents of the external entity, or return undef, which indicates the
+external entity couldn't be found and will generate a parse error.
+
+If an open filehandle is returned, it must be returned as either a glob
+(*FOO) or as a reference to a glob (e.g. an instance of IO::Handle). The
+parser will close the filehandle after using it.
+
+A default handler, XML::Parser::default_ext_ent_handler, is installed
+for this. It only handles the file URL method and it assumes "file:" if
+it isn't there. The expat base method can be used to set a basename for
+relative pathnames. If no basename is given, or if the basename is itself
+a relative name, then it is relative to the current working directory.
+
+=head2 Entity (Expat, Name, Val, Sysid, Pubid, Ndata)
+
+This is called when an entity is declared. For internal entities, the Val
+parameter will contain the value and the remaining three parameters will be
+undefined. For external entities, the Val parameter will be undefined, the
+Sysid parameter will have the system id, the Pubid parameter will have the
+public id if it was provided (it will be undefined otherwise), the Ndata
+parameter will contain the notation for unparsed entities. If this is a
+parameter entity declaration, then a '%' will be prefixed to the name.
+
+Note that this handler and the Unparsed handler above overlap. If both are
+set, then this handler will not be called for unparsed entities.
+
+=head2 Element (Expat, Name, Model)
+
+The element handler is called when an element declaration is found. Name
+is the element name, and Model is the content model as a string.
+
+=head2 Attlist (Expat, Elname, Attname, Type, Default, Fixed)
+
+This handler is called for each attribute in an ATTLIST declaration.
+So an ATTLIST declaration that has multiple attributes will generate multiple
+calls to this handler. The Elname parameter is the name of the element with
+which the attribute is being associated. The Attname parameter is the name
+of the attribute. Type is the attribute type, given as a string. Default is
+the default value, which will either be "#REQUIRED", "#IMPLIED" or a quoted
+string (i.e. the returned string will begin and end with a quote character).
+If Fixed is true, then this is a fixed attribute.
+
+=head2 Doctype (Expat, Name, Sysid, Pubid, Internal)
+
+This handler is called for DOCTYPE declarations. Name is the document type
+name. Sysid is the system id of the document type, if it was provided,
+otherwise it's undefined. Pubid is the public id of the document type,
+which will be undefined if no public id was given. Internal is the internal
+subset, given as a string. If there was no internal subset, it will be
+undefined. Internal will contain all whitespace, comments, processing
+instructions, and declarations seen in the internal subset. The declarations
+will be there whether or not they have been processed by another handler
+(except for unparsed entities processed by the Unparsed handler). However,
+comments and processing instructions will not appear if they've been processed
+by their respective handlers.
+
+=head2 XMLDecl (Expat, Version, Encoding, Standalone)
+
+This handler is called for xml declarations. Version is a string containg
+the version. Encoding is either undefined or contains an encoding string.
+Standalone will be either true, false, or undefined if the standalone attribute
+is yes, no, or not made respectively.
+
+=head1 STYLES
+
+=head2 Debug
+
+This just prints out the document in outline form. Nothing special is
+returned by parse.
+
+=head2 Subs
+
+Each time an element starts, a sub by that name in the package specified
+by the Pkg option is called with the same parameters that the Start
+handler gets called with.
+
+Each time an element ends, a sub with that name appended with an underscore
+("_"), is called with the same parameters that the End handler gets called
+with.
+
+Nothing special is returned by parse.
+
+=head2 Tree
+
+Parse will return a parse tree for the document. Each node in the tree
+takes the form of a tag, content pair. Text nodes are represented with
+a pseudo-tag of "0" and the string that is their content. For elements,
+the content is an array reference. The first item in the array is a
+(possibly empty) hash reference containing attributes. The remainder of
+the array is a sequence of tag-content pairs representing the content
+of the element.
+
+So for example the result of parsing:
+
+ <foo><head id="a">Hello <em>there</em></head><bar>Howdy<ref/></bar>do</foo>
+
+would be:
+ Tag Content
+ ==================================================================
+ [foo, [{}, head, [{id => "a"}, 0, "Hello ", em, [{}, 0, "there"]],
+ bar, [ {}, 0, "Howdy", ref, [{}]],
+ 0, "do"
+ ]
+ ]
+
+The root document "foo", has 3 children: a "head" element, a "bar"
+element and the text "do". After the empty attribute hash, these are
+represented in it's contents by 3 tag-content pairs.
+
+=head2 Objects
+
+This is similar to the Tree style, except that a hash object is created for
+each element. The corresponding object will be in the class whose name
+is created by appending "::" and the element name to the package set with
+the Pkg option. Non-markup text will be in the ::Characters class. The
+contents of the corresponding object will be in an anonymous array that
+is the value of the Kids property for that object.
+
+=head2 Stream
+
+This style also uses the Pkg package. If none of the subs that this
+style looks for is there, then the effect of parsing with this style is
+to print a canonical copy of the document without comments or declarations.
+All the subs receive as their 1st parameter the Expat instance for the
+document they're parsing.
+
+It looks for the following routines:
+
+=over 4
+
+=item * StartDocument
+
+Called at the start of the parse .
+
+=item * StartTag
+
+Called for every start tag with a second parameter of the element type. The $_
+variable will contain a copy of the tag and the %_ variable will contain
+attribute values supplied for that element.
+
+=item * EndTag
+
+Called for every end tag with a second parameter of the element type. The $_
+variable will contain a copy of the end tag.
+
+=item * Text
+
+Called just before start or end tags with accumulated non-markup text in
+the $_ variable.
+
+=item * PI
+
+Called for processing instructions. The $_ variable will contain a copy of
+the PI and the target and data are sent as 2nd and 3rd parameters
+respectively.
+
+=item * EndDocument
+
+Called at conclusion of the parse.
+
+=back
+
+=head1 ENCODINGS
+
+XML documents may be encoded in character sets other than Unicode as
+long as they may be mapped into the Unicode character set. Expat has
+further restrictions on encodings. Read the xmlparse.h header file in
+the expat distribution to see details on these restrictions.
+
+Expat has built-in encodings for: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and
+C<US-ASCII>. Encodings are set either through the XML declaration
+encoding attribute or through the ProtocolEncoding option to XML::Parser
+or XML::Parser::Expat.
+
+For encodings other than the built-ins, expat calls the function
+load_encoding in the Expat package with the encoding name. This function
+looks for a file in the path list @XML::Parser::Expat::Encoding_Path, that
+matches the lower-cased name with a '.enc' extension. The first one it
+finds, it loads.
+
+If you wish to build your own encoding maps, check out the XML::Encoding
+module from CPAN.
+
+=head1 AUTHORS
+
+Larry Wall <F<larry@wall.org>> wrote version 1.0.
+
+Clark Cooper <F<coopercc@netheaven.com>> picked up support, changed the API
+for this version (2.x), provided documentation,
+and added some standard package features.
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/Parser/Expat.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,511 @@
+=head1 WARNING
+
+This manual page was copied from the XML::Parser distribution (version 2.27)
+written by Clark Cooper. You can find newer versions at CPAN.
+
+=head1 NAME
+
+XML::Parser::Expat - Lowlevel access to James Clark's expat XML parser
+
+=head1 SYNOPSIS
+
+ use XML::Parser::Expat;
+
+ $parser = new XML::Parser::Expat;
+ $parser->setHandlers('Start' => \&sh,
+ 'End' => \&eh,
+ 'Char' => \&ch);
+ open(FOO, 'info.xml') or die "Couldn't open";
+ $parser->parse(*FOO);
+ close(FOO);
+ # $parser->parse('<foo id="me"> here <em>we</em> go </foo>');
+
+ sub sh
+ {
+ my ($p, $el, %atts) = @_;
+ $p->setHandlers('Char' => \&spec)
+ if ($el eq 'special');
+ ...
+ }
+
+ sub eh
+ {
+ my ($p, $el) = @_;
+ $p->setHandlers('Char' => \&ch) # Special elements won't contain
+ if ($el eq 'special'); # other special elements
+ ...
+ }
+
+=head1 DESCRIPTION
+
+This module provides an interface to James Clark's XML parser, expat. As in
+expat, a single instance of the parser can only parse one document. Calls
+to parsestring after the first for a given instance will die.
+
+Expat (and XML::Parser::Expat) are event based. As the parser recognizes
+parts of the document (say the start or end of an XML element), then any
+handlers registered for that type of an event are called with suitable
+parameters.
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+This is a class method, the constructor for XML::Parser::Expat. Options are
+passed as keyword value pairs. The recognized options are:
+
+=over 4
+
+=item * ProtocolEncoding
+
+The protocol encoding name. The default is none. The expat built-in
+encodings are: C<UTF-8>, C<ISO-8859-1>, C<UTF-16>, and C<US-ASCII>.
+Other encodings may be used if they have encoding maps in one of the
+directories in the @Encoding_Path list. Setting the protocol encoding
+overrides any encoding in the XML declaration.
+
+=item * Namespaces
+
+When this option is given with a true value, then the parser does namespace
+processing. By default, namespace processing is turned off. When it is
+turned on, the parser consumes I<xmlns> attributes and strips off prefixes
+from element and attributes names where those prefixes have a defined
+namespace. A name's namespace can be found using the L<"namespace"> method
+and two names can be checked for absolute equality with the L<"eq_name">
+method.
+
+=item * NoExpand
+
+Normally, the parser will try to expand references to entities defined in
+the internal subset. If this option is set to a true value, and a default
+handler is also set, then the default handler will be called when an
+entity reference is seen in text. This has no effect if a default handler
+has not been registered, and it has no effect on the expansion of entity
+references inside attribute values.
+
+=item * Stream_Delimiter
+
+This option takes a string value. When this string is found alone on a line
+while parsing from a stream, then the parse is ended as if it saw an end of
+file. The intended use is with a stream of xml documents in a MIME multipart
+format. The string should not contain a trailing newline.
+
+=item * ErrorContext
+
+When this option is defined, errors are reported in context. The value
+of ErrorContext should be the number of lines to show on either side of
+the line in which the error occurred.
+
+=item * ParseParamEnt
+
+Unless standalone is set to "yes" in the XML declaration, setting this to
+a true value allows the external DTD to be read, and parameter entities
+to be parsed and expanded.
+
+=item * Base
+
+The base to use for relative pathnames or URLs. This can also be done by
+using the base method.
+
+=back
+
+=item setHandlers(TYPE, HANDLER [, TYPE, HANDLER [...]])
+
+This method registers handlers for the various events. If no handlers are
+registered, then a call to parsestring or parsefile will only determine if
+the corresponding XML document is well formed (by returning without error.)
+This may be called from within a handler, after the parse has started.
+
+Setting a handler to something that evaluates to false unsets that
+handler.
+
+This method returns a list of type, handler pairs corresponding to the
+input. The handlers returned are the ones that were in effect before the
+call to setHandlers.
+
+The recognized events and the parameters passed to the corresponding
+handlers are:
+
+=over 4
+
+=item * Start (Parser, Element [, Attr, Val [,...]])
+
+This event is generated when an XML start tag is recognized. Parser is
+an XML::Parser::Expat instance. Element is the name of the XML element that
+is opened with the start tag. The Attr & Val pairs are generated for each
+attribute in the start tag.
+
+=item * End (Parser, Element)
+
+This event is generated when an XML end tag is recognized. Note that
+an XML empty tag (<foo/>) generates both a start and an end event.
+
+There is always a lower level start and end handler installed that wrap
+the corresponding callbacks. This is to handle the context mechanism.
+A consequence of this is that the default handler (see below) will not
+see a start tag or end tag unless the default_current method is called.
+
+=item * Char (Parser, String)
+
+This event is generated when non-markup is recognized. The non-markup
+sequence of characters is in String. A single non-markup sequence of
+characters may generate multiple calls to this handler. Whatever the
+encoding of the string in the original document, this is given to the
+handler in UTF-8.
+
+=item * Proc (Parser, Target, Data)
+
+This event is generated when a processing instruction is recognized.
+
+=item * Comment (Parser, String)
+
+This event is generated when a comment is recognized.
+
+=item * CdataStart (Parser)
+
+This is called at the start of a CDATA section.
+
+=item * CdataEnd (Parser)
+
+This is called at the end of a CDATA section.
+
+=item * Default (Parser, String)
+
+This is called for any characters that don't have a registered handler.
+This includes both characters that are part of markup for which no
+events are generated (markup declarations) and characters that
+could generate events, but for which no handler has been registered.
+
+Whatever the encoding in the original document, the string is returned to
+the handler in UTF-8.
+
+=item * Unparsed (Parser, Entity, Base, Sysid, Pubid, Notation)
+
+This is called for a declaration of an unparsed entity. Entity is the name
+of the entity. Base is the base to be used for resolving a relative URI.
+Sysid is the system id. Pubid is the public id. Notation is the notation
+name. Base and Pubid may be undefined.
+
+=item * Notation (Parser, Notation, Base, Sysid, Pubid)
+
+This is called for a declaration of notation. Notation is the notation name.
+Base is the base to be used for resolving a relative URI. Sysid is the system
+id. Pubid is the public id. Base, Sysid, and Pubid may all be undefined.
+
+=item * ExternEnt (Parser, Base, Sysid, Pubid)
+
+This is called when an external entity is referenced. Base is the base to be
+used for resolving a relative URI. Sysid is the system id. Pubid is the public
+id. Base, and Pubid may be undefined.
+
+This handler should either return a string, which represents the contents of
+the external entity, or return an open filehandle that can be read to obtain
+the contents of the external entity, or return undef, which indicates the
+external entity couldn't be found and will generate a parse error.
+
+If an open filehandle is returned, it must be returned as either a glob
+(*FOO) or as a reference to a glob (e.g. an instance of IO::Handle). The
+parser will close the filehandle after using it.
+
+=item * Entity (Parser, Name, Val, Sysid, Pubid, Ndata)
+
+This is called when an entity is declared. For internal entities, the Val
+parameter will contain the value and the remaining three parameters will
+be undefined. For external entities, the Val parameter
+will be undefined, the Sysid parameter will have the system id, the Pubid
+parameter will have the public id if it was provided (it will be undefined
+otherwise), the Ndata parameter will contain the notation for unparsed
+entities. If this is a parameter entity declaration, then a '%' will be
+prefixed to the name.
+
+Note that this handler and the Unparsed handler above overlap. If both are
+set, then this handler will not be called for unparsed entities.
+
+=item * Element (Parser, Name, Model)
+
+The element handler is called when an element declaration is found. Name is
+the element name, and Model is the content model as a string.
+
+=item * Attlist (Parser, Elname, Attname, Type, Default, Fixed)
+
+This handler is called for each attribute in an ATTLIST declaration.
+So an ATTLIST declaration that has multiple attributes
+will generate multiple calls to this handler. The Elname parameter is the
+name of the element with which the attribute is being associated. The Attname
+parameter is the name of the attribute. Type is the attribute type, given as
+a string. Default is the default value, which will either be "#REQUIRED",
+"#IMPLIED" or a quoted string (i.e. the returned string will begin and end
+with a quote character). If Fixed is true, then this is a fixed attribute.
+
+=item * Doctype (Parser, Name, Sysid, Pubid, Internal)
+
+This handler is called for DOCTYPE declarations. Name is the document type
+name. Sysid is the system id of the document type, if it was provided,
+otherwise it's undefined. Pubid is the public id of the document type,
+which will be undefined if no public id was given. Internal is the internal
+subset, given as a string. If there was no internal subset, it will be
+undefined. Internal will contain all whitespace, comments, processing
+instructions, and declarations seen in the internal subset. The declarations
+will be there whether or not they have been processed by another handler
+(except for unparsed entities processed by the Unparsed handler). However,
+comments and processing instructions will not appear if they've been processed
+by their respective handlers.
+
+=item * XMLDecl (Parser, Version, Encoding, Standalone)
+
+This handler is called for xml declarations. Version is a string containg
+the version. Encoding is either undefined or contains an encoding string.
+Standalone will be either true, false, or undefined if the standalone attribute
+is yes, no, or not made respectively.
+
+=back
+
+=item namespace(name)
+
+Return the URI of the namespace that the name belongs to. If the name doesn't
+belong to any namespace, an undef is returned. This is only valid on names
+received through the Start or End handlers from a single document, or through
+a call to the generate_ns_name method. In other words, don't use names
+generated from one instance of XML::Parser::Expat with other instances.
+
+=item eq_name(name1, name2)
+
+Return true if name1 and name2 are identical (i.e. same name and from
+the same namespace.) This is only meaningful if both names were obtained
+through the Start or End handlers from a single document, or through
+a call to the generate_ns_name method.
+
+=item generate_ns_name(name, namespace)
+
+Return a name, associated with a given namespace, good for using with the
+above 2 methods. The namespace argument should be the namespace URI, not
+a prefix.
+
+=item new_ns_prefixes
+
+When called from a start tag handler, returns namespace prefixes declared
+with this start tag. If called elsewere (or if there were no namespace
+prefixes declared), it returns an empty list. Setting of the default
+namespace is indicated with '#default' as a prefix.
+
+=item expand_ns_prefix(prefix)
+
+Return the uri to which the given prefix is currently bound. Returns
+undef if the prefix isn't currently bound. Use '#default' to find the
+current binding of the default namespace (if any).
+
+=item current_ns_prefixes
+
+Return a list of currently bound namespace prefixes. The order of the
+the prefixes in the list has no meaning. If the default namespace is
+currently bound, '#default' appears in the list.
+
+=item recognized_string
+
+Returns the string from the document that was recognized in order to call
+the current handler. For instance, when called from a start handler, it
+will give us the the start-tag string. The string is encoded in UTF-8.
+
+=item original_string
+
+Returns the verbatim string from the document that was recognized in
+order to call the current handler. The string is in the original document
+encoding.
+
+=item default_current
+
+When called from a handler, causes the sequence of characters that generated
+the corresponding event to be sent to the default handler (if one is
+registered). Use of this method is deprecated in favor the recognized_string
+method, which you can use without installing a default handler.
+
+=item xpcroak(message)
+
+Concatenate onto the given message the current line number within the
+XML document plus the message implied by ErrorContext. Then croak with
+the formed message.
+
+=item xpcarp(message)
+
+Concatenate onto the given message the current line number within the
+XML document plus the message implied by ErrorContext. Then carp with
+the formed message.
+
+=item current_line
+
+Returns the line number of the current position of the parse.
+
+=item current_column
+
+Returns the column number of the current position of the parse.
+
+=item current_byte
+
+Returns the current position of the parse.
+
+=item base([NEWBASE]);
+
+Returns the current value of the base for resolving relative URIs. If
+NEWBASE is supplied, changes the base to that value.
+
+=item context
+
+Returns a list of element names that represent open elements, with the
+last one being the innermost. Inside start and end tag handlers, this
+will be the tag of the parent element.
+
+=item current_element
+
+Returns the name of the innermost currently opened element. Inside
+start or end handlers, returns the parent of the element associated
+with those tags.
+
+=item in_element(NAME)
+
+Returns true if NAME is equal to the name of the innermost currently opened
+element. If namespace processing is being used and you want to check
+against a name that may be in a namespace, then use the generate_ns_name
+method to create the NAME argument.
+
+=item within_element(NAME)
+
+Returns the number of times the given name appears in the context list.
+If namespace processing is being used and you want to check
+against a name that may be in a namespace, then use the generate_ns_name
+method to create the NAME argument.
+
+=item depth
+
+Returns the size of the context list.
+
+=item element_index
+
+Returns an integer that is the depth-first visit order of the current
+element. This will be zero outside of the root element. For example,
+this will return 1 when called from the start handler for the root element
+start tag.
+
+=item skip_until(INDEX)
+
+INDEX is an integer that represents an element index. When this method
+is called, all handlers are suspended until the start tag for an element
+that has an index number equal to INDEX is seen. If a start handler has
+been set, then this is the first tag that the start handler will see
+after skip_until has been called.
+
+
+=item position_in_context(LINES)
+
+Returns a string that shows the current parse position. LINES should be
+an integer >= 0 that represents the number of lines on either side of the
+current parse line to place into the returned string.
+
+=item xml_escape(TEXT [, CHAR [, CHAR ...]])
+
+Returns TEXT with markup characters turned into character entities. Any
+additional characters provided as arguments are also turned into character
+references where found in TEXT.
+
+=item parse (SOURCE)
+
+The SOURCE parameter should either be a string containing the whole XML
+document, or it should be an open IO::Handle. Only a single document
+may be parsed for a given instance of XML::Parser::Expat, so this will croak
+if it's been called previously for this instance.
+
+=item parsestring(XML_DOC_STRING)
+
+Parses the given string as an XML document. Only a single document may be
+parsed for a given instance of XML::Parser::Expat, so this will die if either
+parsestring or parsefile has been called for this instance previously.
+
+This method is deprecated in favor of the parse method.
+
+=item parsefile(FILENAME)
+
+Parses the XML document in the given file. Will die if parsestring or
+parsefile has been called previously for this instance.
+
+=item is_defaulted(ATTNAME)
+
+NO LONGER WORKS. To find out if an attribute is defaulted please use
+the specified_attr method.
+
+=item specified_attr
+
+When the start handler receives lists of attributes and values, the
+non-defaulted (i.e. explicitly specified) attributes occur in the list
+first. This method returns the number of specified items in the list.
+So if this number is equal to the length of the list, there were no
+defaulted values. Otherwise the number points to the index of the
+first defaulted attribute name.
+
+=item finish
+
+Unsets all handlers (including internal ones that set context), but expat
+continues parsing to the end of the document or until it finds an error.
+It should finish up a lot faster than with the handlers set.
+
+=item release
+
+There are data structures used by XML::Parser::Expat that have circular
+references. This means that these structures will never be garbage
+collected unless these references are explicitly broken. Calling this
+method breaks those references (and makes the instance unusable.)
+
+Normally, higher level calls handle this for you, but if you are using
+XML::Parser::Expat directly, then it's your responsibility to call it.
+
+=back
+
+=head2 XML::Parser::ExpatNB Methods
+
+The class XML::Parser::ExpatNB is a subclass of XML::Parser::Expat used
+for non-blocking access to the expat library. It does not support the parse,
+parsestring, or parsefile methods, but it does have these additional methods:
+
+=over 4
+
+=item parse_more(DATA)
+
+Feed expat more text to munch on.
+
+=item parse_done
+
+Tell expat that it's gotten the whole document.
+
+=back
+
+=head1 FUNCTIONS
+
+=over 4
+
+=item XML::Parser::Expat::load_encoding(ENCODING)
+
+Load an external encoding. ENCODING is either the name of an encoding or
+the name of a file. The basename is converted to lowercase and a '.enc'
+extension is appended unless there's one already there. Then, unless
+it's an absolute pathname (i.e. begins with '/'), the first file by that
+name discovered in the @Encoding_Path path list is used.
+
+The encoding in the file is loaded and kept in the %Encoding_Table
+table. Earlier encodings of the same name are replaced.
+
+This function is automaticly called by expat when it encounters an encoding
+it doesn't know about. Expat shouldn't call this twice for the same
+encoding name. The only reason users should use this function is to
+explicitly load an encoding not contained in the @Encoding_Path list.
+
+=back
+
+=head1 AUTHORS
+
+Larry Wall <F<larry@wall.org>> wrote version 1.0.
+
+Clark Cooper <F<coopercc@netheaven.com>> picked up support, changed the API
+for this version (2.x), provided documentation, and added some standard
+package features.
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/RegExp.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,77 @@
+package XML::RegExp;
+
+use vars qw( $BaseChar $Ideographic $Letter $Digit $Extender
+ $CombiningChar $NameChar
+ $EntityRef $CharRef $Reference
+ $Name $NmToken $AttValue
+ $NCNameChar $NCName $Prefix $LocalPart $QName );
+
+$BaseChar = '(?:[a-zA-Z]|\xC3[\x80-\x96\x98-\xB6\xB8-\xBF]|\xC4[\x80-\xB1\xB4-\xBE]|\xC5[\x81-\x88\x8A-\xBE]|\xC6[\x80-\xBF]|\xC7[\x80-\x83\x8D-\xB0\xB4\xB5\xBA-\xBF]|\xC8[\x80-\x97]|\xC9[\x90-\xBF]|\xCA[\x80-\xA8\xBB-\xBF]|\xCB[\x80\x81]|\xCE[\x86\x88-\x8A\x8C\x8E-\xA1\xA3-\xBF]|\xCF[\x80-\x8E\x90-\x96\x9A\x9C\x9E\xA0\xA2-\xB3]|\xD0[\x81-\x8C\x8E-\xBF]|\xD1[\x80-\x8F\x91-\x9C\x9E-\xBF]|\xD2[\x80\x81\x90-\xBF]|\xD3[\x80-\x84\x87\x88\x8B\x8C\x90-\xAB\xAE-\xB5\xB8\xB9]|\xD4[\xB1-\xBF]|\xD5[\x80-\x96\x99\xA1-\xBF]|\xD6[\x80-\x86]|\xD7[\x90-\xAA\xB0-\xB2]|\xD8[\xA1-\xBA]|\xD9[\x81-\x8A\xB1-\xBF]|\xDA[\x80-\xB7\xBA-\xBE]|\xDB[\x80-\x8E\x90-\x93\x95\xA5\xA6]|\xE0(?:\xA4[\x85-\xB9\xBD]|\xA5[\x98-\xA1]|\xA6[\x85-\x8C\x8F\x90\x93-\xA8\xAA-\xB0\xB2\xB6-\xB9]|\xA7[\x9C\x9D\x9F-\xA1\xB0\xB1]|\xA8[\x85-\x8A\x8F\x90\x93-\xA8\xAA-\xB0\xB2\xB3\xB5\xB6\xB8\xB9]|\xA9[\x99-\x9C\x9E\xB2-\xB4]|\xAA[\x85-\x8B\x8D\x8F-\x91\x93-\xA8\xAA-\xB0\xB2\xB3\xB5-\xB9\xBD]|\xAB\xA0|\xAC[\x85-\x8C\x8F\x90\x93-\xA8\xAA-\xB0\xB2\xB3\xB6-\xB9\xBD]|\xAD[\x9C\x9D\x9F-\xA1]|\xAE[\x85-\x8A\x8E-\x90\x92-\x95\x99\x9A\x9C\x9E\x9F\xA3\xA4\xA8-\xAA\xAE-\xB5\xB7-\xB9]|\xB0[\x85-\x8C\x8E-\x90\x92-\xA8\xAA-\xB3\xB5-\xB9]|\xB1[\xA0\xA1]|\xB2[\x85-\x8C\x8E-\x90\x92-\xA8\xAA-\xB3\xB5-\xB9]|\xB3[\x9E\xA0\xA1]|\xB4[\x85-\x8C\x8E-\x90\x92-\xA8\xAA-\xB9]|\xB5[\xA0\xA1]|\xB8[\x81-\xAE\xB0\xB2\xB3]|\xB9[\x80-\x85]|\xBA[\x81\x82\x84\x87\x88\x8A\x8D\x94-\x97\x99-\x9F\xA1-\xA3\xA5\xA7\xAA\xAB\xAD\xAE\xB0\xB2\xB3\xBD]|\xBB[\x80-\x84]|\xBD[\x80-\x87\x89-\xA9])|\xE1(?:\x82[\xA0-\xBF]|\x83[\x80-\x85\x90-\xB6]|\x84[\x80\x82\x83\x85-\x87\x89\x8B\x8C\x8E-\x92\xBC\xBE]|\x85[\x80\x8C\x8E\x90\x94\x95\x99\x9F-\xA1\xA3\xA5\xA7\xA9\xAD\xAE\xB2\xB3\xB5]|\x86[\x9E\xA8\xAB\xAE\xAF\xB7\xB8\xBA\xBC-\xBF]|\x87[\x80-\x82\xAB\xB0\xB9]|[\xB8\xB9][\x80-\xBF]|\xBA[\x80-\x9B\xA0-\xBF]|\xBB[\x80-\xB9]|\xBC[\x80-\x95\x98-\x9D\xA0-\xBF]|\xBD[\x80-\x85\x88-\x8D\x90-\x97\x99\x9B\x9D\x9F-\xBD]|\xBE[\x80-\xB4\xB6-\xBC\xBE]|\xBF[\x82-\x84\x86-\x8C\x90-\x93\x96-\x9B\xA0-\xAC\xB2-\xB4\xB6-\xBC])|\xE2(?:\x84[\xA6\xAA\xAB\xAE]|\x86[\x80-\x82])|\xE3(?:\x81[\x81-\xBF]|\x82[\x80-\x94\xA1-\xBF]|\x83[\x80-\xBA]|\x84[\x85-\xAC])|\xEA(?:[\xB0-\xBF][\x80-\xBF])|\xEB(?:[\x80-\xBF][\x80-\xBF])|\xEC(?:[\x80-\xBF][\x80-\xBF])|\xED(?:[\x80-\x9D][\x80-\xBF]|\x9E[\x80-\xA3]))';
+
+$Ideographic = '(?:\xE3\x80[\x87\xA1-\xA9]|\xE4(?:[\xB8-\xBF][\x80-\xBF])|\xE5(?:[\x80-\xBF][\x80-\xBF])|\xE6(?:[\x80-\xBF][\x80-\xBF])|\xE7(?:[\x80-\xBF][\x80-\xBF])|\xE8(?:[\x80-\xBF][\x80-\xBF])|\xE9(?:[\x80-\xBD][\x80-\xBF]|\xBE[\x80-\xA5]))';
+
+$Digit = '(?:[0-9]|\xD9[\xA0-\xA9]|\xDB[\xB0-\xB9]|\xE0(?:\xA5[\xA6-\xAF]|\xA7[\xA6-\xAF]|\xA9[\xA6-\xAF]|\xAB[\xA6-\xAF]|\xAD[\xA6-\xAF]|\xAF[\xA7-\xAF]|\xB1[\xA6-\xAF]|\xB3[\xA6-\xAF]|\xB5[\xA6-\xAF]|\xB9[\x90-\x99]|\xBB[\x90-\x99]|\xBC[\xA0-\xA9]))';
+
+$Extender = '(?:\xC2\xB7|\xCB[\x90\x91]|\xCE\x87|\xD9\x80|\xE0(?:\xB9\x86|\xBB\x86)|\xE3(?:\x80[\x85\xB1-\xB5]|\x82[\x9D\x9E]|\x83[\xBC-\xBE]))';
+
+$CombiningChar = '(?:\xCC[\x80-\xBF]|\xCD[\x80-\x85\xA0\xA1]|\xD2[\x83-\x86]|\xD6[\x91-\xA1\xA3-\xB9\xBB-\xBD\xBF]|\xD7[\x81\x82\x84]|\xD9[\x8B-\x92\xB0]|\xDB[\x96-\xA4\xA7\xA8\xAA-\xAD]|\xE0(?:\xA4[\x81-\x83\xBC\xBE\xBF]|\xA5[\x80-\x8D\x91-\x94\xA2\xA3]|\xA6[\x81-\x83\xBC\xBE\xBF]|\xA7[\x80-\x84\x87\x88\x8B-\x8D\x97\xA2\xA3]|\xA8[\x82\xBC\xBE\xBF]|\xA9[\x80-\x82\x87\x88\x8B-\x8D\xB0\xB1]|\xAA[\x81-\x83\xBC\xBE\xBF]|\xAB[\x80-\x85\x87-\x89\x8B-\x8D]|\xAC[\x81-\x83\xBC\xBE\xBF]|\xAD[\x80-\x83\x87\x88\x8B-\x8D\x96\x97]|\xAE[\x82\x83\xBE\xBF]|\xAF[\x80-\x82\x86-\x88\x8A-\x8D\x97]|\xB0[\x81-\x83\xBE\xBF]|\xB1[\x80-\x84\x86-\x88\x8A-\x8D\x95\x96]|\xB2[\x82\x83\xBE\xBF]|\xB3[\x80-\x84\x86-\x88\x8A-\x8D\x95\x96]|\xB4[\x82\x83\xBE\xBF]|\xB5[\x80-\x83\x86-\x88\x8A-\x8D\x97]|\xB8[\xB1\xB4-\xBA]|\xB9[\x87-\x8E]|\xBA[\xB1\xB4-\xB9\xBB\xBC]|\xBB[\x88-\x8D]|\xBC[\x98\x99\xB5\xB7\xB9\xBE\xBF]|\xBD[\xB1-\xBF]|\xBE[\x80-\x84\x86-\x8B\x90-\x95\x97\x99-\xAD\xB1-\xB7\xB9])|\xE2\x83[\x90-\x9C\xA1]|\xE3(?:\x80[\xAA-\xAF]|\x82[\x99\x9A]))';
+
+$Letter = "(?:$BaseChar|$Ideographic)";
+$NameChar = "(?:[-._:]|$Letter|$Digit|$CombiningChar|$Extender)";
+
+$Name = "(?:(?:[:_]|$Letter)$NameChar*)";
+$NmToken = "(?:$NameChar+)";
+$EntityRef = "(?:\&$Name;)";
+$CharRef = "(?:\&#(?:[0-9]+|x[0-9a-fA-F]+);)";
+$Reference = "(?:$EntityRef|$CharRef)";
+
+#?? what if it contains entity references?
+$AttValue = "(?:\"(?:[^\"&<]*|$Reference)\"|'(?:[^\'&<]|$Reference)*')";
+
+#########################################################################
+# The following definitions came from the XML Namespaces spec:
+#########################################################################
+
+# Same as $NameChar without the ":"
+$NCNameChar = "(?:[-._]|$Letter|$Digit|$CombiningChar|$Extender)";
+
+# Same as $Name without the colons
+$NCName = "(?:(?:_|$Letter)$NCNameChar*)";
+
+$Prefix = $NCName;
+$LocalPart = $NCName;
+$QName = "(?:(?:$Prefix:)?$LocalPart)";
+
+return 1;
+
+__END__
+
+=head1 NAME
+
+XML::RegExp - Regular expressions for XML tokens
+
+=head1 SYNOPSIS
+
+ use XML::RegExp;
+
+ if ($my_name =~ /^$XML::RegExp::Name$/)
+ {
+ # $my_name is a valid XML 'Name'
+ }
+
+=head1 DESCRIPTION
+
+This package contains regular expressions for the following XML tokens:
+BaseChar, Ideographic, Letter, Digit, Extender, CombiningChar, NameChar,
+EntityRef, CharRef, Reference, Name, NmToken, and AttValue.
+
+The definitions of these tokens were taken from the XML spec
+(Extensible Markup Language 1.0) at L<http://www.w3.org/TR/REC-xml>.
+
+Also contains the regular expressions for the following tokens from the
+XML Namespaces spec at L<http://www.w3.org/TR/REC-xml-names>:
+NCNameChar, NCName, QName, Prefix and LocalPart.
+
+=head1 AUTHOR
+
+Please send bugs, comments and suggestions to Enno Derksen <F<enno@att.com>>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/UM.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,466 @@
+#
+# TO DO:
+#
+# - Implement SlowMappers for expat builtin encodings (for which there
+# are no .enc files), e.g. UTF-16, US-ASCII, ISO-8859-1.
+# - Instead of parsing the .xml file with XML::Encoding, we should use XS.
+# If this will not be implemented for a while, we could try reading the
+# .enc file directly, instead of the .xml file.
+# I started writing XML::UM::EncParser to do this (see EOF), but got stuck.
+#
+
+use strict;
+
+package XML::UM::SlowMapper;
+use Carp;
+use XML::Encoding;
+
+use vars qw{ $ENCDIR %DEFAULT_ASCII_MAPPINGS };
+
+my $UTFCHAR = '[\\x00-\\xBF]|[\\xC0-\\xDF].|[\\xE0-\\xEF]..|[\\xF0-\\xFF]...';
+
+#
+# The directory that contains the .xml files that come with XML::Encoding.
+# Include the terminating '\' or '/' !!
+#
+$ENCDIR = "/home1/enno/perlModules/XML-Encoding-1.01/maps/";
+#$ENCDIR = "c:\\src\\perl\\xml\\XML-Encoding-1.01\\maps\\";
+
+#
+# From xmlparse.h in expat distribution:
+#
+# Expat places certain restrictions on the encodings that are supported
+# using this mechanism.
+#
+# 1. Every ASCII character that can appear in a well-formed XML document,
+# other than the characters
+#
+# $@\^`{}~
+#
+# must be represented by a single byte, and that byte must be the
+# same byte that represents that character in ASCII.
+#
+# [end of excerpt]
+
+#?? Which 'ASCII characters can appear in a well-formed XML document ??
+
+# All ASCII codes 0 - 127, excl. 36,64,92,94,96,123,125,126 i.e. $@\^`{}~
+%DEFAULT_ASCII_MAPPINGS = map { (chr($_), chr($_)) } (0 .. 35, 37 .. 63,
+ 65 .. 91, 93, 95,
+ 97 .. 122, 124, 127);
+
+sub new
+{
+ my ($class, %hash) = @_;
+ my $self = bless \%hash, $class;
+
+ $self->read_encoding_file;
+
+ $self;
+}
+
+sub dispose
+{
+ my $self = shift;
+ $self->{Factory}->dispose_mapper ($self);
+ delete $self->{Encode};
+}
+
+# Reads the XML file that contains the encoding definition.
+# These files come with XML::Encoding.
+sub read_encoding_file
+{
+#?? This should parse the .enc files (the .xml files are not installed) !!
+
+ my ($self) = @_;
+ my $encoding = $self->{Encoding};
+
+ # There is no .enc (or .xml) file for US-ASCII, but the mapping is simple
+ # so here it goes...
+ if ($encoding eq 'US-ASCII')
+ {
+ $self->{EncMapName} = 'US-ASCII';
+ $self->{Map} = \%DEFAULT_ASCII_MAPPINGS; # I hope this is right
+ return;
+ }
+
+ my $file = $self->find_encoding_file ($encoding);
+
+ my %uni = %DEFAULT_ASCII_MAPPINGS;
+ my $prefix = "";
+ my $DIR = "file:$ENCDIR";
+
+ my $enc = new XML::Encoding (Handlers => {
+ Init =>
+ sub {
+ my $base = shift->base ($DIR);
+ }
+ },
+
+ PushPrefixFcn =>
+ sub {
+ $prefix .= chr (shift);
+ undef;
+ },
+
+ PopPrefixFcn =>
+ sub {
+ chop $prefix;
+ undef;
+ },
+
+ RangeSetFcn =>
+ sub {
+ my ($byte, $uni, $len) = @_;
+ for (my $i = $uni; $len--; $uni++)
+ {
+ $uni{XML::UM::unicode_to_utf8($uni)} = $prefix . chr ($byte++);
+ }
+ undef;
+ });
+
+ $self->{EncMapName} = $enc->parsefile ($file);
+
+#print "Parsed Encoding " . $self->{Encoding} . " MapName=" . $self->{EncMapName} . "\n";
+
+ $self->{Map} = \%uni;
+}
+
+sub find_encoding_file
+{
+ my ($self, $enc) = @_;
+
+ return "$ENCDIR\L$enc\E.xml"; # .xml filename is lower case
+}
+
+# Returns a closure (method) that converts a UTF-8 encoded string to an
+# encoded byte sequence.
+sub get_encode
+{
+ my ($self, %hash) = @_;
+ my $MAP = $self->{Map};
+ my $ENCODE_UNMAPPED = $hash{EncodeUnmapped} || \&XML::UM::encode_unmapped_dec;
+
+ my $code = "sub {\n my \$str = shift;\n \$str =~ s/";
+
+ $code .= "($UTFCHAR)/\n";
+ $code .= "defined \$MAP->{\$1} ? \$MAP->{\$1} : ";
+ $code .= "\&\$ENCODE_UNMAPPED(\$1) /egs;\n";
+
+ $code .= "\$str }\n";
+# print $code;
+
+ my $func = eval $code;
+ croak "could not eval generated code=[$code]: $@" if $@;
+
+ $func;
+}
+
+#
+# Optimized version for when the encoding is UTF-8.
+# (In that case no conversion takes place.)
+#
+package XML::UM::SlowMapper::UTF8;
+use vars qw{ @ISA };
+@ISA = qw{ XML::UM::SlowMapper };
+
+sub read_encoding_file
+{
+ # ignore it
+}
+
+sub get_encode
+{
+ \&dont_convert;
+}
+
+sub dont_convert # static
+{
+ shift # return argument unchanged
+}
+
+package XML::UM::SlowMapperFactory;
+
+sub new
+{
+ my ($class, %hash) = @_;
+ bless \%hash, $class;
+}
+
+sub get_encode
+{
+ my ($self, %options) = @_;
+ my $encoding = $options{Encoding};
+
+ my $mapper = $self->get_mapper ($encoding);
+ return $mapper->get_encode (%options);
+}
+
+sub get_mapper
+{
+ my ($self, $encoding) = @_;
+ $self->{Mapper}->{$encoding} ||=
+ ($encoding eq "UTF-8" ?
+ new XML::UM::SlowMapper::UTF8 (Encoding => $encoding,
+ Factory => $self) :
+ new XML::UM::SlowMapper (Encoding => $encoding,
+ Factory => $self));
+}
+
+#
+# Prepare for garbage collection (remove circular refs)
+#
+sub dispose_encoding
+{
+ my ($self, $encoding) = @_;
+ my $mapper = $self->{Mapper}->{$encoding};
+ return unless defined $mapper;
+
+ delete $mapper->{Factory};
+ delete $self->{Mapper}->{$encoding};
+}
+
+package XML::UM;
+use Carp;
+
+use vars qw{ $FACTORY %XML_MAPPING_CRITERIA };
+$FACTORY = XML::UM::SlowMapperFactory->new;
+
+sub get_encode # static
+{
+ $FACTORY->get_encode (@_);
+}
+
+sub dispose_encoding # static
+{
+ $FACTORY->dispose_encoding (@_);
+}
+
+# Convert UTF-8 byte sequence to Unicode index; then to '&#xNN;' string
+sub encode_unmapped_hex # static
+{
+ my $n = utf8_to_unicode (shift);
+ sprintf ("&#x%X;", $n);
+}
+
+sub encode_unmapped_dec # static
+{
+ my $n = utf8_to_unicode (shift);
+ "&#$n;"
+}
+
+# Converts a UTF-8 byte sequence that represents one character,
+# to its Unicode index.
+sub utf8_to_unicode # static
+{
+ my $str = shift;
+ my $len = length ($str);
+
+ if ($len == 1)
+ {
+ return ord ($str);
+ }
+ if ($len == 2)
+ {
+ my @n = unpack "C2", $str;
+ return (($n[0] & 0x3f) << 6) + ($n[1] & 0x3f);
+ }
+ elsif ($len == 3)
+ {
+ my @n = unpack "C3", $str;
+ return (($n[0] & 0x1f) << 12) + (($n[1] & 0x3f) << 6) +
+ ($n[2] & 0x3f);
+ }
+ elsif ($len == 4)
+ {
+ my @n = unpack "C4", $str;
+ return (($n[0] & 0x0f) << 18) + (($n[1] & 0x3f) << 12) +
+ (($n[2] & 0x3f) << 6) + ($n[3] & 0x3f);
+ }
+ else
+ {
+ croak "bad UTF8 sequence [$str] hex=" . hb($str);
+ }
+}
+
+# Converts a Unicode character index to the byte sequence
+# that represents that character in UTF-8.
+sub unicode_to_utf8 # static
+{
+ my $n = shift;
+ if ($n < 0x80)
+ {
+ return chr ($n);
+ }
+ elsif ($n < 0x800)
+ {
+ return pack ("CC", (($n >> 6) | 0xc0), (($n & 0x3f) | 0x80));
+ }
+ elsif ($n < 0x10000)
+ {
+ return pack ("CCC", (($n >> 12) | 0xe0), ((($n >> 6) & 0x3f) | 0x80),
+ (($n & 0x3f) | 0x80));
+ }
+ elsif ($n < 0x110000)
+ {
+ return pack ("CCCC", (($n >> 18) | 0xf0), ((($n >> 12) & 0x3f) | 0x80),
+ ((($n >> 6) & 0x3f) | 0x80), (($n & 0x3f) | 0x80));
+ }
+ croak "number [$n] is too large for Unicode in \&unicode_to_utf8";
+}
+
+#?? The following package is unfinished.
+#?? It should parse the .enc file and create an array that maps
+#?? Unicode-index to encoded-str. I got stuck...
+
+# package XML::UM::EncParser;
+#
+# sub new
+# {
+# my ($class, %hash) = @_;
+# my $self = bless \%hash, $class;
+# $self;
+# }
+#
+# sub parse
+# {
+# my ($self, $filename) = @_;
+# open (FILE, $filename) || die "can't open .enc file $filename";
+# binmode (FILE);
+#
+# my $buf;
+# read (FILE, $buf, 4 + 40 + 2 + 2 + 1024);
+#
+# my ($magic, $name, $pfsize, $bmsize, @map) = unpack ("NA40nnN256", $buf);
+# printf "magic=%04x name=$name pfsize=$pfsize bmsize=$bmsize\n", $magic;
+#
+# if ($magic != 0xFEEBFACE)
+# {
+# close FILE;
+# die sprintf ("bad magic number [0x%08X] in $filename, expected 0xFEEBFACE", $magic);
+# }
+#
+# for (my $i = 0; $i < 256; $i++)
+# {
+# printf "[%d]=%d ", $i, $map[$i];
+# print "\n" if ($i % 8 == 7);
+# }
+#
+# for (my $i = 0; $i < $pfsize; $i++)
+# {
+# print "----- PrefixMap $i ----\n";
+# read (FILE, $buf, 2 + 2 + 32 + 32);
+# my ($min, $len, $bmap_start, @ispfx) = unpack ("CCnC64", $buf);
+# my (@ischar) = splice @ispfx, 32, 32, ();
+# #?? could use b256 instead of C32 for bitvector a la vec()
+#
+# print "ispfx=@ispfx\n";
+# print "ischar=@ischar\n";
+# $len = 256 if $len == 0;
+#
+# print " min=$min len=$len bmap_start=$bmap_start\n";
+# }
+#
+# close FILE;
+# }
+
+1; # package return code
+
+__END__
+
+=head1 NAME
+
+XML::UM - Convert UTF-8 strings to any encoding supported by XML::Encoding
+
+=head1 SYNOPSIS
+
+ use XML::UM;
+
+ # Set directory with .xml files that comes with XML::Encoding distribution
+ # Always include the trailing slash!
+ $XML::UM::ENCDIR = '/home1/enno/perlModules/XML-Encoding-1.01/maps/';
+
+ # Create the encoding routine
+ my $encode = XML::UM::get_encode (
+ Encoding => 'ISO-8859-2',
+ EncodeUnmapped => \&XML::UM::encode_unmapped_dec);
+
+ # Convert a string from UTF-8 to the specified Encoding
+ my $encoded_str = $encode->($utf8_str);
+
+ # Remove circular references for garbage collection
+ XML::UM::dispose_encoding ('ISO-8859-2');
+
+=head1 DESCRIPTION
+
+This module provides methods to convert UTF-8 strings to any XML encoding
+that L<XML::Encoding> supports. It creates mapping routines from the .xml
+files that can be found in the maps/ directory in the L<XML::Encoding>
+distribution. Note that the XML::Encoding distribution does install the
+.enc files in your perl directory, but not the.xml files they were created
+from. That's why you have to specify $ENCDIR as in the SYNOPSIS.
+
+This implementation uses the XML::Encoding class to parse the .xml
+file and creates a hash that maps UTF-8 characters (each consisting of up
+to 4 bytes) to their equivalent byte sequence in the specified encoding.
+Note that large mappings may consume a lot of memory!
+
+Future implementations may parse the .enc files directly, or
+do the conversions entirely in XS (i.e. C code.)
+
+=head1 get_encode (Encoding => STRING, EncodeUnmapped => SUB)
+
+The central entry point to this module is the XML::UM::get_encode() method.
+It forwards the call to the global $XML::UM::FACTORY, which is defined as
+an instance of XML::UM::SlowMapperFactory by default. Override this variable
+to plug in your own mapper factory.
+
+The XML::UM::SlowMapperFactory creates an instance of XML::UM::SlowMapper
+(and caches it for subsequent use) that reads in the .xml encoding file and
+creates a hash that maps UTF-8 characters to encoded characters.
+
+The get_encode() method of XML::UM::SlowMapper is called, finally, which
+generates an anonimous subroutine that uses the hash to convert
+multi-character UTF-8 blocks to the proper encoding.
+
+=head1 dispose_encoding ($encoding_name)
+
+Call this to free the memory used by the SlowMapper for a specific encoding.
+Note that in order to free the big conversion hash, the user should no longer
+have references to the subroutines generated by get_encode().
+
+The parameters to the get_encode() method (defined as name/value pairs) are:
+
+=over 4
+
+=item * Encoding
+
+The name of the desired encoding, e.g. 'ISO-8859-2'
+
+=item * EncodeUnmapped (Default: \&XML::UM::encode_unmapped_dec)
+
+Defines how Unicode characters not found in the mapping file (of the
+specified encoding) are printed.
+By default, they are converted to decimal entity references, like '{'
+
+Use \&XML::UM::encode_unmapped_hex for hexadecimal constants, like '«'
+
+=back
+
+=head1 CAVEATS
+
+I'm not exactly sure about which Unicode characters in the range (0 .. 127)
+should be mapped to themselves. See comments in XML/UM.pm near
+%DEFAULT_ASCII_MAPPINGS.
+
+The encodings that expat supports by default are currently not supported,
+(e.g. UTF-16, ISO-8859-1),
+because there are no .enc files available for these encodings.
+This module needs some more work. If you have the time, please help!
+
+=head1 AUTHOR
+
+Send bug reports, hints, tips, suggestions to Enno Derksen at
+<F<enno@att.com>>.
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,3947 @@
+############################################################################
+# Copyright (c) 1998,1999 Enno Derksen
+# All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+############################################################################
+#
+# To do (in no particular order):
+#
+# - Element tag names that are the same as a XQL keyword (e.g. "or", "not", ..)
+# are currently not supported. The parser and lexer needs to be smarter and
+# know what context they are in.
+# - output using xql:result etc.
+# - xml:space=preserve still needs to be adhered to in text() etc.
+# - I already added xql_preserveSpace. Still need to use it in (raw)text() etc.
+# - XQL functions (like value()) should probably work on input lists > 1 node
+# (The code was changed, but it needs to be tested. ancestor() wasn't fixed)
+# - verify implementation of xql_namespace
+# - verify implementation of end, index
+# - check passing of context to the solve() methods
+# - functions/methods may be wrong. They receive the entire LHS set,
+# so count() is right, but the rest may be wrong!
+# - may need to use different comment delimiters, '#' may be used in future XQL
+# definition (according to Joe Lapp, one of the XQL spec authors)
+# - caching of Node xql_values (?)
+# - finish the Date class
+# - discuss which classes: Date, Time, and/or DateTime ?
+# - conversion of Query result to Perl primitives, i.e. how do we return the
+# result of a query.
+# - add support for ordering/formatting the query results, see XML-QL
+# - discuss typecasting mechanism
+# - error reporting mechanism
+# - yyerror handler doesn't seem to work
+# - passing intermediate exceptions ($@) to the user
+# - more debugging support
+# - subst, map etc.
+# - use rawText for Nodes?
+# - recurse or not?
+# - text/rawText default - recurse or not?
+# - what should default value() implementation use?
+# - check if all Syntactic Constraints in XQL spec are implemented
+# - support all node types, i.e. Notation, Attlist etc.
+# - sorting in 'document order' doesn't work yet for 'other' DOM nodes
+# - generateFunction - support functions that return lists?
+# - match() function - what should it return?
+# - keeping track of reference nodes not always done right
+# - also think about Perl builtin functions
+# - conversion to Perl number throws warnings with -w (in comparisons etc.)
+# - sorting
+# - add sorting by attribute name (within same element)
+# (or other criteria)
+# - optional sorting in $union$ ?
+# - could add a flag that says "don't worry about document order for $union$"
+# - user defined sort?
+# - OPTIMIZE!
+# - Subscript operator
+# - Filter operator
+# - etc.
+
+package XML::XQL;
+use strict;
+
+use Carp;
+use XML::RegExp;
+
+use vars qw( @EXPORT $VERSION
+ $ContextStart $ContextEnd $BoldOn $BoldOff
+ %Func %Method %FuncArgCount
+ %AllowedOutsideSubquery %ConstFunc %ExpandedType
+ $Restricted $Included $ReXQLName
+ %CompareOper $Token_q $Token_qq $LAST_SORT_KEY
+ );
+
+@EXPORT = qw( $VERSION $Restricted $Included );
+
+BEGIN
+{
+ $VERSION = '0.63';
+
+ die "XML::XQL is already used/required" if defined $Included;
+ $Included = 1;
+
+ # From XQL spec (The '-' was added to allow XPath style function names.)
+ $ReXQLName = "(?:[-a-zA-Z_]+\\w*)";
+
+ $Token_q = undef;
+ $Token_qq = undef;
+
+ $Restricted = 0 unless defined $Restricted;
+
+ if (not $Restricted)
+ {
+ # Allow names with Perl package prefixes
+ $ReXQLName = "(?:$ReXQLName(?:::$ReXQLName)*)";
+
+ # Support q// and qq// strings
+ $Token_q = "q";
+ $Token_qq = "qq";
+ }
+};
+
+# To save the user some typing for the simplest cases
+sub solve
+{
+ my ($expr, @args) = @_;
+ my $query = new XML::XQL::Query (Expr => $expr);
+ my @result = $query->solve (@args);
+ $query->dispose;
+
+ @result;
+}
+
+#---------- Parser related stuff ----------------------------------------------
+
+# Find (nested) closing delimiter in q{} or qq{} strings
+sub parse_q
+{
+ my ($qname, $q, $str, $d1, $d2) = @_;
+ my ($match) = "";
+ my ($found);
+
+ while ($str =~ /^([^$d1$d2]*)($d1|($d2))(.*)/s)
+ {
+ defined ($3) and return ($4, $match . $1); # $d2 found
+
+ # match delimiters recursively
+ $match .= $1 . $2;
+
+ ($str, $found) = parse_q ($qname, $q, $4, $d1, $d2);
+ $match .= $found . $d2;
+ }
+ XML::XQL::parseError ("no $qname// closing delimiter found near '$q$d1'");
+}
+
+# To support nested delimiters in q{} and qq() strings
+my %MatchingCloseDelim =
+(
+ '{' => '}',
+ '(' => ')',
+ '<' => '>',
+ '[' => ']'
+);
+
+sub Lexer
+{
+ my($parser)=shift;
+
+ exists($parser->YYData->{LINE})
+ or $parser->YYData->{LINE} = 1;
+
+ $parser->YYData->{INPUT}
+ or return('', undef);
+
+ print "Lexer input=[" . $parser->YYData->{INPUT} . "]\n"
+ if $parser->{yydebug};
+
+ if ($Restricted)
+ {
+ # strip leading whitespace
+ $parser->YYData->{INPUT} =~ s/^\s*//;
+ }
+ else
+ {
+ # strip leading whitespace and comments
+ $parser->YYData->{INPUT} =~ s/^(\s|#.*)*//;
+ }
+
+
+ for ($parser->YYData->{INPUT})
+ {
+ s#^"([^"]*)"##o and return ('TEXT', $1);
+ s#^'([^']*)'##o and return ('TEXT', $1);
+
+ if (not $Restricted)
+ {
+ # Support q// and qq// string delimiters
+ for my $qname ('q', 'qq')
+ {
+ my ($q) = $parser->{Query}->{$qname};
+ if (defined ($q) and s/^$q(\[\(\{\<#!=-\+|'":;\.,\?\/!@\%^\*)//)
+ {
+ my ($d1, $d2) = ($1, $MatchingCloseDelim{$1});
+ my ($str);
+ if (defined $d2)
+ {
+ ($parser->YYData->{INPUT}, $str) = parse_q (
+ $qname, $q, $_, $d1, $d2);
+ }
+ else # close delim is same open delim
+ {
+ $d2 = $d1;
+ s/([^$d2])*$d2// or XML::XQL::parseError (
+ "no $qname// closing delimiter found near '$q$d1'");
+ $str = $1;
+ }
+ return ('TEXT', eval "$q$d1$str$d2");
+ }
+ }
+ }
+
+ s/^(-?\d+\.(\d+)?)// and return ('NUMBER', $1);
+ s/^(-?\d+)// and return ('INTEGER', $1);
+
+ s/^(\$|\b)(i?(eq|ne|lt|le|gt|ge))\1(?=\W)//i
+ and return ('COMPARE', "\L$2");
+
+ s/^((\$|\b)(any|all|or|and|not|to|intersect)\2)(?=\W)//i
+ and return ("\L$3", $1);
+
+ s/^((\$|\b)union\2(?=\W)|\|)//i and return ('UnionOp', $1);
+
+ s/^(;;?)// and return ('SeqOp', $1);
+
+ if (not $Restricted)
+ {
+ s/^(=~|!~)// and return ('MATCH', $1);
+ s/^\$((no_)?match)\$//i
+ and return ('MATCH', "\L$1");
+ s/^\$($ReXQLName)\$//o and return ('COMPARE', $1);
+ }
+
+ s/^(=|!=|<|<=|>|>=)// and return ('COMPARE', $1);
+
+ s!^(//|/|\(|\)|\.\.?|@|\!|\[|\]|\*|:|,)!!
+ and return ($1, $1);
+
+ s/^($ReXQLName)\s*\(//o
+ and return ('XQLName_Paren', $1);
+
+ s/^($XML::RegExp::Name)//o and return ('NCName', $1);
+ }
+}
+
+#------ end Parser related stuff ----------------------------------------------
+
+# Converts result from a Disjunction to a 0 or 1.
+# If it's a XML::XQL::Boolean, its value is returned.
+# If it's an empty list it returns 0.
+# If it's a node or a Text or Number, it returns 1.
+# If it's a list with 1 or more elements, it returns 1 if at least one
+# element evaluates to 1 (with toBoolean)
+sub toBoolean # static method
+{
+ my $arg = shift;
+
+ my $type = ref ($arg);
+ if ($type eq "ARRAY")
+ {
+ for my $n (@$arg)
+ {
+ return 1 if toBoolean ($n);
+ }
+ return 0;
+ }
+ return $arg->xql_toBoolean;
+}
+
+sub listContains
+{
+ my ($list, $x) = @_;
+
+#?? $n should be a PrimitiveType or an XML Node
+ for my $y (@$list)
+ {
+#?? return 1 if $x == $y;
+
+ if (ref($x) eq ref($y)) # same object class
+ {
+ my ($src1, $src2) = ($x->xql_sourceNode, $y->xql_sourceNode);
+ next if ((defined $src1 or defined $src2) and $src1 != $src2);
+
+ return ($x == $y) if (UNIVERSAL::isa ($x, 'XML::XQL::Node'));
+
+ return 1 if $x->xql_eq ($y);
+ }
+ }
+ 0;
+}
+
+sub toList
+{
+ my $r = shift;
+ (ref ($r) eq "ARRAY") ? $r : [ $r ];
+}
+
+# Prepare right hand side for a comparison, i.e.
+# turn it into a single value.
+# If it is a list with 2 or more values, it croaks.
+sub prepareRvalue
+{
+ my $r = shift;
+
+ if (ref ($r) eq "ARRAY")
+ {
+ # more than 1 value gives a runtime error (as per Joe Lapp)
+ croak "bad rvalue $r" if @$r > 1;
+ $r = $r->[0];
+ }
+
+ if (ref ($r) and $r->isa ('XML::XQL::Node'))
+ {
+ $r = $r->xql_value;
+ }
+ $r;
+}
+
+sub trimSpace
+{
+ $_[0] =~ s/^\s+//;
+ $_[0] =~ s/\s+$//;
+ $_[0];
+}
+
+# Assumption: max. 32768 (2**15 = 2**($BITS-1)) children (or attributes) per node
+# Use setMaxChildren() to support larger offspring.
+my $BITS = 16;
+$LAST_SORT_KEY = (2 ** $BITS) - 1;
+
+# Call with values: $max = 128 * (256**N), where N=0, 1, 2, ...
+sub setMaxChildren
+{
+ my $max = shift;
+ my $m = 128;
+ $BITS = 8;
+ while ($max > $m)
+ {
+ $m = $m * 256;
+ $BITS += 8;
+ }
+ $LAST_SORT_KEY = (2 ** $BITS) - 1;
+}
+
+sub createSortKey
+{
+ # $_[0] = parent sort key, $_[1] = child index,
+ # $_[2] = 0 for attribute nodes, 1 for other node types
+ my $vec = "";
+ vec ($vec, 0, $BITS) = $_[1];
+ vec ($vec, 7, 1) = $_[2] if $_[2]; # set leftmost bit (for non-attributes)
+ $_[0] . $vec;
+}
+
+#--------------- Sorting source nodes ----------------------------------------
+
+# Sort the list by 'document order' (as per the XQL spec.)
+# Values with an associated source node are sorted by the position of their
+# source node in the XML document.
+# Values without a source node are placed at the end of the resulting list.
+# The source node of an Attribute node, is its (parent) Element node
+# (per definition.) The source node of the other types of XML nodes, is itself.
+# The order for values with the same source node is undefined.
+
+sub sortDocOrder
+{
+#?? or should I just use: sort { $a->xql_sortKey cmp $b->xql_sortKey }
+
+ my $list = shift;
+
+#print "before---\n";
+#for (@$list)
+#{
+# print "key=" . keyStr($_->xql_sortKey) . " node=" . $_->getTagName . " id=" . $_->getAttribute('id') . "\n";
+#}
+
+ @$list = map { $_->[1] } # 3) extract nodes
+ sort { $a->[0] cmp $b->[0] } # 2) sort by sortKey
+ map { [$_->xql_sortKey, $_] } # 1) make [sortKey,node] records
+ @$list;
+
+#print "after---\n";
+#for (@$list)
+#{
+# print "key=" . keyStr($_->xql_sortKey) . " node=" . $_->getTagName . " id=" . $_->getAttribute('id') . "\n";
+#}
+
+ $list;
+}
+
+# Converts sort key from createSortKey in human readable form
+# For debugging only.
+sub keyStr
+{
+ my $key = shift;
+ my $n = $BITS / 8;
+ my $bitn = 2 ** ($BITS - 1);
+ my $str;
+ for (my $i = 0; $i < length $key; $i += $n)
+ {
+ my $dig = substr ($key, $i, $n);
+ my $v = vec ($dig, 0, $BITS);
+ my $elem = 0;
+ if ($v >= $bitn)
+ {
+ $v -= $bitn;
+ $elem = 1;
+ }
+ $str .= "/" if defined $str;
+ $str .= "@" unless $elem;
+ $str .= $v;
+ }
+ $str;
+}
+
+sub isEmptyList
+{
+ my $list = shift;
+ (ref ($list) eq "ARRAY") && (@$list == 0);
+}
+
+# Used by Element and Attribute nodes
+sub buildNameSpaceExpr
+{
+ my ($nameSpace, $name) = @_;
+ $name = ".*" if $name eq "*";
+ if (defined $nameSpace)
+ {
+ $nameSpace = ".*" if $nameSpace eq "*";
+ "^$nameSpace:$name\$";
+ }
+ else
+ {
+ "^$name\$";
+ }
+}
+
+sub prepareForCompare
+{
+ my ($left, $right) = @_;
+ my $leftType = $left->xql_primType;
+ if ($leftType == 0) # Node
+ {
+ $left = $left->xql_value;
+ $leftType = $left->xql_primType;
+ }
+ my $rightType = $right->xql_primType;
+ if ($rightType == 0) # Node
+ {
+ $right = $right->xql_value;
+ $rightType = $right->xql_primType;
+ }
+ # Note: reverse the order if $leftType < $rightType
+ ($leftType < $rightType, $left, $right);
+}
+
+sub xql_eq
+{
+ my ($left, $right, $ignoreCase) = @_;
+ my $reverse;
+ ($reverse, $left, $right) = prepareForCompare ($left, $right);
+ $reverse ? $right->xql_eq ($left, $ignoreCase)
+ : $left->xql_eq ($right, $ignoreCase);
+}
+
+sub xql_ne
+{
+ my ($left, $right, $ignoreCase) = @_;
+ my $reverse;
+ ($reverse, $left, $right) = prepareForCompare ($left, $right);
+ $reverse ? $right->xql_ne ($left, $ignoreCase)
+ : $left->xql_ne ($right, $ignoreCase);
+}
+
+sub xql_lt
+{
+ my ($left, $right, $ignoreCase) = @_;
+ my $reverse;
+ ($reverse, $left, $right) = prepareForCompare ($left, $right);
+ $reverse ? $right->xql_ge ($left, $ignoreCase)
+ : $left->xql_lt ($right, $ignoreCase);
+}
+
+sub xql_le
+{
+ my ($left, $right, $ignoreCase) = @_;
+ my $reverse;
+ ($reverse, $left, $right) = prepareForCompare ($left, $right);
+ $reverse ? $right->xql_gt ($left, $ignoreCase)
+ : $left->xql_le ($right, $ignoreCase);
+}
+
+sub xql_gt
+{
+ my ($left, $right, $ignoreCase) = @_;
+ my $reverse;
+ ($reverse, $left, $right) = prepareForCompare ($left, $right);
+ $reverse ? $right->xql_le ($left, $ignoreCase)
+ : $left->xql_gt ($right, $ignoreCase);
+}
+
+sub xql_ge
+{
+ my ($left, $right, $ignoreCase) = @_;
+ my $reverse;
+ ($reverse, $left, $right) = prepareForCompare ($left, $right);
+ $reverse ? $right->xql_lt ($left, $ignoreCase)
+ : $left->xql_ge ($right, $ignoreCase);
+}
+
+sub xql_ieq { xql_eq (@_, 1); }
+sub xql_ine { xql_ne (@_, 1); }
+sub xql_ilt { xql_lt (@_, 1); }
+sub xql_igt { xql_gt (@_, 1); }
+sub xql_ige { xql_ge (@_, 1); }
+sub xql_ile { xql_le (@_, 1); }
+
+sub tput
+{
+ # Let me know if I need to add other systems for which 'tput' is not
+ # available.
+ if ($^O =~ /Win|MacOS/)
+ {
+ return undef;
+ }
+ else
+ {
+ my $c = shift;
+
+ # tput is only available on Unix systems.
+ # Calling `tput ...` on Windows generates warning messages
+ # that can not be suppressed.
+ return `tput $c`;
+ }
+}
+
+# Underline the query subexpression that fails (if tput exists)
+$ContextStart = tput ('smul') || ">>"; # smul: underline on
+$ContextEnd = tput ('rmul') || "<<"; # rmul: underline off
+# Used for making the significant keyword of a subexpression bold, e.g. "$and$"
+$BoldOn = tput ('bold') || "";
+$BoldOff = tput ('rmul') . tput ('smul') || "";
+# rmul reverts the string back to normal text, smul makes it underlined again,
+# so the rest of the subexpresion will be underlined.
+
+sub setErrorContextDelimiters
+{
+ ($ContextStart, $ContextEnd, $BoldOn, $BoldOff) = @_;
+}
+
+sub delim
+{
+ my ($str, $node, $contextNode) = @_;
+ if ($node == $contextNode)
+ {
+ $str =~ s/\016([^\017]*)\017/$BoldOn$1$BoldOff/g;
+ "$ContextStart$str$ContextEnd";
+ }
+ else
+ {
+ $str =~ s/\016([^\017]*)\017/$1/g;
+ $str;
+ }
+}
+
+sub bold
+{
+ my $x = shift;
+ "\016$x\017"; # arbitrary ASCII codes
+}
+
+sub parseError
+{
+ my ($msg) = @_;
+ print STDERR $msg . "\n";
+ croak $msg;
+}
+
+# Builtin XQL functions (may not appear after Bang "!")
+%Func =
+(
+ ancestor => \&XML::XQL::Func::ancestor,
+ attribute => \&XML::XQL::Func::attribute,
+ comment => \&XML::XQL::Func::comment,
+ element => \&XML::XQL::Func::element,
+ id => \&XML::XQL::Func::id,
+ node => \&XML::XQL::Func::node,
+ pi => \&XML::XQL::Func::pi,
+ textNode => \&XML::XQL::Func::textNode,
+ true => \&XML::XQL::Func::true,
+ false => \&XML::XQL::Func::false,
+
+# NOTE: date() is added with: use XML::XQL::Date;
+);
+
+# Builtin XQL methods (may appear after Bang "!")
+%Method =
+(
+ baseName => \&XML::XQL::Func::baseName,
+ count => \&XML::XQL::Func::count,
+ end => \&XML::XQL::Func::end,
+ 'index' => \&XML::XQL::Func::xql_index,
+ namespace => \&XML::XQL::Func::namespace,
+ nodeName => \&XML::XQL::Func::nodeName,
+ nodeType => \&XML::XQL::Func::nodeType,
+ nodeTypeString => \&XML::XQL::Func::nodeTypeString,
+ prefix => \&XML::XQL::Func::prefix,
+ text => \&XML::XQL::Func::text,
+ rawText => \&XML::XQL::Func::rawText,
+ value => \&XML::XQL::Func::value,
+);
+
+# Number of arguments for builtin XQL functions:
+# Value is either an integer or a range. Value is 0 if not specified.
+# Range syntax:
+#
+# range ::= '[' start ',' end [ ',' start ',' end ]* ']'
+# start ::= INTEGER
+# end ::= INTEGER | '-1' ('-1' means: "or more")
+#
+# Example: [2, 4, 7, 7, 10, -1] means (2,3,4,7,10,11,...)
+
+%FuncArgCount =
+(
+ ancestor => 1,
+ attribute => [0,1],
+ count => [0,1],
+# date => 1,
+ element => [0,1],
+ id => 1,
+ text => [0,1],
+ rawText => [0,1],
+);
+
+%AllowedOutsideSubquery =
+(
+ ancestor => 1,
+ attribute => 1,
+ comment => 1,
+ element => 1,
+ id => 1,
+ node => 1,
+ pi => 1,
+ textNode => 1,
+
+#?? what about subst etc.
+);
+
+# Functions that always return the same thing if their arguments are constant
+%ConstFunc =
+(
+ true => 1,
+ false => 1,
+# date => 1,
+);
+
+%ExpandedType =
+(
+ "boolean" => "XML::XQL::Boolean",
+ "text" => "XML::XQL::Text",
+ "number" => "XML::XQL::Number",
+ "date" => "XML::XQL::Date",
+ "node" => "XML::XQL::Node",
+);
+
+sub expandType
+{
+ my ($type) = @_;
+ # Expand "number" to "XML::XQL::Number" etc.
+ my $expanded = $ExpandedType{"\L$type"};
+ defined $expanded ? $expanded : $type;
+}
+
+sub defineExpandedTypes
+{
+ my (%args) = @_;
+ while (my ($key, $val) = each %args)
+ {
+ # Convert keys to lowercase
+ $ExpandedType{"\L$key"} = $val;
+ }
+}
+
+sub generateFunction
+{
+ my ($name, $funcName, $returnType, $argCount, $allowedOutsideSubquery,
+ $const, $queryArg) = @_;
+ $argCount = 0 unless defined $argCount;
+ $allowedOutsideSubquery = 1 unless defined $allowedOutsideSubquery;
+ $const = 0 unless defined $const;
+ $queryArg = 0 unless defined $queryArg;
+
+ $returnType = expandType ($returnType);
+ my $wrapperName = "xql_wrap_$name";
+ $wrapperName =~ s/\W/_/g; # replace colons etc.
+
+ my $func;
+ my $code = <<END_CODE;
+sub $wrapperName {
+ my (\$context, \$list, \@arg) = \@_;
+ for my \$i (0 .. \$#arg)
+ {
+ if (\$i == $queryArg)
+ {
+ \$arg[\$i] = XML::XQL::toList (\$arg[\$i]->solve (\$context, \$list));
+ }
+ else
+ {
+ \$arg[\$i] = XML::XQL::prepareRvalue (\$arg[\$i]->solve (\$context, \$list));
+ return [] if XML::XQL::isEmptyList (\$arg[\$i]);
+ \$arg[\$i] = \$arg[\$i]->xql_toString;
+ }
+ }
+END_CODE
+
+ if (ref ($argCount) eq "ARRAY" && @$argCount == 2 &&
+ $argCount->[0] == $argCount->[1])
+ {
+ $argCount = $argCount->[0];
+ }
+
+ if ($queryArg != -1)
+ {
+ $code .=<<END_CODE;
+ my \@result = ();
+ my \@qp = \@{\$arg[$queryArg]};
+ for (my \$k = 0; \$k < \@qp; \$k++)
+ {
+ \$arg[$queryArg] = \$qp[\$k]->xql_toString;
+END_CODE
+ }
+
+ if (ref ($argCount) ne "ARRAY")
+ {
+ $code .= " my \$result = $funcName (";
+ for my $i (0 .. $argCount-1)
+ {
+ $code .= ", " if $i;
+ $code .= "\$arg[$i]";
+ }
+ $code .= ");\n";
+ }
+ elsif (@$argCount == 2)
+ {
+ my ($start, $end) = ($argCount->[0], $argCount->[1]);
+ if ($end == -1)
+ {
+ $code .= " my \$result = $funcName (";
+ for my $i (0 .. ($start - 1))
+ {
+ $code .= ", " if $i;
+ $code .= "\$arg[$i]";
+ }
+ $code .= ", \@arg[" . $start . " .. \$#arg]);\n";
+ }
+ else
+ {
+ $code .= " my \$n = \@arg;\n my \$result;\n ";
+ for my $j ($argCount->[0] .. $argCount->[1])
+ {
+ $code .= " els" unless $j == $argCount->[0];
+ $code .= ($j == $argCount->[1] ? "e\n" :
+ "if (\$n == $j)\n");
+ $code .= " {\n \$result = $funcName (";
+ for my $i (0 .. $j-1)
+ {
+ $code .= ", " if $i;
+ $code .= "\$arg[$i]";
+ }
+ $code .= ");\n }\n";
+ }
+ }
+ }
+ else #?? what now...
+ {
+ $code .= " my \$result = $funcName (\@arg);\n";
+ }
+
+ if ($returnType eq "*") # return result as is
+ {
+ $code .= " \$result = [] unless defined \$result;\n";
+ }
+ else
+ {
+ $code .= " \$result = defined \$result ? new $returnType (\$result) : [];\n";
+ }
+
+ if ($queryArg == -1)
+ {
+ $code .= " \$result;\n}\n";
+ }
+ else
+ {
+ $code .= " push \@result, \$result;\n }\n \\\@result;\n}\n";
+ }
+ $code .= "\$func = \\\&$wrapperName;";
+
+#print "CODE=$code\n";
+
+ eval "$code";
+ if ($@) { croak "generateFunction failed for $funcName: $@\n"; }
+
+ defineFunction ($name, $func, $argCount,
+ $allowedOutsideSubquery, $const);
+}
+
+sub defineFunction
+{
+ my ($name, $func, $argCount, $allowedOutside, $const) = @_;
+ $Func{$name} = $func;
+ $FuncArgCount{$name} = $argCount;
+ $AllowedOutsideSubquery{$name} = 1 if $allowedOutside;
+ $ConstFunc{$name} = $const;
+}
+
+sub defineMethod
+{
+ my ($name, $func, $argCount, $allowedOutside) = @_;
+ $Method{$name} = $func;
+ $FuncArgCount{$name} = $argCount;
+ $AllowedOutsideSubquery{$name} = 1 if $allowedOutside;
+}
+
+%CompareOper =
+(
+ 'eq' => \&XML::XQL::xql_eq,
+ 'ne' => \&XML::XQL::xql_ne,
+ 'le' => \&XML::XQL::xql_le,
+ 'ge' => \&XML::XQL::xql_ge,
+ 'gt' => \&XML::XQL::xql_gt,
+ 'lt' => \&XML::XQL::xql_lt,
+
+ 'ieq' => \&XML::XQL::xql_ieq,
+ 'ine' => \&XML::XQL::xql_ine,
+ 'ile' => \&XML::XQL::xql_ile,
+ 'ige' => \&XML::XQL::xql_ige,
+ 'igt' => \&XML::XQL::xql_igt,
+ 'ilt' => \&XML::XQL::xql_ilt,
+
+ '=' => \&XML::XQL::xql_eq,
+ '!=' => \&XML::XQL::xql_ne,
+ '>' => \&XML::XQL::xql_gt,
+ '>=' => \&XML::XQL::xql_ge,
+ '<' => \&XML::XQL::xql_lt,
+ '<=' => \&XML::XQL::xql_le,
+);
+
+sub defineComparisonOperators
+{
+ my (%args) = @_;
+ %CompareOper = (%CompareOper, %args);
+}
+
+sub defineTokenQ
+{
+ $Token_q = $_[0];
+}
+
+sub defineTokenQQ
+{
+ $Token_qq = $_[0];
+}
+
+my %ElementValueType = ();
+my $ElementValueTypeCount = 0;
+
+sub elementValue
+{
+ my ($elem) = @_;
+
+#?? raw text/recursive ?
+
+ return new XML::XQL::Text ($elem->xql_text, $elem)
+ if $ElementValueTypeCount == 0; # user hasn't defined any types
+
+ my $tagName = $elem->xql_nodeName;
+ my $func = $ElementValueType{$tagName};
+ return new XML::XQL::Text ($elem->xql_text, $elem) unless defined $func;
+
+ &$func ($elem, $tagName);
+}
+
+sub defineElementValueConvertor
+{
+ my ($elemTagName, $func) = @_;
+ my $prev = defined $ElementValueType{$elemTagName};
+ $ElementValueType{$elemTagName} = $func;
+ if (defined $func != $prev)
+ {
+ defined $func ? $ElementValueTypeCount++ : $ElementValueTypeCount--;
+ }
+}
+
+my %AttrValueType = ();
+my $AttrValueTypeCount = 0;
+
+sub attrValue
+{
+ my ($attr) = @_;
+
+#?? raw text/recursive ?
+ return new XML::XQL::Text ($attr->xql_text, $attr)
+ if $AttrValueTypeCount == 0; # user hasn't defined any types
+
+ my $elem = $attr->xql_parent->xql_nodeName;
+ my $attrName = $attr->xql_nodeName;
+ my $func = $AttrValueType{"$elem $attrName"};
+
+ if (not defined $func)
+ {
+ $elem = "*";
+ $func = $AttrValueType{"$elem $attrName"};
+ }
+ return new XML::XQL::Text ($attr->xql_text, $attr) unless defined $func;
+
+ &$func ($attr, $attrName, $elem);
+}
+
+sub defineAttrValueConvertor
+{
+ my ($elemTagName, $attrName, $type) = @_;
+ my $both = "$elemTagName $attrName";
+
+ my $prev = defined $AttrValueType{$both};
+ $AttrValueType{$both} = $type;
+ if (defined $type != $prev)
+ {
+ defined $type ? $AttrValueTypeCount++ : $AttrValueTypeCount--;
+ }
+}
+
+#=== debug
+
+sub exception
+{
+ my ($ex) = @_;
+ print "Exception: $ex\n" if $ex;
+ $ex;
+}
+
+sub d
+{
+ my $n = shift;
+ my $type = ref $n;
+
+ if ($type eq "ARRAY")
+ {
+ my $str = "";
+ for my $i (@$n)
+ {
+ $str .= ", " unless $str eq "";
+ $str .= d ($i);
+ }
+ return "[$str]";
+ }
+ elsif ($type eq "HASH")
+ {
+ my $str = "";
+ while (my ($key, $val) = %$n)
+ {
+ $str .= ", " unless $str eq "";
+ $str .= $key . " => " . d ($val);
+ }
+ return "{$str}";
+ }
+ elsif ($type)
+ {
+ return $n->xql_contextString if ($n->isa ('XML::XQL::Operator'));
+ return "${type}\[" . $n->xql_toString . "]" if $n->isa ('XML::XQL::PrimitiveType');
+# return "${type}\[" . $n->toString . "]" if $n->isa ('XML::DOM::Element');
+ }
+ $n;
+}
+
+
+package XML::XQL::Query;
+
+use Carp;
+use XML::XQL::Parser;
+
+use vars qw( %Func %FuncArgCount );
+
+my $parser = new XML::XQL::Parser;
+
+# This is passed as 'yyerror' to YYParse
+sub Error
+{
+ my($parser) = shift;
+
+ print STDERR "Error in Query Expression near: " . $parser->YYData->{INPUT} . "\n";
+}
+
+sub defineFunction
+{
+ my ($self, $name, $func, $argCount, $allowedOutside, $const) = @_;
+ $self->{Func}->{$name} = $func;
+ $self->{FuncArgCount}->{$name} = $argCount;
+ $self->{AllowedOutsideSubquery}->{$name} = 1 if $allowedOutside;
+ $self->{ConstFunc} = $const;
+}
+
+sub defineMethod
+{
+ my ($self, $name, $func, $argCount, $allowedOutside) = @_;
+ $self->{Method}->{$name} = $func;
+ $self->{FuncArgCount}->{$name} = $argCount;
+ $self->{AllowedOutsideSubquery}->{$name} = 1 if $allowedOutside;
+}
+
+sub defineComparisonOperators
+{
+ my ($self, %args) = @_;
+ $self->{CompareOper} = \%args;
+}
+
+sub defineTokenQ
+{
+ $_[0]->{'q'} = $_[1];
+}
+
+sub defineTokenQQ
+{
+ $_[0]->{'qq'} = $_[1];
+}
+
+sub new
+{
+ my ($class, %args) = @_;
+
+ croak "no Expr specified" unless defined $args{Expr};
+
+ my $self = bless \%args, $class;
+
+ my $error = $self->{'Error'} || \&XML::XQL::Query::Error;
+ my $debug = defined ($self->{Debug}) ? $self->{Debug} : 0; # 0x17;
+
+ $self->{'q'} = $XML::XQL::Token_q unless exists $self->{'q'};
+ $self->{'qq'} = $XML::XQL::Token_qq unless exists $self->{'qq'};
+
+ # Invoke the query expression parser
+ $parser->YYData->{INPUT} = $self->{Expr};
+ $parser->{Query} = $self;
+ $self->{Tree} = $parser->YYParse (yylex => \&XML::XQL::Lexer,
+ yyerror => $error,
+ yydebug => $debug);
+
+ # Nothing but whitespace should be left over
+ if ($parser->YYData->{INPUT} !~ /^\s*$/)
+ {
+ XML::XQL::parseError ("Error when parsing expression. Unexpected characters at end of expression [" . $parser->YYData->{INPUT} . "]")
+ }
+
+ XML::XQL::parseError ("Error when parsing expression")
+ unless defined $self->{Tree};
+
+ $self->{Tree}->{Query} = $self;
+ $self->{Tree}->xql_check (0, 0); # inSubQuery=0, inParam=0
+
+ print "Expression parsed successfully\n" if $debug;
+
+ $self;
+}
+
+sub dispose
+{
+ my $self = shift;
+
+ undef $self->{Tree}->{Query};
+
+ $self->{Tree}->dispose;
+ delete $self->{Tree};
+}
+
+sub isNodeQuery
+{
+ $_[0]->{NodeQuery};
+}
+
+sub solve
+{
+ my ($self, @list) = @_;
+ my $context = undef;
+
+ # clear cached "once" values
+ $self->{Tree}->xql_prepCache;
+ my $result = $self->{Tree}->solve ($context, \@list);
+ ref ($result) eq "ARRAY" ? @$result : ($result);
+}
+
+sub toString
+{
+ $_[0]->{Expr};
+}
+
+sub toDOM
+{
+ my ($self, $doc) = @_;
+ my $root = $doc->createElement ("XQL");
+ $doc->appendChild ($root);
+ $root->appendChild ($self->{Tree}->xql_toDOM ($doc));
+ $doc;
+}
+
+sub findComparisonOperator
+{
+ my ($self, $name) = @_;
+ my $cmp;
+ if (exists $self->{CompareOper}->{$name})
+ {
+ $cmp = $self->{CompareOper}->{$name};
+ }
+ else
+ {
+ $cmp = $XML::XQL::CompareOper{$name};
+ }
+ if (not defined $cmp)
+ {
+ XML::XQL::parseError ("undefined comparison operator '$name'");
+ }
+ $cmp;
+}
+
+# Return function pointer. Croak if wrong number of arguments.
+sub findFunctionOrMethod
+{
+ my ($self, $name, $args) = @_;
+
+ my $func;
+ my $type = "function";
+ if (exists $self->{Func}->{$name})
+ {
+ $func = $self->{Func}->{$name};
+ }
+ elsif (exists $self->{Method}->{$name})
+ {
+ $func = $self->{Method}->{$name};
+ $type = "method";
+ }
+ elsif (defined $XML::XQL::Func{$name})
+ {
+ $func = $XML::XQL::Func{$name};
+ }
+ elsif (defined $XML::XQL::Method{$name})
+ {
+ $func = $XML::XQL::Method{$name};
+ $type = "method";
+ }
+ elsif (not $XML::XQL::Restricted)
+ {
+ $func = XML::XQL::generatePerlWrapper ($name);
+ }
+
+ XML::XQL::parseError ("undefined function/method '$name' in query '" .
+ $self->toString . "'")
+ unless defined &$func;
+
+ my $funcArgCount = $self->{FuncArgCount}->{$name}
+ || $XML::XQL::FuncArgCount{$name} || 0;
+
+ # Check number of args
+ my $nargs = @$args;
+
+#print "$args " . XML::XQL::d($args) . "\n";
+
+ my $ok = 0;
+ if (ref ($funcArgCount) eq "ARRAY")
+ {
+ my $i = 0;
+ my $n = @$funcArgCount;
+ while ($i < $n)
+ {
+ my $s = $funcArgCount->[$i++];
+ my $e = $funcArgCount->[$i++] || $s; # same as $s if odd #args
+ if ($nargs >= $s && ($e == -1 || $nargs <= $e))
+ {
+ $ok = 1; # found it
+ last;
+ }
+ }
+ }
+ else
+ {
+ $ok = ($nargs eq $funcArgCount);
+ }
+
+ XML::XQL::parseError ("wrong number of args ($nargs) for $type $name in query '" .
+ $self->toString . "', it should be " . XML::XQL::d($funcArgCount))
+ if not $ok;
+
+ return ($func, $type);
+}
+
+sub isAllowedOutsideSubquery
+{
+ my ($self, $funcName) = @_;
+ my ($ok) = $self->{AllowedOutsideSubquery}->{$funcName};
+ return $ok if defined $ok;
+ $XML::XQL::AllowedOutsideSubquery{$funcName};
+}
+
+package XML::XQL::Operator;
+use fields qw{ Left Right Parent };
+
+sub new
+{
+ my ($class, %attr) = @_;
+ my $self = bless \%attr, $class;
+
+ $self->{Left}->setParent ($self) if defined $self->{Left};
+ $self->{Right}->setParent ($self) if defined $self->{Right};
+
+ $self;
+}
+
+sub dispose
+{
+ my $self = shift;
+ if (defined ($self->{Left}))
+ {
+ $self->{Left}->dispose;
+ undef $self->{Left};
+ }
+ if (defined ($self->{Right}))
+ {
+ $self->{Right}->dispose;
+ undef $self->{Right};
+ }
+
+ undef $self->{Parent};
+}
+
+sub xql_check
+{
+ my ($self, $inSubQuery, $inParam) = @_;
+ $self->{Left}->xql_check ($inSubQuery, $inParam);
+ $self->{Right}->xql_check ($inSubQuery, $inParam) if defined $self->{Right};
+}
+
+sub xql_prepCache
+{
+ my ($self) = @_;
+ $self->{Left}->xql_prepCache;
+ $self->{Right}->xql_prepCache if defined $self->{Right};
+}
+
+sub xql_toDOM
+{
+ my ($self, $doc) = @_;
+ my $name = ref $self;
+ $name =~ s/.*:://;
+ my $elem = $doc->createElement ($name);
+ if (defined $self->{Left})
+ {
+ my $left = $doc->createElement ("left");
+ $elem->appendChild ($left);
+ $left->appendChild ($self->{Left}->xql_toDOM ($doc));
+ }
+ if (defined $self->{Right})
+ {
+ my $right = $doc->createElement ("right");
+ $elem->appendChild ($right);
+ $right->appendChild ($self->{Right}->xql_toDOM ($doc));
+ }
+ $elem;
+}
+
+sub isConstant
+{
+ 0;
+}
+
+# Overriden by Union and Path operators
+sub mustSort
+{
+ 0;
+}
+
+sub setParent
+{
+ $_[0]->{Parent} = $_[1];
+}
+
+sub warning
+{
+ my ($self, $msg) = @_;
+ print STDERR "WARNING: $msg";
+ print STDERR " Context: " . $self->toContextString . "\n";
+}
+
+sub root
+{
+ my ($self) = @_;
+ my $top = $self;
+
+ while (defined ($top->{Parent}))
+ {
+ $top = $top->{Parent};
+ }
+ $top;
+}
+
+sub query
+{
+ $_[0]->root->{Query};
+}
+
+sub toContextString
+{
+ my ($self) = @_;
+ $self->root->xql_contextString ($self);
+}
+
+sub debugString
+{
+ my ($self) = @_;
+ my $str = "[" . ref($self);
+ while (my ($key, $val) = each %$self)
+ {
+ $str .= "$key=>" . XML::XQL::d($val);
+ }
+ $str . "]";
+}
+
+sub verbose
+{
+ my ($self, $str, $list) = @_;
+# print STDERR "$self - $str: " . XML::XQL::d($list) . "\n";
+ $list;
+}
+
+package XML::XQL::Root; # "/" at start of XQL expression
+use base 'XML::XQL::Operator'; # L -> L
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ return [] if (@$list < 1);
+
+#?? what if first value is not a XML::XQL::Node? should we try the second one?
+ [$list->[0]->xql_document];
+}
+#?? add isOnce here?
+
+sub xql_check
+{
+}
+
+sub xql_prepCache
+{
+}
+
+sub xql_contextString
+{
+ XML::XQL::delim ("/", @_);
+}
+
+package XML::XQL::Path;
+use base 'XML::XQL::Operator'; # L -> L
+use fields qw{ PathOp };
+
+sub new
+{
+ my ($class, %arg) = @_;
+ my $self = bless \%arg, $class;
+
+ $self->{Left} ||= new XML::XQL::Root;
+
+ $self->{Left}->setParent ($self);
+ $self->{Right}->setParent ($self);
+
+ $self;
+}
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ $list = $self->{Left}->solve ($context, $list);
+ $self->verbose ("left", $list);
+
+ return $list if @$list < 1;
+
+ if ($self->{PathOp} eq '/')
+ {
+ $self->verbose ("result", $self->{Right}->solve ($context, $list));
+ }
+ else # recurse "//"
+ {
+ my $new_list = [];
+ my $n = @$list;
+ NODE: for (my $i = 0; $i < $n; $i++)
+ {
+ my $node = $list->[$i];
+ # Node must be an Element or must be allowed to contain Elements
+ # i.e. must be an Element or a Document
+ # (DocumentFragment is not expected here)
+ my $nodeType = $node->xql_nodeType;
+ next NODE unless ($nodeType == 1 || $nodeType == 9);
+
+ # Skip the node if one of its ancestors is part of the input $list
+ # (and therefore already processed)
+ my $parent = $node->xql_parent;
+ while (defined $parent)
+ {
+ for (my $j = $i - 1; $j >= 0; $j--)
+ {
+ next NODE if ($parent == $list->[$j]);
+ }
+ $parent = $parent->xql_parent;
+ }
+ recurse ($node, $new_list);
+ }
+
+ my $results = $self->{Right}->solve ($context, $new_list);
+
+ # Sort the result list unless the parent Operator will sort
+ my $parent = $self->{Parent};
+ XML::XQL::sortDocOrder ($results)
+ unless defined ($parent) and $parent->mustSort;
+
+ $self->verbose ("result //", $results);
+ }
+}
+
+sub mustSort
+{
+ $_[0]->{PathOp} eq '//';
+}
+
+sub recurse
+{
+ my ($node, $list) = @_;
+ push @$list, $node;
+ for my $kid (@{$node->xql_element})
+ {
+ recurse ($kid, $list);
+ }
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+
+ my $str = $self->{Left}->isa ('XML::XQL::Root') ?
+ "" : $self->{Left}->xql_contextString (@_);
+
+ XML::XQL::delim ($str . XML::XQL::bold($self->{PathOp}) .
+ $self->{Right}->xql_contextString (@_), $self, @_);
+}
+
+sub xql_toDOM
+{
+ my ($self, $doc) = @_;
+ my $elem = $self->SUPER::xql_toDOM ($doc);
+ $elem->setAttribute ("pathOp", $self->{PathOp});
+ $elem;
+}
+
+package XML::XQL::Sequence; # "elem;elem" or "elem;;elem"
+use base 'XML::XQL::Operator'; # L -> L
+use fields qw{ Oper };
+
+# See "The Design of XQL" by Jonathan Robie
+# <URL:http://www.texcel.no/whitepapers/xql-design.html>
+# for definition of Sequence operators.
+
+# Note that the "naive" implementation slows things down quite a bit here...
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my $left = $self->{Left}->solve ($context, $list);
+ $self->verbose ("left", $left);
+ return [] unless @$left;
+
+ my $right = $self->{Right}->solve ($context, $list);
+ $self->verbose ("right", $right);
+ return [] unless @$right;
+
+ my @result;
+ if ($self->{Oper} eq ';') # immediately precedes
+ {
+ my %hleft; @hleft{@$left} = (); # initialize all values to undef
+ my %pushed;
+
+ for my $r (@$right)
+ {
+ # Find previous sibling that is not a text node that has only
+ # whitespace that can be ignored (because xml:space=preserve)
+ my $prev = $r->xql_prevNonWS;
+ # $prev must be defined and must exist in $left
+ next unless $prev and exists $hleft{$prev};
+
+ # Filter duplicates (no need to sort afterwards)
+ push @result, $prev unless $pushed{$prev}++;
+ push @result, $r unless $pushed{$r}++;
+ }
+ }
+ else # oper eq ';;' (i.e. precedes)
+ {
+ my %pushed;
+
+ for my $r (@$right)
+ {
+ for my $l (@$left)
+ {
+ # If left node precedes right node, add them
+ if ($l->xql_sortKey lt $r->xql_sortKey)
+ {
+ # Filter duplicates
+ push @result, $l unless $pushed{$l}++;
+ push @result, $r unless $pushed{$r}++;
+ }
+ }
+
+#?? optimize - left & right are already sorted...
+ # sort in document order
+ XML::XQL::sortDocOrder (\@result) if @result;
+ }
+ }
+ \@result;
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ XML::XQL::delim ($self->{Left}->xql_contextString (@_) .
+ XML::XQL::bold($self->{Oper}) .
+ $self->{Right}->xql_contextString (@_), $self, @_);
+}
+
+package XML::XQL::Current; # "."
+use base 'XML::XQL::Operator'; # L -> L
+
+sub xql_check
+{
+}
+
+sub xql_prepCache
+{
+}
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ $list;
+}
+
+sub xql_contextString
+{
+ XML::XQL::delim (".", @_);
+}
+
+package XML::XQL::Parent; # ".."
+use base 'XML::XQL::Operator';
+
+sub xql_check
+{
+}
+
+sub xql_prepCache
+{
+}
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my @result = ();
+ for my $node (@$list)
+ {
+ push @result, $node->xql_parent;
+ }
+ \@result;
+}
+
+sub xql_contextString
+{
+ XML::XQL::delim ("..", @_);
+}
+
+package XML::XQL::Element; # "elem"
+use base 'XML::XQL::Operator'; # L -> L
+use fields qw{ Name NameSpace Expr };
+
+sub new
+{
+ my ($class, %args) = @_;
+ if (not defined ($args{NameSpace}))
+ {
+ if ($args{Name} eq "*")
+ {
+ return bless \%args, 'XML::XQL::AllElements';
+ }
+ else
+ {
+ return bless \%args, 'XML::XQL::SimpleElement';
+ }
+ }
+
+ $args{Expr} = XML::XQL::buildNameSpaceExpr ($args{NameSpace},
+ $args{Name});
+ bless \%args, $class;
+}
+
+sub xql_check
+{
+}
+
+sub xql_prepCache
+{
+}
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my @result = ();
+
+ my $expr = $self->{Expr};
+ for my $node (@$list)
+ {
+ for my $kid (@{$node->xql_element})
+ {
+ push @result, $kid if $kid->xql_nodeName =~ /$expr/;
+ }
+ }
+ \@result;
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ my $name = $self->{Name};
+ my $space = $self->{NameSpace};
+
+ my $str = defined($space) ? "$space:$name" : $name;
+
+ XML::XQL::delim ($str, $self, @_);
+}
+
+sub xql_toDOM
+{
+ my ($self, $doc) = @_;
+ my $elem = $self->SUPER::xql_toDOM ($doc);
+
+ my $name = $self->{Name};
+ my $space = $self->{NameSpace};
+ my $str = defined($space) ? "$space:$name" : $name;
+
+ $elem->setAttribute ("name", $str);
+ $elem;
+}
+
+package XML::XQL::SimpleElement; # "elem"
+use base 'XML::XQL::Element'; # L -> L
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my @result = ();
+ my $name = $self->{Name};
+
+ for my $node (@$list)
+ {
+ push @result, @{ $node->xql_element ($name) };
+ }
+ \@result;
+}
+
+package XML::XQL::AllElements; # "*"
+use base 'XML::XQL::Element'; # L -> L
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my @result = ();
+
+ for my $node (@$list)
+ {
+ push @result, @{$node->xql_element};
+ }
+ \@result;
+}
+
+package XML::XQL::Attribute; # "@attr"
+use base 'XML::XQL::Operator'; # L -> L of Attributes
+use fields qw{ Name NameSpace Expr };
+
+sub new
+{
+ my ($class, %args) = @_;
+
+ if (not defined ($args{NameSpace}))
+ {
+ if ($args{Name} eq "*")
+ {
+ return bless \%args, 'XML::XQL::AllAttr';
+ }
+ else
+ {
+ return bless \%args, 'XML::XQL::SimpleAttr';
+ }
+ }
+
+ $args{Expr} = XML::XQL::buildNameSpaceExpr ($args{NameSpace},
+ $args{Name});
+ bless \%args, $class;
+}
+
+sub xql_check
+{
+}
+
+sub xql_prepCache
+{
+}
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my @result = ();
+
+ my $expr = $self->{Expr};
+ for my $node (@$list)
+ {
+ for my $kid (@{$node->xql_attribute})
+ {
+ push @result, $kid if $kid->xql_nodeName =~ /$expr/;
+ }
+ }
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ my $name = $self->{Name};
+ my $space = $self->{NameSpace};
+
+ my $str = defined($space) ? "\@$space:$name" : ('@' . $name);
+
+ XML::XQL::delim ($str, $self, @_);
+}
+
+package XML::XQL::SimpleAttr; # "@attr"
+use base 'XML::XQL::Attribute'; # L -> L
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my @result = ();
+ my $name = $self->{Name};
+
+ for my $node (@$list)
+ {
+ push @result, @{ $node->xql_attribute ($name) };
+ }
+ \@result;
+}
+
+package XML::XQL::AllAttr; # "@*"
+use base 'XML::XQL::Attribute'; # L -> L
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my @result = ();
+
+ for my $node (@$list)
+ {
+ push @result, @{$node->xql_attribute};
+ }
+ \@result;
+}
+
+package XML::XQL::Subscript; # "[3, 5 $to$ 7, -1]"
+use base 'XML::XQL::Operator'; # L -> L
+use fields qw{ IndexList };
+
+#?? optimize for simple subscripts
+sub solve
+{
+ my ($self, $context, $inlist) = @_;
+ my @result = ();
+
+ for my $node (@$inlist)
+ {
+
+ my $list = $self->{Left}->solve ($context, [$node]);
+ $self->verbose("Left", $list);
+
+ my $n = int (@$list);
+ next if ($n == 0);
+
+ # build ordered index list
+ my @indexFlags = ();
+ $#indexFlags = $n - 1;
+
+ my $index = $self->{IndexList};
+ my $len = @$index;
+
+#?? this is done a lot - optimize....
+ my $i = 0;
+ while ($i < $len)
+ {
+ my $start = $index->[$i++];
+ $start += $n if ($start < 0);
+ my $end = $index->[$i++];
+ $end += $n if ($end < 0);
+
+ next unless $start <= $end && $end >=0 && $start < $n;
+ $start = 0 if ($start < 0);
+ $end = $n-1 if ($end >= $n);
+
+ for my $j ($start .. $end)
+ {
+ $indexFlags[$j] = 1;
+ }
+ }
+ for $i (0 .. $n-1)
+ {
+ push @result, $list->[$i] if $indexFlags[$i];
+ }
+ }
+ \@result;
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+
+ my $index = $self->{IndexList};
+ my $str = XML::XQL::bold("[");
+ for (my $i = 0; $i < @$index; $i++)
+ {
+ $str .= ", " if $i > 0;
+
+ my $s = $index->[$i++];
+ my $e = $index->[$i];
+ $str = ($s == $e) ? $s : "$s \$to\$ $e";
+ }
+ $str .= XML::XQL::bold("]");
+
+ XML::XQL::delim ($self->{Left}->xql_contextString (@_) . $str, $self, @_);
+}
+
+sub xql_toDOM
+{
+ my ($self, $doc) = @_;
+ my $elem = $self->SUPER::xql_toDOM ($doc);
+
+ my $index = $self->{IndexList};
+ my $str = "";
+ for (my $i = 0; $i < @$index; $i++)
+ {
+ $str .= ", " if $i > 0;
+
+ my $s = $index->[$i++];
+ my $e = $index->[$i];
+ $str .= ($s == $e) ? $s : "$s \$to\$ $e";
+ }
+
+ my $ie = $doc->createElement ("index");
+ $ie->setAttribute ("list", $str);
+ $elem->appendChild ($ie);
+ $elem;
+}
+
+package XML::XQL::Union; # "book $union$ magazine", also "|"
+use base 'XML::XQL::Operator'; # L x L -> L
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my $left = XML::XQL::toList ($self->{Left}->solve ($context, $list));
+ my $right = XML::XQL::toList ($self->{Right}->solve ($context, $list));
+
+ return $right if (@$left < 1);
+ return $left if (@$right < 1);
+
+ my @result = @$left;
+ for my $node (@$right)
+ {
+ push @result, $node unless XML::XQL::listContains ($left, $node);
+ }
+
+ my $parent = $self->{Parent};
+
+ # Don't sort if parent is a Union or //, because the parent will do the sort
+ unless (defined $parent and $parent->mustSort)
+ {
+ XML::XQL::sortDocOrder (\@result)
+ }
+# $self->verbose ("Union result", \@result);
+
+ \@result;
+}
+
+sub mustSort
+{
+ 1;
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ XML::XQL::delim ($self->{Left}->xql_contextString (@_) .
+ XML::XQL::bold (" \$union\$ ") .
+ $self->{Right}->xql_contextString (@_), $self, @_);
+}
+
+package XML::XQL::Intersect; # "book $intersect$ magazine"
+use base 'XML::XQL::Operator'; # L x L -> L
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my $left = XML::XQL::toList ($self->{Left}->solve ($context, $list));
+ return [] if @$left < 1;
+
+ my $right = XML::XQL::toList ($self->{Right}->solve ($context, $list));
+ return [] if @$right < 1;
+
+ # Assumption: $left and $right don't have duplicates themselves
+ my @result = ();
+ for my $node (@$left)
+ {
+#? reimplement with hash - faster!
+ push @result, $node if XML::XQL::listContains ($right, $node);
+ }
+ \@result;
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ XML::XQL::delim ($self->{Left}->xql_contextString (@_) .
+ XML::XQL::bold (" \$intersect\$ ") .
+ $self->{Right}->xql_contextString (@_), $self, @_);
+}
+
+package XML::XQL::Filter; # "elem[expr]"
+use base 'XML::XQL::Operator'; # L -> L
+
+sub solve
+{
+ my ($self, $context, $inlist) = @_;
+ my @result = ();
+
+ for my $node (@$inlist)
+ {
+
+ my $list = $self->{Left}->solve ($context, [$node]);
+ next if @$list == 0;
+
+ my $subQuery = $self->{Right};
+
+ $context = [0, scalar (@$list)];
+ for my $node (@$list)
+ {
+#?? optimize? only need the first one to succeed
+ my $r = $subQuery->solve ($context, [ $node ]);
+ push @result, $node if XML::XQL::toBoolean ($r);
+ $context->[0]++; # increase the index for the index() method
+ }
+ }
+ \@result;
+}
+
+sub xql_check
+{
+ my ($self, $inSubQuery, $inParam) = @_;
+ $self->{Left}->xql_check ($inSubQuery, $inParam);
+ $self->{Right}->xql_check (1, $inParam);
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ XML::XQL::delim ($self->{Left}->xql_contextString (@_) .
+ XML::XQL::bold ("[") .
+ $self->{Right}->xql_contextString (@_) .
+ XML::XQL::bold ("]"), $self, @_);
+}
+
+package XML::XQL::BooleanOp;
+use base 'XML::XQL::Operator';
+
+package XML::XQL::Or;
+use base 'XML::XQL::BooleanOp';
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my $left = $self->{Left}->solve ($context, $list);
+ return $XML::XQL::Boolean::TRUE if XML::XQL::toBoolean ($left);
+ return $self->{Right}->solve ($context, $list);
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ XML::XQL::delim ($self->{Left}->xql_contextString (@_) .
+ XML::XQL::bold (" \$or\$ ") .
+ $self->{Right}->xql_contextString (@_), $self, @_);
+}
+
+package XML::XQL::And;
+use base 'XML::XQL::BooleanOp';
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my $left = $self->{Left}->solve ($context, $list);
+ return $XML::XQL::Boolean::FALSE unless XML::XQL::toBoolean ($left);
+ return $self->{Right}->solve ($context, $list);
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ XML::XQL::delim ($self->{Left}->xql_contextString (@_) .
+ XML::XQL::bold (" \$and\$ ") .
+ $self->{Right}->xql_contextString (@_), $self, @_);
+}
+
+package XML::XQL::Not;
+use base 'XML::XQL::BooleanOp';
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ my $left = $self->{Left}->solve ($context, $list);
+ return XML::XQL::toBoolean ($left) ? $XML::XQL::Boolean::FALSE : $XML::XQL::Boolean::TRUE;
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ XML::XQL::delim (XML::XQL::bold ("\$not\$ ") .
+ $self->{Left}->xql_contextString (@_), $self, @_);
+}
+
+package XML::XQL::Compare;
+use base 'XML::XQL::Operator';
+use fields qw{ Func All };
+
+use Carp;
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+
+ my $type;
+ my $cmpFunc = $self->{Func};
+
+ my $left = $self->verbose ("left", XML::XQL::toList ($self->{Left}->solve ($context, $list)));
+ return [] if @$left < 1;
+
+ my $right;
+ eval {
+ $right = $self->verbose ("right", XML::XQL::prepareRvalue ($self->{Right}->solve ($context, $list)));
+ };
+ return [] if XML::XQL::exception ($@);
+
+ if ($self->{All})
+ {
+ for my $node (@$left)
+ {
+ eval {
+ # Stop if any of the comparisons fails
+ return [] unless &$cmpFunc ($node, $right);
+ };
+ return [] if XML::XQL::exception ($@);
+ }
+ return $left;
+ }
+ else # $any$
+ {
+ my @result = ();
+ for my $node (@$left)
+ {
+ eval {
+ push (@result, $node)
+ if &$cmpFunc ($node, $right);
+ };
+ return [] if XML::XQL::exception ($@);
+ }
+ return \@result;
+ }
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ my $all = $self->{All} ? "\$all\$ " : "";
+
+ XML::XQL::delim ($all . $self->{Left}->xql_contextString (@_) . " " .
+ XML::XQL::bold ($self->{Oper}) . " " .
+ $self->{Right}->xql_contextString (@_), $self, @_);
+}
+
+package XML::XQL::Func;
+
+use Carp;
+
+sub count
+{
+ my ($context, $list, $expr) = @_;
+
+ my $cnt;
+ if (defined $expr)
+ {
+ $list = XML::XQL::toList ($expr->solve ($context, $list));
+ $cnt = @$list;
+ }
+ else
+ {
+ $cnt = $context->[1];
+ }
+#?? ref node?
+ new XML::XQL::Number ($cnt);
+}
+
+sub id
+{
+ my ($context, $list, $query) = @_;
+
+ return [] if @$list == 0;
+
+ my $id = XML::XQL::prepareRvalue ($query->solve ($context, $list));
+#?? check result?
+
+#?? if [0] is not a Node, I should probably try the next one
+ my $doc = $list->[0]->xql_document;
+
+ _findId ($doc->xql_element->[0], $id);
+}
+
+sub _findId # static method
+{
+ my ($elem, $id) = @_;
+ my $attr = $elem->xql_attribute ("id");
+ return [$elem] if (@$attr == 1 && $attr->[0]->xql_nodeName eq $id);
+
+ for my $kid (@{$elem->xql_element})
+ {
+ $attr = _findId ($kid);
+ return $attr if @$attr;
+ }
+ return [];
+}
+
+sub end
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+ new XML::XQL::Boolean ($context->[0] == $context->[1] - 1);
+}
+
+sub xql_index
+{
+ my ($context, $list) = @_;
+
+# print "index: " . XML::XQL::d($context) . "\n";
+#?? wrong!
+ return [] if @$list == 0;
+ new XML::XQL::Number ($context->[0]);
+}
+
+sub ancestor
+{
+ my ($context, $list, $query) = @_;
+
+ return [] if @$list == 0;
+
+ my @anc = ();
+#?? fix for @$list > 1
+ my $parent = $list->[0]->xql_parent;
+
+ while (defined $parent)
+ {
+ # keep list of ancestors so far
+ unshift @anc, $parent;
+
+ # solve the query for the ancestor
+ my $result = $query->solve ($context, [$parent]);
+ for my $node (@{$result})
+ {
+ for my $anc (@anc)
+ {
+ return [$node] if $node == $anc;
+ }
+ }
+ $parent = $parent->xql_parent;
+ }
+ return [];
+}
+
+sub node
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+ return $list->[0]->xql_node if @$list == 1;
+
+ my @result;
+ for my $node (@$list)
+ {
+ push @result, @{ $node->xql_node };
+ }
+ XML::XQL::sortDocOrder (\@result);
+}
+
+sub _nodesByType
+{
+ my ($list, $type) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ for my $node (@$list)
+ {
+ for my $kid (@{ $node->xql_node })
+ {
+ push @result, $kid if $kid->xql_nodeType == $type;
+ }
+ }
+ @$list > 1 ? XML::XQL::sortDocOrder (\@result) : \@result;
+}
+
+sub pi
+{
+ my ($context, $list, $pi_name) = @_;
+ if (defined $pi_name)
+ {
+ return [] if @$list == 0;
+
+ $pi_name = $pi_name->solve ($context, $list)->xql_toString;
+
+ my @result;
+ for my $node (@$list)
+ {
+ for my $kid (@{ $node->xql_node })
+ {
+ push @result, $kid
+ if $kid->xql_nodeType == 7 && $kid->getTarget eq $pi_name;
+ }
+ }
+ return @$list > 1 ? XML::XQL::sortDocOrder (\@result) : \@result;
+ }
+
+ return _nodesByType ($_[1], 7);
+}
+
+sub comment
+{
+ _nodesByType ($_[1], 8);
+}
+
+sub textNode
+{
+ _nodesByType ($_[1], 3);
+}
+
+sub nodeName
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ for my $node (@$list)
+ {
+ push @result, new XML::XQL::Text ($node->xql_nodeName, $node);
+ }
+ \@result;
+}
+
+sub namespace
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ for my $node (@$list)
+ {
+ my $namespace = $node->xql_namespace;
+ next unless defined $namespace;
+ push @result, new XML::XQL::Text ($namespace, $node);
+ }
+ \@result;
+}
+
+sub prefix
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ for my $node (@$list)
+ {
+ my $prefix = $node->xql_prefix;
+ next unless defined $prefix;
+ push @result, new XML::XQL::Text ($prefix, $node);
+ }
+ \@result;
+}
+
+sub baseName
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ for my $node (@$list)
+ {
+ my $basename = $node->xql_baseName;
+ next unless defined $basename;
+ push @result, new XML::XQL::Text ($basename, $node);
+ }
+ \@result;
+}
+
+sub nodeType
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ for my $node (@$list)
+ {
+ push @result, new XML::XQL::Number ($node->xql_nodeType, $node);
+ }
+ \@result;
+}
+
+sub nodeTypeString
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ for my $node (@$list)
+ {
+ push @result, new XML::XQL::Text ($node->xql_nodeTypeString, $node);
+ }
+ @result;
+}
+
+sub value
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ for my $node (@$list)
+ {
+ push @result, $node->xql_value; # value always returns an object
+ }
+ \@result;
+}
+
+sub text
+{
+ my ($context, $list, $recurse) = @_;
+
+ return [] if @$list == 0;
+
+ if (defined $recurse)
+ {
+ $recurse = $recurse->solve ($context, $list)->xql_toString;
+ }
+ else
+ {
+ $recurse = 1; # default
+ }
+
+ my @result;
+ for my $node (@$list)
+ {
+ my $text = $node->xql_text ($recurse);
+ next unless defined $text;
+
+ push @result, new XML::XQL::Text ($text, $node);
+ }
+ \@result;
+}
+
+sub rawText
+{
+ my ($context, $list, $recurse) = @_;
+
+ return [] if @$list == 0;
+
+ if (defined $recurse)
+ {
+ $recurse = $recurse->solve ($context, $list)->xql_toString;
+ }
+ else
+ {
+ $recurse = 1; # default
+ }
+
+ my @result;
+ for my $node (@$list)
+ {
+ my $text = $node->xql_rawText ($recurse);
+ next unless defined $text;
+
+ push @result, new XML::XQL::Text ($text, $node);
+ }
+ \@result;
+}
+
+sub true
+{
+ return $XML::XQL::Boolean::TRUE;
+}
+
+sub false
+{
+ return $XML::XQL::Boolean::FALSE;
+}
+
+#sub date() is in XQL::XML::Date
+
+sub element
+{
+ my ($context, $list, $text) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ if (defined $text)
+ {
+ $text = XML::XQL::prepareRvalue ($text->solve ($context, $list))->xql_toString;
+ for my $node (@$list)
+ {
+ push @result, @{$node->xql_element ($text)};
+ }
+ }
+ else
+ {
+ for my $node (@$list)
+ {
+ push @result, @{$node->xql_element};
+ }
+ }
+ @$list > 1 ? XML::XQL::sortDocOrder (\@result) : \@result;
+}
+
+sub attribute
+{
+ my ($context, $list, $text) = @_;
+
+ return [] if @$list == 0;
+
+ my @result;
+ if (defined $text)
+ {
+ $text = XML::XQL::prepareRvalue ($text->solve ($context, $list))->xql_toString;
+ for my $node (@$list)
+ {
+ push @result, @{ $node->xql_attribute ($text) };
+ }
+ }
+ else
+ {
+ for my $node (@$list)
+ {
+ push @result, @{ $node->xql_attribute };
+ }
+ }
+ \@result;
+}
+
+package XML::XQL::Bang;
+use base 'XML::XQL::Operator';
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+ $list = $self->{Left}->solve ($context, $list);
+ $self->{Right}->solve ($context, $list);
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+ XML::XQL::delim ($self->{Left}->xql_contextString (@_) .
+ XML::XQL::bold ("!") .
+ $self->{Right}->xql_contextString (@_), $self, @_);
+}
+
+package XML::XQL::Invocation;
+use base 'XML::XQL::Operator';
+use fields qw{ Args Name Type Once ConstVal };
+
+use Carp;
+
+sub new
+{
+ my ($class, %args) = @_;
+
+ my $self = bless \%args, $class;
+ for my $par (@{$self->{Args}})
+ {
+ $par->setParent ($self);
+ }
+ $self;
+}
+
+sub dispose
+{
+ my $self = shift;
+ for (@{ $self->{Args} })
+ {
+ $_->dispose;
+ }
+ undef $self->{Args};
+
+ undef $self->{Parent};
+}
+
+sub isConstant
+{
+ my ($self) = @_;
+
+ # An Invocation is constant, if all it's arguments are constant
+ # and it's a "constant" function
+ my $name = $self->{Name};
+ my $cf = $self->query->{ConstFunc};
+ my $const = exists ($cf->{$name}) ?
+ $cf->{name} : $XML::XQL::ConstFunc{$name};
+ return 0 unless $const;
+
+ for my $par (@{$self->{Args}})
+ {
+ return 0 unless $par->isConstant;
+ }
+ 1;
+}
+
+sub xql_check
+{
+ my ($self, $inSubQuery, $inParam) = @_;
+
+ # Syntactic Constraint 7:
+ # In a node query this function or method is only valid inside an instance
+ # of Subquery, unless it appears within an instance of Param.
+ # Functions and methods are valid anywhere in a full query.
+
+ my $query;
+ if (not ($inSubQuery or $inParam) and ($query = $self->query)->isNodeQuery)
+ {
+ unless ($query->isAllowedOutsideSubquery ($self->{Name}))
+ {
+ XML::XQL::parseError $self->{Type} . " " . $self->{Name} .
+ " is only allowed inside a Subquery or Param for 'Node Queries'." .
+ " Context: " . $self->toContextString;
+ }
+ }
+ for my $par (@{$self->{Args}})
+ {
+ $par->xql_check ($inSubQuery, 1); # these are Params
+ }
+ # once() should only be evaluated once per query
+ # "constant" functions should only be evaluated once *ever*
+ $self->{Once} = $self->isOnce || $self->isConstant;
+}
+
+sub xql_prepCache
+{
+ my ($self) = @_;
+ # once() should only be evaluated once per query
+ # "constant" functions should only be evaluated once *ever*
+ delete $self->{ConstVal} if $self->isOnce;
+
+ for my $par (@{$self->{Args}})
+ {
+ $par->xql_prepCache;
+ }
+}
+
+sub isOnce
+{
+ $_[0]->{Name} eq "once";
+}
+
+sub isMethod
+{
+ $_[0]->{Type} eq "method";
+}
+
+sub solve
+{
+ my ($self, $context, $list) = @_;
+
+ # Use the cached value if it's a "constant" function
+ return $self->{ConstVal} if (exists $self->{ConstVal});
+
+ my $func = $self->{Func};
+
+ my $result;
+ eval {
+ $result = &$func ($context, $list, @{$self->{Args}});
+ $self->{ConstVal} = $result if $self->{Once};
+ };
+ if ($@)
+ {
+#?? or croak
+ $self->warning ("invocation of '" . $self->{Name} . "' failed:\n\t$@");
+ $self->{ConstVal} = [] if $self->{Once};
+ return [];
+ }
+ $result;
+}
+
+sub xql_contextString
+{
+ my $self = shift;
+
+ my $str = XML::XQL::bold ($self->{Name}) . "(";
+ for (my $i = 0; $i < @{$self->{Args}}; $i++)
+ {
+ $str .= ", " if $i > 0;
+ $str .= $self->{Args}->[$i]->xql_contextString (@_);
+ }
+ $str .= ")";
+
+ XML::XQL::delim ($str, $self, @_);
+}
+
+# Base class shared by Node and PrimitiveType
+package XML::XQL::PrimitiveTypeBase;
+
+sub dispose
+{
+}
+
+sub xql_check
+{
+}
+
+sub xql_prepCache
+{
+}
+
+sub xql_prevSibling
+{
+ undef;
+}
+
+# This method returns an integer that determines how values should be casted
+# for comparisons. If the left value (LHS) has a higher xql_primType, the
+# right value (RHS) is cast to the type of the LHS (otherwise, the LHS is casted
+# to the type of the LHS)
+#
+# Values for certain types:
+# Node 0 (always cast a node to a Text string first)
+# Text 1
+# Number 2
+# Boolean 3
+# Date 4 (other classes automatically use 4 by default)
+
+sub xql_primType
+{
+ 4; # default for all classes other then Node, Text, Number, Boolean
+}
+
+sub xql_toBoolean
+{
+ 1; # it is true if it exists
+}
+
+sub xql_namespace
+{
+ undef;
+}
+
+sub xql_baseName
+{
+ undef;
+}
+
+sub xql_prefix
+{
+ undef;
+}
+
+sub xql_sortKey
+{
+ my $src = $_[0]->xql_sourceNode;
+ $src ? $src->xql_sortKey : $XML::XQL::LAST_SORT_KEY;
+}
+
+sub xql_toDOM
+{
+ my ($self, $doc) = @_;
+ my $name = ref $self;
+ $name =~ s/.*:://;
+ my $elem = $doc->createElement ($name);
+ $elem->setAttribute ("value", $self->xql_toString);
+ $elem;
+}
+
+package XML::XQL::PrimitiveType;
+use vars qw( @ISA );
+@ISA = qw( XML::XQL::PrimitiveTypeBase );
+
+sub new
+{
+ my ($class, $val, $srcNode) = @_;
+ bless [$val, $srcNode], $class;
+}
+
+sub isConstant
+{
+ 1;
+}
+
+sub setParent
+{
+ # not defined
+}
+
+sub solve
+{
+ $_[0]; # evaluates to itself
+}
+
+#
+# Derived classes should not override this method.
+# Override xql_toString instead.
+#
+sub xql_contextString
+{
+ my $self = shift;
+
+ XML::XQL::delim ($self->xql_toString, $self, @_);
+}
+
+#
+# Return the value of the Object as a primitive Perl value, i.e. an integer,
+# a float, or a string.
+#
+sub xql_toString
+{
+ $_[0]->[0];
+}
+
+sub xql_sourceNode
+{
+ $_[0]->[1];
+}
+
+sub xql_setSourceNode
+{
+ $_[0]->[1] = $_[1];
+}
+
+sub xql_setValue
+{
+ # This could potentially change the value of a constant in the XQL
+ # query expression.
+ $_[0]->[0] = $_[1];
+}
+
+sub xql_nodeType
+{
+ 0; # it's not a Node
+}
+
+sub xql_compare
+{
+ # Temporarily switch off $WARNING flag, to disable messages a la:
+ # Argument "1993-02-14" isn't numeric in ncmp
+ local $^W = 0;
+ $_[0]->[0] <=> $_[1]->xql_toString;
+}
+
+sub xql_eq { my $self = shift; $self->xql_compare (@_) == 0; }
+sub xql_ne { my $self = shift; $self->xql_compare (@_) != 0; }
+sub xql_lt { my $self = shift; $self->xql_compare (@_) < 0; }
+sub xql_le { my $self = shift; $self->xql_compare (@_) <= 0; }
+sub xql_gt { my $self = shift; $self->xql_compare (@_) > 0; }
+sub xql_ge { my $self = shift; $self->xql_compare (@_) >= 0; }
+
+package XML::XQL::Boolean;
+use vars qw( @ISA @EXPORT $TRUE $FALSE );
+
+use Carp;
+
+@ISA = qw( XML::XQL::PrimitiveType );
+@EXPORT = qw( $TRUE $FALSE );
+
+$TRUE = new XML::XQL::Boolean (1);
+$FALSE = new XML::XQL::Boolean (0);
+
+sub xql_primType
+{
+ 3;
+}
+
+sub xql_toBoolean
+{
+ $_[0]->[0]; # evaluate it to its value
+}
+
+sub xql_negate
+{
+#?? do we need to keep track of a source node here?
+ $_[0]->[0] ? $FALSE : $TRUE;
+}
+
+sub xql_compare
+{
+#?? how do we convert string to boolean value
+ $_[0]->[0] <=> ($_[1]->xql_toString ? 1 : 0);
+}
+
+sub xql_lt { badComparisonError (@_); }
+sub xql_gt { badComparisonError (@_); }
+sub xql_le { badComparisonError (@_); }
+sub xql_ge { badComparisonError (@_); }
+
+sub badComparisonError
+{
+ croak 'comparison operator (other than =, !=, $ieq$, $ine$) not defined for type Boolean';
+}
+
+package XML::XQL::Number;
+use vars qw( @ISA );
+@ISA = qw( XML::XQL::PrimitiveType );
+
+#use overload
+# 'fallback' => 1, # use default operators, if not specified
+# '""' => \&debug;
+
+sub debug
+{
+ "Number[" . $_[0]->[0] . "]";
+}
+
+sub xql_primType
+{
+ 2;
+}
+
+package XML::XQL::Text;
+use vars qw( @ISA );
+@ISA = qw( XML::XQL::PrimitiveType );
+
+#use overload
+# 'fallback' => 1, # use default operators, if not specified
+# '""' => \&debug;
+
+sub debug
+{
+ "Text[" . $_[0]->[0] . "]";
+}
+
+sub xql_primType
+{
+ 1;
+}
+
+sub xql_compare
+{
+ my ($self, $other, $ignoreCase) = @_;
+ if ($ignoreCase)
+ {
+ my $lhs = $self->[0];
+ my $rhs = $other->xql_toString;
+ "\U$lhs" cmp "\U$rhs";
+ }
+ else
+ {
+ $self->[0] cmp $other->xql_toString;
+ }
+}
+
+# Declare package XML::XQL::Node so that XML implementations can say
+# that their nodes derive from it:
+#
+# This worked for me when I added XQL support for XML::DOM:
+#
+# BEGIN
+# {
+# push @XML::DOM::Node::ISA, 'XML::XQL::Node';
+# }
+#
+
+package XML::XQL::Node;
+
+use vars qw( @ISA );
+@ISA = qw( XML::XQL::PrimitiveTypeBase );
+
+use Carp;
+
+sub xql_primType
+{
+ 0;
+}
+
+sub xql_toBoolean
+{
+ 1; # it is true if it exists
+}
+
+sub xql_attribute
+{
+ [];
+}
+
+sub xql_sourceNode
+{
+ $_[0];
+}
+
+# Default implementation - override this for speed
+sub xql_element
+{
+ my ($node, $elem) = @_;
+
+ my @list = ();
+ if (defined $elem)
+ {
+ for my $kid (@{$_[0]->xql_node})
+ {
+ # 1: element
+ push @list, $kid
+ if $kid->xql_nodeType == 1 && $kid->xql_nodeName eq $elem;
+ }
+ }
+ else
+ {
+ for my $kid (@{$_[0]->xql_node})
+ {
+ push @list, $kid if $kid->xql_nodeType == 1; # 1: element
+ }
+ }
+ \@list;
+}
+
+sub xql_text
+{
+ undef;
+}
+
+sub xql_rawText
+{
+ undef;
+}
+
+sub xql_rawTextBlocks
+{
+ undef;
+}
+
+sub xql_value
+{
+ new XML::XQL::Text ($_[0]->xql_text ($_[1]), $_[0]);
+}
+
+# Convert xql_value to Perl string (or undef if xql_value is undefined)
+sub xql_toString
+{
+ my $val = $_[0]->xql_value;
+ return undef if XML::XQL::isEmptyList ($val);
+
+ $val->xql_toString;
+}
+
+sub xql_setValue
+{
+ # Not implemented for most node types
+}
+
+sub xql_data
+{
+ "";
+}
+
+sub xql_nodeType
+{
+ 0;
+}
+
+sub xql_nodeName
+{
+ [];
+}
+
+# Java code from "XML:: Namespaces in 20 lines" by James Clark:
+# see: http://www.oasis-open.org/cover/clarkNS-980804.html
+#
+# String expandName(String name, Element element, boolean isAttribute) {
+# // The index of the colon character in the name.
+# int colonIndex = name.indexOf(':');
+# // The name of the attribute that declares the namespace prefix.
+# String declAttName;
+# if (colonIndex == -1) {
+# // Default namespace applies only to element type names.
+# if (isAttribute)
+# return name;
+# declAttName = "xmlns";
+# }
+# else {
+# String prefix = name.substring(0, colonIndex);
+# // "xml:" is special
+# if (prefix.equals("xml"))
+# return name;
+# declAttName = "xmlns:" + prefix;
+# }
+# for (; element != null; element = element.getParent()) {
+# String ns = element.getAttributeValue(declAttName);
+# if (ns != null) {
+# // Handle special meaning of xmlns=""
+# if (ns.length() == 0 && colonIndex == -1)
+# return name;
+# return ns + '+' + name.substring(colonIndex + 1);
+# }
+# }
+# return null;
+# }
+
+# From "Namespaces in XML"
+# at http://www.w3.org/TR/1998/WD-xml-names-19980916
+#
+# The prefix xml is by definition bound to the namespace name
+# urn:Connolly:input:required. The prefix xmlns is used only for
+# namespace bindings and is not itself bound to any namespace name.
+
+my $DEFAULT_NAMESPACE = undef;
+my $XML_NAMESPACE = "urn:Connolly:input:required";
+#?? default namespace
+
+sub xql_namespace
+{
+ my ($self) = @_;
+ my $nodeType = $self->xql_nodeType;
+ my $element = $self;
+
+ if ($nodeType == 2) # 2: Attr
+ {
+ $element = $self->xql_parent;
+ }
+ elsif ($nodeType != 1) # 1: Element
+ {
+ return undef;
+ }
+ my $name = $self->xql_nodeName;
+ my $declAttName;
+
+ if ($name =~ /([^:]+):([^:]+)/)
+ {
+ my ($prefix, $basename) = ($1, $2);
+
+ # "xml:" is special
+ return $XML_NAMESPACE if $prefix eq "xml";
+
+ $declAttName = "xmlns:$prefix";
+ }
+ else
+ {
+ # Default namespace applies only to element type names.
+ return $DEFAULT_NAMESPACE if $nodeType == 2; # 2: Attr
+#?? default namespace?
+ $declAttName = "xmlns";
+ }
+
+ do
+ {
+ my $ns = $element->xql_attribute ($declAttName);
+ next unless defined $ns;
+ return $ns->xql_rawText;
+
+ $element = $element->xql_parent;
+ }
+ while (defined ($element) and $element->xql_nodeType == 1);
+
+ # namespace not found
+ undef;
+}
+
+sub xql_basename
+{
+ my ($self) = @_;
+ my $nodeType = $self->xql_nodeType;
+ return undef unless $nodeType == 1 || $nodeType == 2;
+
+ my $name = $self->xql_nodeName;
+ $name =~ s/^[^:]://; # strip prefix
+ $name;
+}
+
+sub xql_prefix
+{
+ my ($self) = @_;
+ my $nodeType = $self->xql_nodeType;
+ return undef unless $nodeType == 1 || $nodeType == 2;
+
+ $self->xql_nodeName =~ /^([^:]+):/;
+ $1;
+}
+
+# Used by ancestor()
+sub xql_parent
+{
+ undef;
+}
+
+my @NodeTypeString =
+(
+ "", "element", "attribute", "text", "", "", "", "processing_instruction",
+ "comment", "document"
+);
+
+sub xql_nodeTypeString
+{
+ my $i = $_[0]->xql_nodeType;
+ return $NodeTypeString[$i] if ($i >= 1 && $i <= 3 || $i >= 7 && $i <= 9);
+
+#?? what should this return?
+ "<unknown xql_nodeType $i>";
+}
+
+if (not $XML::XQL::Restricted)
+{
+ require XML::XQL::Plus;
+}
+
+# All nodes should implement:
+
+#?? this section must be updated!!
+
+# - xql_document
+# - xql_node: return an unblessed list reference with childNodes (not
+# attributes)
+# - xql_nodeType (default implementation for XML::XQL::Node returns 0):
+# Element: 1
+# Element Attribute: 2
+# Markup-Delimited Region of Text (Text and CDATASection): 3
+# Processing Instruction: 7
+# Comment: 8
+# Document (Entity): 9
+# - xql_text
+# - xql_value (default implementation is xql_text)
+# - xql_parent: return parent node or undef (Document, DocumentFragment)
+#
+# Element should define/override the following:
+# - xql_nodeName: return the element name
+# - xql_attribute("attributeName"): return an unblessed reference to a list
+# with the attribute, or [] if no such attribute
+# - xql_attribute(): return an unblessed reference to a list with
+# all attribute nodes
+# - xql_baseName, xql_prefix
+#
+# Attribute:
+# - xql_nodeName: return the attribute name
+# - xql_baseName, xql_prefix
+#
+# EntityReference:
+# - xql_data: return expanded text value
+#
+# Text, CDATASection:
+# - xql_data: return expanded text value
+#
+# -xql_element could be overriden to speed up performance
+#
+
+1;
+
+__END__
+
+=head1 NAME
+
+XML::XQL - A perl module for querying XML tree structures with XQL
+
+=head1 SYNOPSIS
+
+ use XML::XQL;
+ use XML::XQL::DOM;
+
+ $parser = new XML::DOM::Parser;
+ $doc = $parser->parsefile ("file.xml");
+
+ # Return all elements with tagName='title' under the root element 'book'
+ $query = new XML::XQL::Query (Expr => "book/title");
+ @result = $query->solve ($doc);
+ $query->dispose; # Avoid memory leaks - Remove circular references
+
+ # Or (to save some typing)
+ @result = XML::XQL::solve ("book/title", $doc);
+
+ # Or (to save even more typing)
+ @result = $doc->xql ("book/title");
+
+=head1 DESCRIPTION
+
+The XML::XQL module implements the XQL (XML Query Language) proposal
+submitted to the XSL Working Group in September 1998.
+The spec can be found at: L<http://www.w3.org/TandS/QL/QL98/pp/xql.html>
+Most of the contents related to the XQL syntax can also be found in the
+L<XML::XQL::Tutorial> that comes with this distribution.
+Note that XQL is not the same as XML-QL!
+
+The current implementation only works with the L<XML::DOM> module, but once the
+design is stable and the major bugs are flushed out, other extensions might
+follow, e.g. for XML::Grove.
+
+XQL was designed to be extensible and this implementation tries to stick to that.
+Users can add their own functions, methods, comparison operators and data types.
+Plugging in a new XML tree structure (like XML::Grove) should be a piece of cake.
+
+To use the XQL module, either
+
+ use XML::XQL;
+
+or
+
+ use XML::XQL::Strict;
+
+The Strict module only provides the core XQL functionality as found in the
+XQL spec. By default (i.e. by using XML::XQL) you get 'XQL+', which has
+some additional features.
+
+See the section L<Additional Features in XQL+> for the differences.
+
+This module is still in development. See the To-do list in XQL.pm for what
+still needs to be done. Any suggestions are welcome, the sooner these
+implementation issues are resolved, the faster we can all use this module.
+
+If you find a bug, you would do me great favor by sending it to me in the
+form of a test case. See the file t/xql_template.t that comes with this distribution.
+
+If you have written a cool comparison operator, function, method or XQL data
+type that you would like to share, send it to enno@att.com and I will
+add it to this module.
+
+=head1 XML::XQL global functions
+
+=over 4
+
+=item solve (QUERY_STRING, INPUT_LIST...)
+
+ @result = XML::XQL::solve ("doc//book", $doc);
+
+This is provided as a shortcut for:
+
+ $query = new XML::XQL::Query (Expr => "doc//book");
+ @result = $query->solve ($doc);
+ $query->dispose;
+
+Note that with L<XML::XQL::DOM>, you can also write (see L<XML::DOM::Node>
+for details):
+
+ @result = $doc->xql ("doc//book");
+
+=item setDocParser (PARSER)
+
+Sets the XML::DOM::Parser that is used by the new XQL+ document() method.
+By default it uses an XML::DOM::Parser that was created without any arguments,
+i.e.
+
+ $PARSER = new XML::DOM::Parser;
+
+=item defineFunction (NAME, FUNCREF, ARGCOUNT [, ALLOWED_OUTSIDE [, CONST, [QUERY_ARG]]])
+
+Defines the XQL function (at the global level, i.e. for all newly created
+queries) with the specified NAME. The ARGCOUNT parameter can either be a single
+number or a reference to a list with numbers.
+A single number expands to [ARGCOUNT, ARGCOUNT]. The list contains pairs of
+numbers, indicating the number of arguments that the function allows. The value
+-1 means infinity. E.g. [2, 5, 7, 9, 12, -1] means that the function can have
+2, 3, 4, 5, 7, 8, 9, 12 or more arguments.
+The number of arguments is checked when parsing the XQL query string.
+
+The second parameter must be a reference to a Perl function or an anonymous
+sub. E.g. '\&my_func' or 'sub { ... code ... }'
+
+If ALLOWED_OUTSIDE (default is 0) is set to 1, the function or method may
+also be used outside subqueries in I<node queries>.
+(See NodeQuery parameter in Query constructor)
+
+If CONST (default is 0) is set to 1, the function is considered to be
+"constant". See L<Constant Function Invocations> for details.
+
+If QUERY_ARG (default is 0) is not -1, the argument with that index is
+considered to be a 'query parameter'. If the query parameter is a subquery,
+that returns multiple values, the result list of the function invocation will
+contain one result value for each value of the subquery.
+E.g. 'length(book/author)' will return a list of Numbers, denoting the string
+lengths of all the author elements returned by 'book/author'.
+
+Note that only methods (not functions) may appear after a Bang "!" operator.
+This is checked when parsing the XQL query string.
+
+See also: defineMethod
+
+=item generateFunction (NAME, FUNCNAME, RETURN_TYPE [, ARGCOUNT [, ALLOWED_OUTSIDE [, CONST [, QUERY_ARG]]]])
+
+Generates and defines an XQL function wrapper for the Perl function with the
+name FUNCNAME. The function name will be NAME in XQL query expressions.
+The return type should be one of the builtin XQL Data Types or a class derived
+from XML::XQL::PrimitiveType (see L<Adding Data Types>.)
+See defineFunction for the meaning of ARGCOUNT, ALLOWED_OUTSIDE, CONST and
+QUERY_ARG.
+
+Function values are always converted to Perl strings with xql_toString before
+they are passed to the Perl function implementation. The function return value
+is cast to an object of type RETURN_TYPE, or to the empty list [] if the
+result is undef. It uses expandType to expand XQL primitive type names.
+If RETURN_TYPE is "*", it returns the function
+result as is, unless the function result is undef, in which case it returns [].
+
+=item defineMethod (NAME, FUNCREF, ARGCOUNT [, ALLOWED_OUTSIDE])
+
+Defines the XQL method (at the global level, i.e. for all newly created
+queries) with the specified NAME. The ARGCOUNT parameter can either be a single
+number or a reference to a list with numbers.
+A single number expands to [ARGCOUNT, ARGCOUNT]. The list contains pairs of
+numbers, indicating the number of arguments that the method allows. The value
+-1 means infinity. E.g. [2, 5, 7, 9, 12, -1] means that the method can have
+2, 3, 4, 5, 7, 8, 9, 12 or more arguments.
+The number of arguments is checked when parsing the XQL query string.
+
+The second parameter must be a reference to a Perl function or an anonymous
+sub. E.g. '\&my_func' or 'sub { ... code ... }'
+
+If ALLOWED_OUTSIDE (default is 0) is set to 1, the function or method may
+also be used outside subqueries in I<node queries>.
+(See NodeQuery parameter in Query constructor)
+
+Note that only methods (not functions) may appear after a Bang "!" operator.
+This is checked when parsing the XQL query string.
+
+See also: defineFunction
+
+=item defineComparisonOperators (NAME => FUNCREF [, NAME => FUNCREF]*)
+
+Defines XQL comparison operators at the global level.
+The FUNCREF parameters must be a references to a Perl function or an anonymous
+sub. E.g. '\&my_func' or 'sub { ... code ... }'
+
+E.g. define the operators $my_op$ and $my_op2$:
+
+ defineComparisonOperators ('my_op' => \&my_op,
+ 'my_op2' => sub { ... insert code here ... });
+
+=item defineElementValueConvertor (TAG_NAME, FUNCREF)
+
+Defines that the result of the value() call for Elements with the specified
+TAG_NAME uses the specified function. The function will receive
+two parameters. The second one is the TAG_NAME of the Element node
+and the first parameter is the Element node itself.
+FUNCREF should be a reference to a Perl function, e.g. \&my_sub, or
+an anonymous sub.
+
+E.g. to define that all Elements with tag name 'date-of-birth' should return
+XML::XQL::Date objects:
+
+ defineElementValueConvertor ('date-of-birth', sub {
+ my $elem = shift;
+ # Always pass in the node as the second parameter. This is
+ # the reference node for the object, which is used when
+ # sorting values in document order.
+ new XML::XQL::Date ($elem->xql_text, $elem);
+ });
+
+These convertors can only be specified at a global level, not on a per query
+basis. To undefine a convertor, simply pass a FUNCREF of undef.
+
+=item defineAttrValueConvertor (ELEM_TAG_NAME, ATTR_NAME, FUNCREF)
+
+Defines that the result of the value() call for Attributes with the specified
+ATTR_NAME and a parent Element with the specified ELEM_TAG_NAME
+uses the specified function. An ELEM_TAG_NAME of "*" will match regardless of
+the tag name of the parent Element. The function will receive
+3 parameters. The third one is the tag name of the parent Element (even if
+ELEM_TAG_NAME was "*"), the second is the ATTR_NAME and the first is the
+Attribute node itself.
+FUNCREF should be a reference to a Perl function, e.g. \&my_sub, or
+an anonymous sub.
+
+These convertors can only be specified at a global level, not on a per query
+basis. To undefine a convertor, simply pass a FUNCREF of undef.
+
+=item defineTokenQ (Q)
+
+Defines the token for the q// string delimiters at a global level.
+The default value for XQL+ is 'q', for XML::XQL::Strict it is undef.
+A value of undef will deactivate this feature.
+
+=item defineTokenQQ (QQ)
+
+Defines the token for the qq// string delimiters at a global level.
+The default value for XQL+ is 'qq', for XML::XQL::Strict it is undef.
+A value of undef will deactivate this feature.
+
+=item expandType (TYPE)
+
+Used internally to expand type names of XQL primitive types.
+E.g. it expands "Number" to "XML::XQL::Number" and is not case-sensitive, so
+"number" and "NuMbEr" will both expand correctly.
+
+=item defineExpandedTypes (ALIAS, FULL_NAME [, ...])
+
+For each pair of arguments it allows the class name FULL_NAME to be abbreviated
+with ALIAS. The definitions are used by expandType().
+(ALIAS is always converted to lowercase internally, because expandType
+is case-insensitive.)
+
+Overriding the ALIAS for "date", also affects the object type returned by the
+date() function.
+
+=item setErrorContextDelimiters (START, END, BOLD_ON, BOLD_OFF)
+
+Sets the delimiters used when printing error messages during query evaluation.
+The default delimiters on Unix are `tput smul` (underline on) and `tput rmal`
+(underline off). On other systems (that don't have tput), the delimiters are
+">>" and "<<" resp.
+
+When printing the error message, the subexpression that caused the error will
+be enclosed by the delimiters, i.e. underlined on Unix.
+
+For certain subexpressions the significant keyword, e.g. "$and$" is enclosed in
+the bold delimiters BOLD_ON (default: `tput bold` on Unix, "" elsewhere) and
+BOLD_OFF (default: (`tput rmul` . `tput smul`) on Unix, "" elsewhere,
+see $BoldOff in XML::XQL::XQL.pm for details.)
+
+=item isEmptyList (VAR)
+
+Returns 1 if VAR is [], else 0. Can be used in user defined functions.
+
+=back
+
+=head1 Additional Features in XQL+
+
+=over 4
+
+=item Parent operator '..'
+
+The '..' operator returns the parent of the current node, where '.' would
+return the current node. This is not part of any XQL standard, because you
+would normally use return operators, which are not implemented here.
+
+=item Sequence operators ';' and ';;'
+
+The sequence operators ';' (precedes) and ';;' (immediately precedes) are
+not in the XQL spec, but are described in 'The Design of XQL' by Jonathan Robie
+who is one of the designers of XQL. It can be found at
+L<http://www.texcel.no/whitepapers/xql-design.html>
+See also the XQL Tutorial for a description of what they mean.
+
+=item q// and qq// String Tokens
+
+String tokens a la q// and qq// are allowed. q// evaluates like Perl's single
+quotes and qq// like Perl's double quotes. Note that the default XQL strings do
+not allow escaping etc., so it's not possible to define a string with both
+single and double quotes. If 'q' and 'qq' are not to your liking, you may
+redefine them to something else or undefine them altogether, by assigning undef
+to them. E.g:
+
+ # at a global level - shared by all queries (that don't (re)define 'q')
+ XML::XQL::defineTokenQ ('k');
+ XML::XQL::defineTokenQQ (undef);
+
+ # at a query level - only defined for this query
+ $query = new XML::XQL::Query (Expr => "book/title", q => 'k', qq => undef);
+
+From now on k// works like q// did and qq// doesn't work at all anymore.
+
+=item Query strings can have embedded Comments
+
+For example:
+
+ $queryExpr = "book/title # this comment is inside the query string
+ [. = 'Moby Dick']"; # this comment is outside
+
+=item Optional dollar delimiters and case-insensitive XQL keywords
+
+The following XQL keywords are case-insensitive and the dollar sign delimiters
+may be omitted: $and$, $or$, $not$, $union$, $intersect$, $to$, $any$, $all$,
+$eq$, $ne$, $lt$, $gt$, $ge$, $le$, $ieq$, $ine$, $ilt$, $igt$, $ige$, $ile$.
+
+E.g. $AND$, $And$, $aNd$, and, And, aNd are all valid replacements for $and$.
+
+Note that XQL+ comparison operators ($match$, $no_match$, $isa$, $can$) still
+require dollar delimiters and are case-sensitive.
+
+=item Comparison operator: $match$ or '=~'
+
+E.g. "book/title =~ '/(Moby|Dick)/']" will return all book titles containing
+Moby or Dick. Note that the match expression needs to be quoted and should
+contain the // or m// delimiters for Perl.
+
+When casting the values to be matched, both are converted to Text.
+
+=item Comparison operator: $no_match$ or '!~'
+
+E.g. "book/title !~ '/(Moby|Dick)/']" will return all book titles that don't
+contain Moby or Dick. Note that the match expression needs to be quoted and
+should contain the // or m// delimiters for Perl.
+
+When casting the values to be matched, both are converted to Text.
+
+=item Comparison operator: $isa$
+
+E.g. '//. $isa$ "XML::XQL::Date"' returns all elements for which the value()
+function returns an XML::XQL::Date object. (Note that the value() function can
+be overridden to return a specific object type for certain elements and
+attributes.) It uses expandType to expand XQL primitive type names.
+
+=item Comparison operator: $can$
+
+E.g. '//. $can$ "swim"' returns all elements for which the value()
+function returns an object that implements the (Perl) swim() method.
+(Note that the value() function can be overridden to return a specific object
+type for certain elements and attributes.)
+
+=item Function: once (QUERY)
+
+E.g. 'once(id("foo"))' will evaluate the QUERY expression only once per query.
+Certain query results (like the above example) will always return the same
+value within a query. Using once() will cache the QUERY result for the
+rest of the query.
+
+Note that "constant" function invocations are always cached.
+See also L<Constant Function Invocations>
+
+=item Function: subst (QUERY, EXPR, EXPR [,MODIFIERS, [MODE]])
+
+E.g. 'subst(book/title, "[M|m]oby", "Dick", "g")' will replace Moby or moby
+with Dick globally ("g") in all book title elements. Underneath it uses Perl's
+substitute operator s///. Don't worry about which delimiters are used underneath.
+The function returns all the book/titles for which a substitution occurred.
+The default MODIFIERS string is "" (empty.) The function name may be abbreviated
+to "s".
+
+For most Node types, it converts the value() to a string (with xql_toString)
+to match the string and xql_setValue to set the new value in case it matched.
+For XQL primitives (Boolean, Number, Text) and other data types (e.g. Date) it
+uses xql_toString to match the String and xql_setValue to set the result.
+Beware that performing a substitution on a primitive that was found in the
+original XQL query expression, changes the value of that constant.
+
+If MODE is 0 (default), it treats Element nodes differently by matching and
+replacing I<text blocks> occurring in the Element node. A text block is defined
+as the concatenation of the raw text of subsequent Text, CDATASection and
+EntityReference nodes. In this mode it skips embedded Element nodes.
+If a text block matches, it is replaced by a single Text node, regardless
+of the original node type(s).
+
+If MODE is 1, it treats Element nodes like the other nodes, i.e. it converts
+the value() to a string etc. Note that the default implementation of value()
+calls text(), which normalizes whitespace and includes embedded Element
+descendants (recursively.) This is probably not what you want to use in most
+cases, but since I'm not a professional psychic... :-)
+
+=item Function: map (QUERY, CODE)
+
+E.g. 'map(book/title, "s/[M|m]oby/Dick/g; $_")' will replace Moby or moby
+with Dick globally ("g") in all book title elements. Underneath it uses Perl's
+map operator. The function returns all the book/titles for which a
+change occurred.
+
+??? add more specifics
+
+=item Function: eval (EXPR [,TYPE])
+
+Evaluates the Perl expression EXPR and returns an object of the specified TYPE.
+It uses expandType to expand XQL primitive type names.
+If the result of the eval was undef, the empty list [] is returned.
+
+E.g. 'eval("2 + 5", "Number")' returns a Number object with the value 7, and
+ 'eval("%ENV{USER}")' returns a Text object with the user name.
+
+Consider using once() to cache the return value, when the invocation will
+return the same result for each invocation within a query.
+
+??? add more specifics
+
+=item Function: new (TYPE [, QUERY [, PAR] *])
+
+Creates a new object of the specified object TYPE. The constructor may have any
+number of arguments. The first argument of the constructor (the 2nd argument
+of the new() function) is considered to be a 'query parameter'.
+See defineFunction for a definition of I<query parameter>.
+It uses expandType to expand XQL primitive type names.
+
+=item Function: document (QUERY) or doc (QUERY)
+
+The document() function creates a new L<XML::XML::Document> for each result
+of QUERY (QUERY may be a simple string expression, like "/usr/enno/file.xml".
+See t/xql_document.t or below for an example with a more complex QUERY.)
+
+document() may be abbreviated to doc().
+
+document() uses an XML::DOM::Parser underneath, which can be set with
+XML::XQL::setDocParser(). By default it uses a parser that was created without
+any arguments, i.e.
+
+ $PARSER = new XML::DOM::Parser;
+
+Let's try a more complex example, assuming $doc contains:
+
+ <doc>
+ <file name="file1.xml"/>
+ <file name="file2.xml"/>
+ </doc>
+
+Then the following query will return two L<XML::XML::Document>s,
+one for file1.xml and one for file2.xml:
+
+ @result = XML::XQL::solve ("document(doc/file/@name)", $doc);
+
+The resulting documents can be used as input for following queries, e.g.
+
+ @result = XML::XQL::solve ("document(doc/file/@name)/root/bla", $doc);
+
+will return all /root/bla elements from the documents returned by document().
+
+=item Method: DOM_nodeType ()
+
+Returns the DOM node type. Note that these are mostly the same as nodeType(),
+except for CDATASection and EntityReference nodes. DOM_nodeType() returns
+4 and 5 respectively, whereas nodeType() returns 3, because they are
+considered text nodes.
+
+=item Function wrappers for Perl builtin functions
+
+XQL function wrappers have been provided for most Perl builtin functions.
+When using a Perl builtin function like "substr" in an XQL+ querry, an
+XQL function wrapper will be generated on the fly. The arguments to these
+functions may be regular XQL+ subqueries (that return one or more values) for
+a I<query parameter> (see generateFunction for a definition.)
+Most wrappers of Perl builtin functions have argument 0 for a query parameter,
+except for: chmod (parameter 1 is the query parameter), chown (2) and utime (2).
+The following functions have no query parameter, which means that all parameters
+should be a single value: atan2, rand, srand, sprintf, rename, unlink, system.
+
+The function result is casted to the appropriate XQL primitive type (Number,
+Text or Boolean), or to an empty list if the result was undef.
+
+=back
+
+=head2 XPath functions and methods
+
+The following functions were found in the XPath specification:
+
+=over 4
+
+=item Function: concat (STRING, STRING, STRING*)
+
+The concat function returns the concatenation of its arguments.
+
+=item Function: starts-with (STRING, STRING)
+
+The starts-with function returns true if the first argument string starts with
+the second argument string, and otherwise returns false.
+
+=item Function: contains (STRING, STRING)
+
+The contains function returns true if the first argument string contains the
+second argument string, and otherwise returns false.
+
+=item Function: substring-before (STRING, STRING)
+
+The substring-before function returns the substring of the first argument
+string that precedes the first occurrence of the second argument string
+in the first argument string, or the empty string if the first argument
+string does not contain the second argument string. For example,
+
+ substring-before("1999/04/01","/") returns 1999.
+
+=item Function: substring-after (STRING, STRING)
+
+The substring-after function returns the substring of the first argument string
+that follows the first occurrence of the second argument string in
+the first argument string, or the empty string if the first argument string does
+not contain the second argument string. For example,
+
+ substring-after("1999/04/01","/") returns 04/01,
+
+and
+
+ substring-after("1999/04/01","19") returns 99/04/01.
+
+=item Function: substring (STRING, NUMBER [, NUMBER] )
+
+The substring function returns the substring of the first argument starting at
+the position specified in the second argument with length specified in
+the third argument. For example,
+
+ substring("12345",2,3) returns "234".
+
+If the third argument is not specified, it returns the substring
+starting at the position specified in the second argument and continuing to
+the end of the string. For example,
+
+ substring("12345",2) returns "2345".
+
+More precisely, each character in the string is considered
+to have a numeric position: the position of the first character is 1,
+the position of the second character is 2 and so on.
+
+NOTE: This differs from the B<substr> method , in which the
+method treats the position of the first character as 0.
+
+The XPath spec says this about rounding, but that is not true in this
+implementation:
+I<The returned substring contains those characters for which the position of the
+character is greater than or equal to the rounded value of the
+second argument and, if the third argument is specified, less than the
+sum of the rounded value of the second argument and the rounded value of
+the third argument; the comparisons and addition used for the above
+follow the standard IEEE 754 rules; rounding is done as if by a call to the
+round function.>
+
+=item Method: string-length ( [ QUERY ] )
+
+The string-length returns the number of characters in the string.
+If the argument is omitted, it defaults to the context node
+converted to a string, in other words the string-value of the context node.
+
+Note that the generated XQL wrapper for the Perl built-in B<substr> does not
+allow the argument to be omitted.
+
+=item Method: normalize-space ( [ QUERY ] )
+
+The normalize-space function returns the argument string with whitespace
+normalized by stripping leading and trailing whitespace and replacing
+sequences of whitespace characters by a single space. Whitespace characters are
+the same as those allowed by the S production in XML. If the
+argument is omitted, it defaults to the context node converted to a string, in
+other words the string-value of the context node.
+
+=item Function: translate (STRING, STRING, STRING)
+
+The translate function returns the first argument string with occurrences of
+characters in the second argument string replaced by the character at
+the corresponding position in the third argument string. For example,
+
+ translate("bar","abc","ABC") returns the string BAr.
+
+If there is a
+character in the second argument string with no character at a corresponding
+position in the third argument string (because the second argument
+string is longer than the third argument string), then occurrences of that
+character in the first argument string are removed. For example,
+
+ translate("--aaa--","abc-","ABC") returns "AAA".
+
+If a character occurs more than once in the second argument string, then the
+first occurrence determines the replacement character. If the third argument
+string is longer than the second argument string, then excess characters
+are ignored.
+
+NOTE: The translate function is not a sufficient solution for case conversion
+in all languages. A future version may
+provide additional functions for case conversion.
+
+This function was implemented using tr///d.
+
+=item Function: sum ( QUERY )
+
+The sum function returns the sum of the QUERY results, by
+converting the string values of each result to a number.
+
+=item Function: floor (NUMBER)
+
+The floor function returns the largest (closest to positive infinity) number
+that is not greater than the argument and that is an integer.
+
+=item Function: ceiling (NUMBER)
+
+The ceiling function returns the smallest (closest to negative infinity) number
+that is not less than the argument and that is an integer.
+
+=item Function: round (NUMBER)
+
+The round function returns the number that is closest to the argument
+and that is an integer. If there are two such numbers, then the one that is
+closest to positive infinity is returned.
+
+=back
+
+=head1 Implementation Details
+
+=over 4
+
+=item XQL Builtin Data Types
+
+The XQL engine uses the following object classes internally. Only Number,
+Boolean and Text are considered I<primitive XQL types>:
+
+=over 4
+
+=item * XML::XQL::Number
+
+For integers and floating point numbers.
+
+=item * XML::XQL::Boolean
+
+For booleans, e.g returned by true() and false().
+
+=item * XML::XQL::Text
+
+For string values.
+
+=item * XML::XQL::Date
+
+For date, time and date/time values. E.g. returned by the date() function.
+
+=item * XML::XQL::Node
+
+Superclass of all XML node types. E.g. all subclasses of XML::DOM::Node subclass
+from this.
+
+=item * Perl list reference
+
+Lists of values are passed by reference (i.e. using [] delimiters).
+The empty list [] has a double meaning. It also means 'undef' in certain
+situations, e.g. when a function invocation or comparison failed.
+
+=back
+
+=item Type casting in comparisons
+
+When two values are compared in an XML comparison (e.g. $eq$) the values are
+first casted to the same data type. Node values are first replaced by their
+value() (i.e. the XQL value() function is used, which returns a Text value by
+default, but may return any data type if the user so chooses.)
+The resulting values are then casted to the type of the object with the highest
+xql_primType() value. They are as follows: Node (0), Text (1), Number (2),
+Boolean (3), Date (4), other data types (4 by default, but this may be
+overriden by the user.)
+
+E.g. if one value is a Text value and the other is a Number, the Text value is
+cast to a Number and the resulting low-level (Perl) comparison is (for $eq$):
+
+ $number->xql_toString == $text->xql_toString
+
+If both were Text values, it would have been
+
+ $text1->xql_toString eq $text2->xql_toString
+
+Note that the XQL spec is vague and even conflicting where it concerns type
+casting. This implementation resulted after talking to Joe Lapp, one of the
+spec writers.
+
+=item Adding Data Types
+
+If you want to add your own data type, make sure it derives from
+XML::XQL::PrimitiveType and implements the necessary methods.
+
+I will add more stuff here to explain it all, but for now, look at the code
+for the primitive XQL types or the Date class (L<XML::XQL::Date> in Date.pm.)
+
+=item Document Order
+
+The XQL spec states that query results always return their values in
+I<document order>, which means the order in which they appeared in the original
+XML document. Values extracted from Nodes (e.g. with value(), text(), rawText(),
+nodeName(), etc.) always have a pointer to the reference node (i.e. the Node
+from which the value was extracted.) These pointers are acknowledged when
+(intermediate) result lists are sorted. Currently, the only place where a
+result list is sorted is in a $union$ expression, which is the only place
+where the result list can be unordered.
+(If you find that this is not true, let me know.)
+
+Non-node values that have no associated reference node, always end up at the end
+of the result list in the order that they were added.
+The XQL spec states that the reference node for an XML Attribute is the Element
+to which it belongs, and that the order of values with the same reference node
+is undefined. This means that the order of an Element and its attributes would
+be undefined.
+But since the XML::DOM module keeps track of the order of the attributes, the
+XQL engine does the same, and therefore, the attributes of an Element are
+sorted and appear after their parent Element in a sorted result list.
+
+=item Constant Function Invocations
+
+If a function always returns the same value when given "constant" arguments,
+the function is considered to be "constant". A "constant" argument can be
+either an XQL primitive (Number, Boolean, Text) or a "constant" function
+invocation. E.g.
+
+ date("12-03-1998")
+ true()
+ sin(0.3)
+ length("abc")
+ date(substr("12-03-1998 is the date", 0, 10))
+
+are constant, but not:
+
+ length(book[2])
+
+Results of constant function invocations are cached and calculated only once
+for each query. See also the CONST parameter in defineFunction.
+It is not necessary to wrap constant function invocations in a once() call.
+
+Constant XQL functions are: date, true, false and a lot of the XQL+
+wrappers for Perl builtin functions. Function wrappers for certain builtins
+are not made constant on purpose to force the invocation to be evaluated
+every time, e.g. 'mkdir("/user/enno/my_dir", "0644")' (although constant
+in appearance) may return different results for multiple invocations.
+See %PerlFunc in Plus.pm for details.
+
+=item Function: count ([QUERY])
+
+The count() function has no parameters in the XQL spec. In this implementation
+it will return the number of QUERY results when passed a QUERY parameter.
+
+=item Method: text ([RECURSE])
+
+When expanding an Element node, the text() method adds the expanded text() value
+of sub-Elements. When RECURSE is set to 0 (default is 1), it will not include
+sub-elements. This is useful e.g. when using the $match$ operator in a recursive
+context (using the // operator), so it won't return parent Elements when one of
+the children matches.
+
+=item Method: rawText ([RECURSE])
+
+See text().
+
+=back
+
+=head1 SEE ALSO
+
+L<XML::XQL::Query>, L<XML::XQL::DOM>, L<XML::XQL::Date>
+
+The Japanese version of this document can be found on-line at
+L<http://member.nifty.ne.jp/hippo2000/perltips/xml/xql.htm>
+
+The L<XML::XQL::Tutorial> manual page. The Japanese version can be found at
+L<http://member.nifty.ne.jp/hippo2000/perltips/xml/xql/tutorial.htm>
+
+The XQL spec at L<http://www.w3.org/TandS/QL/QL98/pp/xql.html>
+
+The Design of XQL at L<http://www.texcel.no/whitepapers/xql-design.html>
+
+The DOM Level 1 specification at L<http://www.w3.org/TR/REC-DOM-Level-1>
+
+The XML spec (Extensible Markup Language 1.0) at L<http://www.w3.org/TR/REC-xml>
+
+The L<XML::Parser> and L<XML::Parser::Expat> manual pages.
+
+=head1 AUTHOR
+
+Please send bugs, comments and suggestions to Enno Derksen <F<enno@att.com>>
+
+=cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL/DOM.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,622 @@
+############################################################################
+# Copyright (c) 1998 Enno Derksen
+# All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+############################################################################
+#
+# Functions added to the XML::DOM implementation for XQL support
+#
+# NOTE: This code is a bad example of how to use XML::DOM.
+# I'm accessing internal (private) data members for a little gain in performance.
+# When the internal DOM implementation changes, this code will no longer work.
+# But since I maintain XML::DOM, it's easy for me to keep them in sync.
+# Regular users are adviced to use the XML::DOM API as described in the
+# documentation.
+#
+
+use strict;
+package XML::XQL::DOM;
+
+BEGIN
+{
+ require XML::DOM;
+
+ # import constant field definitions, e.g. _Doc
+ import XML::DOM::Node qw{ :Fields };
+}
+
+package XML::DOM::Node;
+
+sub xql
+{
+ my $self = shift;
+
+ # Odd number of args, assume first is XQL expression without 'Expr' key
+ unshift @_, 'Expr' if (@_ % 2 == 1);
+ my $query = new XML::XQL::Query (@_);
+ my @result = $query->solve ($self);
+ $query->dispose;
+
+ @result;
+}
+
+sub xql_sortKey
+{
+ my $key = $_[0]->[_SortKey];
+ return $key if defined $key;
+
+ $key = XML::XQL::createSortKey ($_[0]->[_Parent]->xql_sortKey,
+ $_[0]->xql_childIndex, 1);
+#print "xql_sortKey $_[0] ind=" . $_[0]->xql_childIndex . " key=$key str=" . XML::XQL::keyStr($key) . "\n";
+ $_[0]->[_SortKey] = $key;
+}
+
+# Find previous sibling that is not a text node with ignorable whitespace
+sub xql_prevNonWS
+{
+ my $self = shift;
+ my $parent = $self->[_Parent];
+ return unless $parent;
+
+ for (my $i = $parent->getChildIndex ($self) - 1; $i >= 0; $i--)
+ {
+ my $node = $parent->getChildAtIndex ($i);
+ return $node unless $node->xql_isIgnorableWS; # skip whitespace
+ }
+ undef;
+}
+
+# True if it's a Text node with just whitespace and xml::space != "preserve"
+sub xql_isIgnorableWS
+{
+ 0;
+}
+
+# Whether the node should preserve whitespace
+# It should if it has attribute xml:space="preserve"
+sub xql_preserveSpace
+{
+ $_[0]->[_Parent]->xql_preserveSpace;
+}
+
+sub xql_element
+{
+#?? I wonder which implemention is used for e.g. DOM::Text, since XML::XQL::Node also has an implementation
+ [];
+}
+
+sub xql_document
+{
+ $_[0]->[_Doc];
+}
+
+sub xql_node
+{
+ my $kids = $_[0]->[_C];
+ if (defined $kids)
+ {
+ # Must copy the list or else we return a blessed reference
+ # (which causes trouble later on)
+ my @list = @$kids;
+ return \@list;
+ }
+
+ [];
+}
+
+#?? implement something to support NamedNodeMaps in DocumentType
+sub xql_childIndex
+{
+ $_[0]->[_Parent]->getChildIndex ($_[0]);
+}
+
+#?? implement something to support NamedNodeMaps in DocumentType
+sub xql_childCount
+{
+ my $ch = $_[0]->[_C];
+ defined $ch ? scalar(@$ch) : 0;
+}
+
+sub xql_parent
+{
+ $_[0]->[_Parent];
+}
+
+sub xql_DOM_nodeType
+{
+ $_[0]->getNodeType;
+}
+
+sub xql_nodeType
+{
+ $_[0]->getNodeType;
+}
+
+# As it appears in the XML document
+sub xql_xmlString
+{
+ $_[0]->toString;
+}
+
+package XML::DOM::Element;
+
+sub xql_attribute
+{
+ my ($node, $attrName) = @_;
+
+ if (defined $attrName)
+ {
+ my $attr = $node->getAttributeNode ($attrName);
+ defined ($attr) ? [ $attr ] : [];
+ }
+ else
+ {
+ defined $node->[_A] ? $node->[_A]->getValues : [];
+ }
+}
+
+# Used by XML::XQL::Union::genSortKey to generate sort keys
+# Returns the maximum of the number of children and the number of Attr nodes.
+sub xql_childCount
+{
+ my $n = scalar @{$_[0]->[_C]};
+ my $m = defined $_[0]->[_A] ? $_[0]->[_A]->getLength : 0;
+ return $n > $m ? $n : $m;
+}
+
+sub xql_element
+{
+ my ($node, $elem) = @_;
+
+ my @list;
+ if (defined $elem)
+ {
+ for my $kid (@{$node->[_C]})
+ {
+ push @list, $kid if $kid->isElementNode && $kid->[_TagName] eq $elem;
+ }
+ }
+ else
+ {
+ for my $kid (@{$node->[_C]})
+ {
+ push @list, $kid if $kid->isElementNode;
+ }
+ }
+ \@list;
+}
+
+sub xql_nodeName
+{
+ $_[0]->[_TagName];
+}
+
+sub xql_baseName
+{
+ my $name = $_[0]->[_TagName];
+ $name =~ s/^\w*://;
+ $name;
+}
+
+sub xql_prefix
+{
+ my $name = $_[0]->[_TagName];
+ $name =~ /([^:]+):/;
+ $1;
+}
+
+sub xql_rawText
+{
+ my ($self, $recurse) = @_;
+ $recurse = 1 unless defined $recurse;
+
+ my $text = "";
+
+ for my $kid (@{$self->xql_node})
+ {
+ my $type = $kid->xql_nodeType;
+
+ # type=1: element
+ # type=3: text (Text, CDATASection, EntityReference)
+ if (($type == 1 && $recurse) || $type == 3)
+ {
+ $text .= $kid->xql_rawText ($recurse);
+ }
+ }
+ $text;
+}
+
+sub xql_text
+{
+ my ($self, $recurse) = @_;
+ $recurse = 1 unless defined $recurse;
+
+ my $j = -1;
+ my @text;
+ my $last_was_text = 0;
+
+ # Collect text blocks. Consecutive blocks of Text, CDataSection and
+ # EntityReference nodes should be merged without stripping and without
+ # putting spaces in between.
+ for my $kid (@{$self->xql_node})
+ {
+ my $type = $kid->xql_nodeType;
+
+ if ($type == 1) # 1: element
+ {
+ if ($recurse)
+ {
+ $text[++$j] = $kid->xql_text ($recurse);
+ }
+ $last_was_text = 0;
+ }
+ elsif ($type == 3) # 3: text (Text, CDATASection, EntityReference)
+ {
+ ++$j unless $last_was_text; # next text block
+ $text[$j] .= $kid->getData;
+ $last_was_text = 1;
+ }
+ else # e.g. Comment
+ {
+ $last_was_text = 0;
+ }
+ }
+
+ # trim whitespace and remove empty blocks
+ my $i = 0;
+ my $n = @text;
+ while ($i < $n)
+ {
+ # similar to XML::XQL::trimSpace
+ $text[$i] =~ s/^\s+//;
+ $text[$i] =~ s/\s+$//;
+
+ if ($text[$i] eq "")
+ {
+ splice (@text, $i, 1); # remove empty block
+ $n--;
+ }
+ else
+ {
+ $i++;
+ }
+ }
+ join (" ", @text);
+}
+
+#
+# Returns a list of text blocks for this Element.
+# A text block is a concatenation of consecutive text-containing nodes (i.e.
+# Text, CDATASection or EntityReference nodes.)
+# For each text block a reference to an array is returned with the following
+# 3 items:
+# [0] index of first node of the text block
+# [1] index of last node of the text block
+# [2] concatenation of the raw text (of the nodes in this text block)
+#
+# The text blocks are returned in reverse order for the convenience of
+# the routines that want to modify the text blocks.
+#
+sub xql_rawTextBlocks
+{
+ my ($self) = @_;
+
+ my @result;
+ my $curr;
+ my $prevWasText = 0;
+ my $kids = $self->[_C];
+ my $n = @$kids;
+ for (my $i = 0; $i < $n; $i++)
+ {
+ my $node = $kids->[$i];
+ # 3: text (Text, CDATASection, EntityReference)
+ if ($node->xql_nodeType == 3)
+ {
+ if ($prevWasText)
+ {
+ $curr->[1] = $i;
+ $curr->[2] .= $node->getData;
+ }
+ else
+ {
+ $curr = [$i, $i, $node->getData];
+ unshift @result, $curr;
+ $prevWasText = 1;
+ }
+ }
+ else
+ {
+ $prevWasText = 0;
+ }
+ }
+ @result;
+}
+
+sub xql_replaceBlockWithText
+{
+ my ($self, $start, $end, $text) = @_;
+ for (my $i = $end; $i > $start; $i--)
+ {
+ # dispose of the old nodes
+ $self->removeChild ($self->[_C]->[$i])->dispose;
+ }
+ my $node = $self->[_C]->[$start];
+ my $newNode = $self->[_Doc]->createTextNode ($text);
+ $self->replaceChild ($newNode, $node)->dispose;
+}
+
+sub xql_setValue
+{
+ my ($self, $str) = @_;
+ # Remove all children
+ for my $kid (@{$self->[_C]})
+ {
+ $self->removeChild ($kid);
+ }
+ # Add a (single) text node
+ $self->appendChild ($self->[_Doc]->createTextNode ($str));
+}
+
+sub xql_value
+{
+ XML::XQL::elementValue ($_[0]);
+}
+
+sub xql_preserveSpace
+{
+ # attribute value should be "preserve" (1), "default" (0) or "" (ask parent)
+ my $space = $_[0]->getAttribute ("xml:space");
+ $space eq "" ? $_[0]->[_Parent]->xql_preserveSpace : ($space eq "preserve");
+}
+
+package XML::DOM::Attr;
+
+sub xql_sortKey
+{
+ my $key = $_[0]->[_SortKey];
+ return $key if defined $key;
+
+ $_[0]->[_SortKey] = XML::XQL::createSortKey ($_[0]->xql_parent->xql_sortKey,
+ $_[0]->xql_childIndex, 0);
+}
+
+sub xql_nodeName
+{
+ $_[0]->getNodeName;
+}
+
+sub xql_text
+{
+ XML::XQL::trimSpace ($_[0]->getValue);
+}
+
+sub xql_rawText
+{
+ $_[0]->getValue;
+}
+
+sub xql_value
+{
+ XML::XQL::attrValue ($_[0]);
+}
+
+sub xql_setValue
+{
+ $_[0]->setValue ($_[1]);
+}
+
+sub xql_baseName
+{
+ my $name = $_[0]->getNodeName;
+ $name =~ s/^\w*://;
+ $name;
+}
+
+sub xql_prefix
+{
+ my $name = $_[0]->getNodeName;
+ $name =~ s/:\w*$//;
+ $name;
+}
+
+sub xql_parent
+{
+ $_[0]->[_UsedIn]->{''}->{Parent};
+}
+
+sub xql_childIndex
+{
+ my $map = $_[0]->[_UsedIn];
+ $map ? $map->getChildIndex ($_[0]) : 0;
+}
+
+package XML::DOM::Text;
+
+sub xql_rawText
+{
+ $_[0]->[_Data];
+}
+
+sub xql_text
+{
+ XML::XQL::trimSpace ($_[0]->[_Data]);
+}
+
+sub xql_setValue
+{
+ $_[0]->setData ($_[1]);
+}
+
+sub xql_isIgnorableWS
+{
+ $_[0]->[_Data] =~ /^\s*$/ &&
+ !$_[0]->xql_preserveSpace;
+}
+
+package XML::DOM::CDATASection;
+
+sub xql_rawText
+{
+ $_[0]->[_Data];
+}
+
+sub xql_text
+{
+ XML::XQL::trimSpace ($_[0]->[_Data]);
+}
+
+sub xql_setValue
+{
+ $_[0]->setData ($_[1]);
+}
+
+sub xql_nodeType
+{
+ 3; # it contains text, so XQL spec states it's a text node
+}
+
+package XML::DOM::EntityReference;
+
+BEGIN
+{
+ # import constant field definitions, e.g. _Data
+ import XML::DOM::CharacterData qw{ :Fields };
+}
+
+sub xql_text
+{
+ $_[0]->getData;
+}
+
+sub xql_rawText
+{
+ XML::XQL::trimSpace ($_[0]->[_Data]);
+}
+
+sub xql_setValue
+{
+ $_[0]->setData ($_[1]);
+}
+
+sub xql_nodeType
+{
+ 3; # it contains text, so XQL spec states it's a text node
+}
+
+package XML::DOM::Document;
+
+BEGIN
+{
+ # import constant field definitions, e.g. _TagName
+ import XML::DOM::Element qw{ :Fields };
+}
+
+sub xql_sortKey
+{
+ "";
+}
+
+sub xql_element
+{
+ my ($node, $elem) = @_;
+
+ my @list;
+ if (defined $elem)
+ {
+ for my $kid (@{$node->[_C]})
+ {
+ push @list, $kid if $kid->isElementNode && $kid->[_TagName] eq $elem;
+ }
+ }
+ else
+ {
+ for my $kid (@{$node->[_C]})
+ {
+ push @list, $kid if $kid->isElementNode;
+ }
+ }
+ \@list;
+}
+
+sub xql_parent
+{
+ undef;
+}
+
+# By default the elements in a document don't preserve whitespace
+sub xql_preserveSpace
+{
+ 0;
+}
+
+package XML::DOM::DocumentFragment;
+
+BEGIN
+{
+ # import constant field definitions, e.g. _TagName
+ import XML::DOM::Element qw{ :Fields };
+}
+
+sub xql_element
+{
+ my ($node, $elemName) = @_;
+
+ my @list;
+ if (defined $elemName)
+ {
+ for my $kid (@{$node->[_C]})
+ {
+ push @list, $kid if $kid->isElementNode && $kid->[_TagName] eq $elemName;
+ }
+ }
+ else
+ {
+ for my $kid (@{$node->[_C]})
+ {
+ push @list, $kid if $kid->isElementNode;
+ }
+ }
+ \@list;
+}
+
+sub xql_parent
+{
+ undef;
+}
+
+1; # module loaded successfuly
+
+__END__
+
+=head1 NAME
+
+XML::XQL::DOM - Adds XQL support to XML::DOM nodes
+
+=head1 SYNOPSIS
+
+ use XML::XQL;
+ use XML::XQL::DOM;
+
+ $parser = new XML::DOM::Parser;
+ $doc = $parser->parsefile ("file.xml");
+
+ # Return all elements with tagName='title' under the root element 'book'
+ $query = new XML::XQL::Query (Expr => "book/title");
+ @result = $query->solve ($doc);
+
+ # Or (to save some typing)
+ @result = XML::XQL::solve ("book/title", $doc);
+
+ # Or (see XML::DOM::Node)
+ @result = $doc->xql ("book/title");
+
+=head1 DESCRIPTION
+
+XML::XQL::DOM adds methods to L<XML::DOM> nodes to support XQL queries
+on XML::DOM document structures.
+
+See L<XML::XQL> and L<XML::XQL::Query> for more details.
+L<XML::DOM::Node> describes the B<xql()> method.
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL/Date.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,206 @@
+############################################################################
+# Copyright (c) 1998 Enno Derksen
+# All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+############################################################################
+
+package XML::XQL::Date;
+
+use vars qw(@ISA);
+@ISA = qw( XML::XQL::PrimitiveType );
+
+use strict;
+use Carp;
+
+BEGIN
+{
+ # Date::Manip relies on setting of $TZ.
+ unless (defined $ENV{TZ})
+ {
+ $ENV{TZ} = "EST5EDT";
+ warn "XML::XQL::Date - setting timezone \$ENV{TZ} to EST5EDT (east coast USA.) Set your TZ environment variable to avoid this message.";
+ }
+}
+use Date::Manip;
+
+BEGIN {
+ # add date() implementation to XQL engine.
+ XML::XQL::defineFunction ("date", \&XML::XQL::Date::date, 1, 1, 1);
+};
+
+use overload
+ 'fallback' => 1, # use default operators, if not specified
+ '<=>' => \&compare, # also takes care of <, <=, ==, != etc.
+ 'cmp' => \&compare, # also takes care of le, lt, eq, ne, etc.
+ '""' => \&yyyymmddhhmmss; # conversion to string uses yyyymmddhhmmss
+
+sub new
+{
+ my $class = shift;
+
+ my (%args);
+ if (@_ < 2)
+ {
+ my $str = @_ ? $_[0] : "";
+ %args = (String => $str);
+ }
+ else
+ {
+ %args = @_;
+ }
+
+ my $self = bless \%args, $class;
+
+ if (@_ < 2)
+ {
+ my $date = $self->createInternal (@_ ? $_[0] : "now");
+ $date = "" unless isValidDate ($date);
+ $self->{Internal} = $date;
+ }
+ $self;
+}
+
+sub createInternal
+{
+ my ($self, $str) = @_;
+ Date::Manip::ParseDate ($str);
+
+# From Date::Manip:
+#
+# 2 digit years fall into the 100 year period given by [ CURR-N,
+# CURR+(99-N) ] where N is 0-99. Default behavior is 89, but other useful
+# numbers might be 0 (forced to be this year or later) and 99 (forced to be
+# this year or earlier). It can also be set to "c" (current century) or
+# "cNN" (i.e. c18 forces the year to bet 1800-1899). Also accepts the
+# form cNNNN to give the 100 year period NNNN to NNNN+99.
+#$Date::Manip::YYtoYYYY=89;
+
+# Use this to force the current date to be set to this:
+#$Date::Manip::ForceDate="";
+}
+
+sub isValidDate # static method
+{
+ my ($date) = @_;
+ return 0 unless defined $date;
+
+ my $year = substr ($date, 0, 4) || 0;
+
+ $year > 1500;
+#?? arbitrary limit - years < 100 cause problems in Date::Manip
+}
+
+sub ymdhms
+{
+ my $self = shift;
+ if (@_)
+ {
+ my ($y, $mon, $d, $h, $m, $s) = @;
+#?? implement
+ }
+ else
+ {
+#?? test: x skips a character. Format: "YYYYMMDDhh:mm::ss"
+ return () unless length $self->{Internal};
+# print "ymhds " . $self->{Internal} . "\n";
+ unpack ("A4A2A2A2xA2xA2", $self->{Internal});
+ }
+}
+
+sub yyyymmddhhmmss
+{
+ my ($self) = @_;
+ my ($y, $mon, $d, $h, $m, $s) = $self->ymdhms;
+
+ $y ? "$y-$mon-${d}T$h:$m:$s" : "";
+ # using Date::Manip::UnixDate is a bit too slow for my liking
+#?? could add support for other formats
+}
+
+sub xql_toString
+{
+#?? use $_[0]->{String} or
+ $_[0]->yyyymmddhhmmss;
+}
+
+sub xql_compare
+{
+ my ($self, $other) = @_;
+ my $type = ref ($self);
+ if (ref ($other) ne $type)
+ {
+ my $str = $other->xql_toString;
+ # Allow users to plug in their own Date class
+ $other = eval "new $type (\$str)";
+#?? check result?
+ }
+#print "date::compare self=" . $self->{Internal} . " other=" . $other->{Internal}. "\n";
+ $self->{Internal} cmp $other->{Internal};
+}
+
+sub xql_setSourceNode
+{
+ $_[0]->{SourceNode} = $_[1];
+}
+
+sub xql_sourceNode
+{
+ $_[0]->{SourceNode};
+}
+
+sub xql_setValue
+{
+ my ($self, $val) = @_;
+ $self->{Internal} = $self->createInternal ($val);
+ $self->{String} = $val;
+}
+
+# The XQL date() function
+sub date # static method
+{
+ my ($context, $listref, $text) = @_;
+
+ $text = XML::XQL::toList ($text->solve ($context, $listref));
+ my @result = ();
+ for my $val (@$text)
+ {
+ # Using xql_new allows users to plug-in their own Date class
+ my $date = XML::XQL::xql_new ("date", $val->xql_toString);
+# print "date $val " . XML::XQL::d($val) . " " . $date->xql_toString . "\n";
+ push @result, $date;
+ }
+ \@result;
+}
+
+1; # module return code
+
+__END__
+
+=head1 NAME
+
+XML::XQL::Date - Adds an XQL::Node type for representing and comparing dates and times
+
+=head1 SYNOPSIS
+
+ use XML::XQL;
+ use XML::XQL::Date;
+
+ my $query = new XML::XQL::Query (Expr => "doc//timestamp[. < date('12/31/1999')]");
+ my @results = $query->solve ($doc);
+
+=head1 DESCRIPTION
+
+This package uses the L<Date::Manip> package to add an XQL node type
+(called XML::XQL::Date) that can be used to represent dates and times.
+The Date::Manip package can parse almost any date or time format imaginable.
+(I tested it with Date::Manip 5.33 and I know for sure that it doesn't work
+with 5.20 or lower.)
+
+It also adds the XQL B<date> function which creates an XML::XQL::Date
+object from a string. See L<XML::XQL::Tutorial> for a description of the date()
+function.
+
+You can plug in your own Date type, if you don't want to use Date::Manip
+ for some reason. See L<XML::XQL> and the XML::XQL::Date source file for
+more details.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL/Debug.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,144 @@
+package XML::XQL::Debug;
+
+# Replaces the filepath separator if necessary (i.e for Macs and Windows/DOS)
+sub filename
+{
+ my $name = shift;
+
+ if ((defined $^O and
+ $^O =~ /MSWin32/i ||
+ $^O =~ /Windows_95/i ||
+ $^O =~ /Windows_NT/i) ||
+ (defined $ENV{OS} and
+ $ENV{OS} =~ /MSWin32/i ||
+ $ENV{OS} =~ /Windows_95/i ||
+ $ENV{OS} =~ /Windows_NT/i))
+ {
+ $name =~ s!/!\\!g;
+ }
+ elsif ((defined $^O and $^O =~ /MacOS/i) ||
+ (defined $ENV{OS} and $ENV{OS} =~ /MacOS/i))
+ {
+ $name =~ s!/!:!g;
+ $name = ":$name";
+ }
+ $name;
+}
+
+sub dump
+{
+ new XML::XQL::Debug::Dump->pr (@_);
+}
+
+sub str
+{
+ my $dump = new XML::XQL::Debug::Dump;
+ $dump->pr (@_);
+ $dump->{Str} =~ tr/\012/\n/; # for MacOS where '\012' != '\n'
+ $dump->{Str};
+}
+
+package XML::XQL::Debug::Dump;
+
+sub new
+{
+ my ($class, %args) = @_;
+ $args{Indent} = 0;
+ $args{Str} = "";
+ bless \%args, $class;
+}
+
+sub indent
+{
+ $_[0]->p (" " x $_[0]->{Indent});
+}
+
+sub ip
+{
+ my $self = shift;
+ $self->indent;
+ $self->p (@_);
+}
+
+sub pr
+{
+ my ($self, $x) = @_;
+ if (ref($x))
+ {
+ if (ref($x) eq "ARRAY")
+ {
+ if (@$x == 0)
+ {
+ $self->ip ("<array/>\n");
+ return;
+ }
+
+ $self->ip ("<array>\n");
+ $self->{Indent}++;
+
+ for (my $i = 0; $i < @$x; $i++)
+ {
+ $self->ip ("<item index='$i'>\n");
+ $self->{Indent}++;
+
+ $self->pr ($x->[$i]);
+
+ $self->{Indent}--;
+ $self->ip ("</item>\n");
+ }
+ $self->{Indent}--;
+ $self->ip ("</array>\n");
+ }
+ else
+ {
+ $self->ip ("<obj type='" . ref($x) . "'>");
+
+ if ($x->isa ('XML::XQL::PrimitiveType'))
+ {
+ $self->p ($x->xql_toString);
+ }
+ else
+ {
+ $self->p ("\n");
+ $self->{Indent}++;
+
+ if ($x->isa ("XML::DOM::Node"))
+ {
+ # print node plus subnodes as XML
+ $self->p ($x->toString);
+ }
+ $self->p ("\n");
+
+ $self->{Indent}--;
+ $self->indent;
+ }
+ $self->p ("</obj>\n");
+ }
+ }
+ elsif (defined $x)
+ {
+ $self->indent;
+ $self->p ("<str>$x<str/>\n");
+ }
+ else
+ {
+ $self->indent;
+ $self->p ("<undef/>\n");
+ }
+}
+
+sub p
+{
+ my $self = shift;
+
+ if ($self->{Dump})
+ {
+ print @;
+ }
+ else
+ {
+ $self->{Str} .= join ("", @_);
+ }
+}
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL/DirXQL.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,974 @@
+# Attibute Definitions:
+#
+# name: Text - name of file, dir, ...
+# ext: Text - file extension
+# no_ext: Text - name without ext
+# full: Text - full path name
+# abs: Text - absolute path name
+#
+# M,age: Number - Age of file (in days)
+# [since script started says man(perlfunc)??]
+# cre,create: Date (see age)
+# A,acc_in_days: Number - Last access time in days
+# acc,access: Date (see A)
+# set with utime()
+# f,is_file: Boolean
+# d,is_dir: Boolean
+# l,is_link: Boolean
+# p,is_pipe: Boolean
+# e,exists: Boolean
+# z,is_zero: Boolean - whether size equals zero bytes
+# r,readable: Boolean
+# w,writable: Boolean
+# x,executable: Boolean
+# o,owned: Boolean - whether it is owned (by effective uid)
+#
+#---------------------------------------------------------------------------
+# Todo:
+# - implement abs(): absolute filepath
+# - support links: use lstat(), @link
+# - flags: -R,-W,-X,-O (by real uid/gid instead of effective uid,
+# -S (is_socket), -b (block special file), -c (char. special file),
+# -t Filehandle is opened to a tty.
+# -u File has setuid bit set.
+# -g File has setgid bit set.
+# -k File has sticky bit set.
+# -T File is a text file.
+# -B File is a binary file (opposite of -T).
+# -C inode change time in days.
+# set with utime() ??
+#
+# stat() fields:
+#
+# 0 dev device number of filesystem
+# 1 ino inode number
+# 2 mode file mode (type and permissions)
+# add mode_str ??: "rwxr-xr--"
+# 3 nlink number of (hard) links to the file
+# 4 uid numeric user ID of file's owner
+# add uname
+# 5 gid numeric group ID of file's owner
+# add gname
+# 6 rdev the device identifier (special files only)
+# x 7 size total size of file, in bytes
+# - 8 atime last access time since the epoch
+# - 9 mtime last modify time since the epoch
+# - 10 ctime inode change time (NOT creation time!) since the epoch
+# 11 blksize preferred block size for file system I/O
+# 12 blocks actual number of blocks allocated
+
+package XML::XQL::DirXQL;
+
+use strict;
+use XML::XQL;
+use XML::XQL::Date;
+
+sub dirxql
+{
+ my ($context, $list, $filepath) = @_;
+
+ $filepath = XML::XQL::toList ($filepath->solve ($context, $list));
+ my @result;
+ for my $file (@$filepath)
+ {
+ push @result, XML::XQL::DirDoc->new (Root => $file->xql_toString)->root;
+ }
+ \@result;
+}
+
+XML::XQL::defineFunction ("dirxql", \&XML::XQL::DirXQL::dirxql, 1, 1);
+
+package XML::XQL::DirNode;
+# extended by: DirDoc, DirAttr, DirElem (File, Dir), FileContents
+
+use vars qw{ @ISA $SEP };
+@ISA = qw{ XML::XQL::Node };
+
+# Directory path separator (default: Unix)
+$SEP = "/";
+
+if ((defined $^O and
+ $^O =~ /MSWin32/i ||
+ $^O =~ /Windows_95/i ||
+ $^O =~ /Windows_NT/i) ||
+ (defined $ENV{OS} and
+ $ENV{OS} =~ /MSWin32/i ||
+ $ENV{OS} =~ /Windows_95/i ||
+ $ENV{OS} =~ /Windows_NT/i))
+{
+ $SEP = "\\"; # Win32
+}
+elsif ((defined $^O and $^O =~ /MacOS/i) ||
+ (defined $ENV{OS} and $ENV{OS} =~ /MacOS/i))
+{
+ $SEP = ":"; # Mac
+}
+
+sub isElementNode { 0 }
+sub isTextNode { 0 }
+sub xql_parent { $_[0]->{Parent} }
+#sub xql_document { $_[0]->{Doc} }
+sub xml_xqlString { $_[0]->toString }
+
+sub xql
+{
+ my $self = shift;
+
+ # Odd number of args, assume first is XQL expression without 'Expr' key
+ unshift @_, 'Expr' if (@_ % 2 == 1);
+ my $query = new XML::XQL::Query (@_);
+ $query->solve ($self);
+}
+
+sub xql_sortKey
+{
+ my $key = $_[0]->{SortKey};
+ return $key if defined $key;
+
+ $key = XML::XQL::createSortKey ($_[0]->{Parent}->xql_sortKey,
+ $_[0]->xql_childIndex, 1);
+#print "xql_sortKey $_[0] ind=" . $_[0]->xql_childIndex . " key=$key str=" . XML::XQL::keyStr($key) . "\n";
+ $_[0]->{SortKey} = $key;
+}
+
+sub xql_node
+{
+ my $self = shift;
+ $self->build unless $self->{Built};
+
+ $self->{C};
+}
+
+sub getChildIndex
+{
+ my ($self, $kid) = @_;
+ my $i = 0;
+ for (@{ $self->xql_node })
+ {
+ return $i if $kid == $_;
+ $i++;
+ }
+ return -1;
+}
+
+sub xql_childIndex
+{
+ $_[0]->{Parent}->getChildIndex ($_[0]);
+}
+
+# As it appears in the XML document
+sub xql_xmlString
+{
+ $_[0]->toString;
+#?? impl.
+}
+
+sub create_date_from_days
+{
+ my ($days, $srcNode) = @_;
+ my $secs = int (0.5 + $days * 24 * 3600 );
+
+ my $internal = Date::Manip::DateCalc ("today", "- $secs seconds");
+
+ new XML::XQL::Date (SourceNode => $srcNode,
+ Internal => $internal,
+ String => $internal );
+}
+
+#------ WHITESPACE STUFF (DELETE??)
+
+# Find previous sibling that is not a text node with ignorable whitespace
+sub xql_prevNonWS
+{
+ my $self = shift;
+ my $parent = $self->{Parent};
+ return unless $parent;
+
+ for (my $i = $parent->getChildIndex ($self) - 1; $i >= 0; $i--)
+ {
+ my $node = $parent->getChildAtIndex ($i);
+ return $node unless $node->xql_isIgnorableWS; # skip whitespace
+ }
+ undef;
+}
+
+# True if it's a Text node with just whitespace and xml::space != "preserve"
+sub xql_isIgnorableWS
+{
+ 0;
+}
+
+# Whether the node should preserve whitespace
+# It should if it has attribute xml:space="preserve"
+sub xql_preserveSpace
+{
+ $_[0]->{Parent}->xql_preserveSpace;
+}
+
+#---------------------------------------------------------------------------
+package XML::XQL::DirDoc; # The Document
+use vars qw{ @ISA };
+@ISA = qw{ XML::XQL::DirNode };
+
+sub new
+{
+ my ($type, %hash) = @_;
+ my $self = bless \%hash, $type;
+
+ $self->{Root} = "." unless exists $self->{Root};
+
+ my $dirname;
+ if ($self->{Root} =~ /^(.+)\Q${XML::XQL::DirNode::SEP}\E(.+)$/)
+ {
+ $self->{Prefix} = $1;
+ $dirname = $2;
+ }
+ else
+ {
+ $self->{Prefix} = "";
+ $dirname = $self->{Root};
+ }
+
+ $self->{Dir} = new XML::XQL::Dir (TagName => $dirname, Parent => $self);
+ $self->{Built} = 1;
+
+ return $self;
+}
+
+sub xql
+{
+ shift->root->xql (@_);
+}
+
+sub root { $_[0]->{Dir} }
+
+sub isElementNode { 0 }
+sub xql_nodeType { 9 }
+sub xql_childCount { 1 }
+sub fullname { $_[0]->{Prefix} }
+sub xql_sortKey { "" }
+sub xql_parent { undef }
+sub xql_nodeName { "#document" }
+sub depth { 0 }
+sub xql_node { [ $_[0]->{Dir} ] }
+
+sub xql_element
+{
+ my ($self, $elem) = @_;
+
+ my $dir = $self->{Dir};
+ if (defined $elem)
+ {
+ return [ $dir ] if $dir->{TagName} eq $elem;
+ }
+ else
+ {
+ return [ $dir ];
+ }
+}
+
+# By default the elements in a document don't preserve whitespace
+sub xql_preserveSpace
+{
+ 0;
+}
+
+sub toString
+{
+ $_[0]->root->toString;
+}
+
+#----------------------------------------------------------------------------
+package XML::XQL::DirAttrDef; # Definitions for DirAttr nodes
+
+sub new
+{
+ my ($type, %hash) = @_;
+ bless \%hash, $type;
+}
+
+sub dump
+{
+ print $_[0]->toString . "\n";
+}
+
+sub toString
+{
+ my $self = shift;
+ print "DirAttrDef $self\n";
+ my $i = 0;
+ for my $attrName ($self->in_order)
+ {
+ my $a = $self->{$attrName};
+ print "[$i] name=$attrName"; $i++;
+ print " order=" . $a->{Order};
+ print " get=" . $a->{Get} if defined $a->{Get};
+ print " set=" . $a->{Set} if defined $a->{Set};
+ if (defined $a->{Alias})
+ {
+ print " alias=" . join (",", @{ $a->{Alias} });
+ }
+ print "\n";
+ }
+ if (defined $self->{'@ALIAS'})
+ {
+ print "Alias: ";
+ my $alias = $self->{'@ALIAS'};
+
+ print join (",", map { "$_=" . $alias->{$_} } keys %$alias);
+ print "\n";
+ }
+}
+
+sub clone
+{
+ my $self = shift;
+ my $n = new XML::XQL::DirAttrDef;
+ $n->{'@IN_ORDER'} = [ @{ $self->{'@IN_ORDER'} } ];
+
+ for my $a (@{ $self->{'@IN_ORDER'} })
+ {
+ $n->{$a} = { %{ $self->{$a} } };
+ $n->{$a}->{Alias} = [ @{ $self->{$a}->{Alias} } ]
+ if defined $self->{$a}->{Alias};
+ }
+ $n->{'@ALIAS'} = { %{ $self->{'@ALIAS'} } }
+ if defined $self->{'@ALIAS'};
+
+ return $n;
+}
+
+sub in_order { defined $_[0]->{'@IN_ORDER'} ? @{ $_[0]->{'@IN_ORDER'} } : () }
+sub alias { $_[0]->{'@ALIAS'}->{$_[1]} }
+sub order { $_[0]->{$_[1]}->{Order} }
+sub get { $_[0]->{$_[1]}->{Get} }
+sub set { $_[0]->{$_[1]}->{Set} }
+
+sub remove_attr
+{
+ my ($self, $name) = @_;
+ next unless defined $self->{$name};
+
+ my $order = $self->{$name}->{Order};
+ my @in_order = $self->in_order;
+ splice @in_order, $order, 1;
+
+ # Reassign Order numbers
+ for (my $i = 0; $i < @in_order; $i++)
+ {
+ $self->{$name}->{Order} = $i;
+ }
+ $self->{'@IN_ORDER'} = \@in_order;
+
+ delete $self->{$name};
+}
+
+sub define_attr
+{
+ my ($self, %hash) = @_;
+ my $name = $hash{Name};
+
+ if (defined $self->{$name})
+ {
+ $hash{Order} = $self->{$name}->{Order} unless defined $hash{Order};
+ $self->remove_attr ($name);
+ }
+
+ my @in_order = $self->in_order;
+ $hash{Order} = -1
+ if $hash{Order} >= @in_order;
+
+ if ($hash{Order} == -1)
+ {
+ push @in_order, $name;
+ }
+ else
+ {
+ splice @in_order, $hash{Order}, 0, $name;
+ }
+ $self->{$name} = \%hash;
+
+ # Reassign Order numbers
+ for (my $i = 0; $i < @in_order; $i++)
+ {
+ $self->{$name}->{Order} = $i;
+ }
+ $self->{'@IN_ORDER'} = \@in_order;
+
+ my @alias = defined $hash{Alias} ? @{ $hash{Alias} } : ();
+ for (@alias)
+ {
+ $self->{'@ALIAS'}->{$_} = $name;
+ }
+}
+
+#----------------------------------------------------------------------------
+package XML::XQL::DirAttr; # Attr node
+use vars qw{ @ISA %GET_ATTR_FUNC %SET_ATTR_FUNC };
+@ISA = qw{ XML::XQL::DirNode };
+
+sub new
+{
+ my ($type, %hash) = @_;
+ my $self = bless \%hash, $type;
+
+ $self->{xql_value} = $self->{Parent}->{AttrDef}->get ($hash{Name});
+ $self->{xql_setValue} = $self->{Parent}->{AttrDef}->set ($hash{Name});
+ $self;
+}
+
+sub isElementNode { 0 }
+sub xql_nodeType { 2 }
+sub xql_nodeName { $_[0]->{Name} }
+sub xql_childIndex { $_[0]->{Parent}->attrIndex ($_[0]->{Name}) }
+sub xql_childCount { 0 }
+sub xql_node { [] }
+sub is_defined { exists $_[0]->{Value} }
+
+sub create { XML::XQL::DirNode::create_date_from_days ($_[0]->{Parent}->age, $_[0]) }
+sub age { new XML::XQL::Number ($_[0]->{Parent}->age, $_[0]) }
+sub size { new XML::XQL::Text ($_[0]->{Parent}->size, $_[0]) }
+sub ext { new XML::XQL::Text ($_[0]->{Parent}->ext, $_[0]) }
+sub no_ext { new XML::XQL::Text ($_[0]->{Parent}->no_ext, $_[0]) }
+sub name { new XML::XQL::Text ($_[0]->{Parent}->name, $_[0]) }
+sub full { new XML::XQL::Text ($_[0]->{Parent}->full, $_[0]) }
+sub abs { new XML::XQL::Text ($_[0]->{Parent}->abs, $_[0]) }
+sub is_file { new XML::XQL::Boolean ($_[0]->{Parent}->is_file, $_[0]) }
+sub is_dir { new XML::XQL::Boolean ($_[0]->{Parent}->is_dir, $_[0]) }
+sub is_link { new XML::XQL::Boolean ($_[0]->{Parent}->is_link, $_[0]) }
+sub is_pipe { new XML::XQL::Boolean ($_[0]->{Parent}->is_pipe, $_[0]) }
+sub it_exists { new XML::XQL::Boolean ($_[0]->{Parent}->it_exists, $_[0]) }
+sub is_zero { new XML::XQL::Boolean ($_[0]->{Parent}->is_zero, $_[0]) }
+sub readable { new XML::XQL::Boolean ($_[0]->{Parent}->readable, $_[0]) }
+sub writable { new XML::XQL::Boolean ($_[0]->{Parent}->writable, $_[0]) }
+sub executable { new XML::XQL::Boolean ($_[0]->{Parent}->executable, $_[0]) }
+sub owned { new XML::XQL::Boolean ($_[0]->{Parent}->owned, $_[0]) }
+
+sub last_access_in_days
+{
+ new XML::XQL::Number ($_[0]->{Parent}->last_access_in_days, $_[0]);
+}
+
+sub last_access
+{
+ XML::XQL::DirNode::create_date_from_days ($_[0]->{Parent}->last_access_in_days, $_[0]);
+}
+
+sub toString
+{
+ my $old = ""; #$_[0]->is_defined ? "" : " (undef)";
+ my $val = $_[0]->xql_value->xql_toString; #exists $_[0]->{Value} ? $_[0]->{Value}->xql_toString : "(undef)";
+ $_[0]->{Name} . "=\"$val$old\""
+#?? encodeAttrValue
+}
+
+sub xql_value
+{
+ $_[0]->{Value} ||= &{ $_[0]->{xql_value} } (@_);
+}
+
+sub xql_setValue
+{
+ my ($self, $text) = @_;
+ my $set = $_[0]->{xql_setValue};
+ if (defined $set)
+ {
+ &$set ($self, $text);
+ }
+ else
+ {
+ warn "xql_setValue not defined for DirAttr name=" . $self->{TagName};
+ }
+}
+
+sub set_name
+{
+ my ($attr, $text) = @_;
+ $attr->{Parent}->set_name ($text);
+}
+
+sub set_ext
+{
+ my ($attr, $text) = @_;
+ $attr->{Parent}->set_ext ($text);
+}
+
+sub set_no_ext
+{
+ my ($attr, $text) = @_;
+ $attr->{Parent}->set_no_ext ($text);
+}
+
+#----------------------------------------------------------------------------
+package XML::XQL::DirElem; # File or Dir
+use vars qw{ @ISA $ATTRDEF };
+@ISA = qw( XML::XQL::DirNode );
+
+$ATTRDEF = new XML::XQL::DirAttrDef;
+$ATTRDEF->define_attr (Name => 'name', Get => \&XML::XQL::DirAttr::name,
+ Set => \&XML::XQL::DirAttr::set_name);
+$ATTRDEF->define_attr (Name => 'full', Get => \&XML::XQL::DirAttr::full);
+$ATTRDEF->define_attr (Name => 'abs', Get => \&XML::XQL::DirAttr::abs);
+$ATTRDEF->define_attr (Name => 'no_ext', Get => \&XML::XQL::DirAttr::no_ext,
+ Set => \&XML::XQL::DirAttr::set_no_ext);
+$ATTRDEF->define_attr (Name => 'ext', Get => \&XML::XQL::DirAttr::ext,
+ Set => \&XML::XQL::DirAttr::set_ext);
+
+$ATTRDEF->define_attr (Name => 'age', Get => \&XML::XQL::DirAttr::age,
+ Alias => [ 'M' ] );
+$ATTRDEF->define_attr (Name => 'create', Get => \&XML::XQL::DirAttr::create,
+ Alias => [ 'cre' ] );
+$ATTRDEF->define_attr (Name => 'A', Get => \&XML::XQL::DirAttr::last_access_in_days,
+ Alias => [ 'acc_in_days' ] );
+$ATTRDEF->define_attr (Name => 'access', Get => \&XML::XQL::DirAttr::last_access,
+ Alias => [ 'acc' ] );
+
+# These should only be implemented for Link and Pipe resp. !!
+$ATTRDEF->define_attr (Name => 'l', Get => \&XML::XQL::DirAttr::is_link,
+ Alias => [ 'is_link' ] );
+$ATTRDEF->define_attr (Name => 'p', Get => \&XML::XQL::DirAttr::is_pipe,
+ Alias => [ 'is_pipe' ] );
+
+$ATTRDEF->define_attr (Name => 'e', Get => \&XML::XQL::DirAttr::it_exists,
+ Alias => [ 'exists' ] );
+$ATTRDEF->define_attr (Name => 'z', Get => \&XML::XQL::DirAttr::is_zero,
+ Alias => [ 'is_zero' ] );
+$ATTRDEF->define_attr (Name => 'r', Get => \&XML::XQL::DirAttr::readable,
+ Alias => [ 'readable' ] );
+$ATTRDEF->define_attr (Name => 'w', Get => \&XML::XQL::DirAttr::writable,
+ Alias => [ 'writable' ] );
+$ATTRDEF->define_attr (Name => 'x', Get => \&XML::XQL::DirAttr::executable,
+ Alias => [ 'is_zero' ] );
+$ATTRDEF->define_attr (Name => 'o', Get => \&XML::XQL::DirAttr::owned,
+ Alias => [ 'owned' ] );
+
+#dump_attr_def();
+
+# mod => 0,
+# create => 1,
+# prot => 2,
+# protn => 3,
+# name => 4,
+# path => 5,
+# dir => 6,
+
+sub isElementNode { 1 }
+sub xql_nodeType { 1 }
+sub xql_nodeName { $_[0]->{TagName} }
+
+sub dump_attr_def { $ATTRDEF->dump; }
+sub attrNames { @{ $_[0]->{AttrDef}->{'@IN_ORDER'} } }
+sub hasAttr { exists $_[0]->{AttrDef}->{$_[1]} }
+
+# Attributes set/get
+sub full { $_[0]->fullname }
+sub abs { $_[0]->abs }
+sub no_ext { $_[0]->{TagName} }
+sub set_no_ext { shift->set_name (@_) }
+sub size { -s $_[0]->fullname }
+sub age { -M $_[0]->fullname }
+sub last_access_in_days { -A $_[0]->fullname }
+sub is_file { -f $_[0]->fullname }
+sub is_dir { -d $_[0]->fullname }
+sub is_link { -l $_[0]->fullname }
+sub is_pipe { -p $_[0]->fullname }
+sub it_exists { -e $_[0]->fullname }
+sub is_zero { -z $_[0]->fullname }
+sub readable { -r $_[0]->fullname }
+sub writable { -w $_[0]->fullname }
+sub executable { -x $_[0]->fullname }
+sub owned { -o $_[0]->fullname }
+
+sub attr_alias
+{
+ return undef unless defined $_[1];
+
+ my $alias = $_[0]->{AttrDef}->alias ($_[1]);
+ defined $alias ? $alias : $_[1];
+}
+
+sub create_path # static
+{
+ my ($dir, $file) = @_;
+
+ if ($dir =~ /\Q${XML::XQL::DirNode::SEP}\E$/)
+ {
+ return "$dir$file";
+ }
+ elsif ($dir eq "") # e.g. when file is root directory '/'
+ {
+ return $file;
+ }
+ else
+ {
+ return "$dir${XML::XQL::DirNode::SEP}$file";
+ }
+}
+
+sub fullname
+{
+ my $pa = $_[0]->{Parent}->fullname;
+ my $name = $_[0]->{TagName};
+ create_path ($pa, $name);
+}
+
+#?? same as full name - for now
+sub abs
+{
+ shift->fullname (@_);
+}
+
+sub parent_dir
+{
+ $_[0]->{Parent}->fullname;
+}
+
+# With 3 params, sets the specified attribute with $attrName to $attrValue.
+# With 2 params, reinitializes the specified attribute with $attrName if
+# it currently has a value.
+
+sub update_attr
+{
+ my ($self, $attrName, $attrValue) = @_;
+
+ if (@_ == 3)
+ {
+ my $attr = $self->getAttributeNode ($attrName);
+ if (defined $attr && defined $attr->{Value})
+ {
+ $attr->{Value} = $attrValue;
+ }
+ }
+ else
+ {
+ return unless exists $self->{A}->{$attrName};
+ my $a = $self->{A}->{$attrName};
+ if (exists $a->{Value})
+ {
+ delete $a->{Value};
+ $a->xql_value; # reinitialize value
+ }
+ }
+}
+
+sub set_name
+{
+ my ($self, $text) = @_;
+ my $fullName = $self->fullname;
+ my $newName = create_path ($self->parent_dir, $text);
+
+ if (rename ($fullName, $newName))
+ {
+ $self->{TagName} = $text;
+ $self->update_attr ('name', $text);
+ $self->update_attr ('ext');
+ $self->update_attr ('no_ext');
+
+ return 1;
+ }
+ else
+ {
+ warn "set_name: could not rename $fullName to $newName";
+ return 0;
+ }
+}
+
+sub ext
+{
+ my $name = $_[0]->{TagName};
+ $name =~ /\.([^.]+)$/;
+# print "ext name=$name ext=$1\n";
+ return $1;
+}
+
+sub set_ext
+{
+ my ($self, $text) = @_;
+# print "set_ext $text\n";
+ my $no_ext = $self->no_ext;
+ $self->set_name (length ($text) ? "$no_ext.$text" : $no_ext);
+}
+
+sub no_ext
+{
+ my $name = $_[0]->{TagName};
+ $name =~ /^(.+)\.([^.]+)$/;
+# print "no_ext name=$name no_ext=$1\n";
+ return $1;
+}
+
+sub set_no_ext
+{
+ my ($self, $text) = @_;
+# print "set_no_ext $text\n";
+ my $ext = $self->ext;
+ $self->set_name (length ($ext) ? "$text.$ext" : $text);
+}
+
+sub xql_attribute
+{
+ my ($node, $attrName) = @_;
+ if (defined $attrName)
+ {
+ my $attr = $node->getAttributeNode ($attrName);
+ defined ($attr) ? [ $attr ] : [];
+ }
+ else
+ {
+ my @attr;
+ for my $name ($node->attrNames)
+ {
+ push @attr, $node->getAttributeNode ($name);
+ }
+ \@attr;
+ }
+}
+
+sub getAttributeNode
+{
+ my ($self, $attrName) = @_;
+ $attrName = $self->attr_alias ($attrName);
+
+ return undef unless $self->hasAttr ($attrName);
+
+ my $attr = $_[0]->{A}->{$attrName} ||=
+ new XML::XQL::DirAttr (Parent => $self, Name => $attrName);
+ $attr;
+}
+
+sub attrIndex
+{
+ $_[0]->{AttrDef}->order ($_[1]);
+}
+
+sub toString
+{
+ my ($self, $depth) = @_;
+ my $indent = " " x $depth;
+ my $str = $indent;
+ my $tagName = $self->{TagName};
+
+ my $tfp = $self->tag_for_print;
+
+ $str .= "<$tfp name=\"$tagName\"";
+
+ for my $attrName ($self->attrNames)
+ {
+ next unless exists $self->{A}->{$attrName};
+
+#?? don't print un-retrieved attributes - for now
+ my $attr = $self->{A}->{$attrName};
+ next unless $attr->is_defined;
+
+ $str .= " " . $attr->toString;
+ }
+
+ my $kids = $self->print_kids ? $self->xql_node : [];
+ if (@$kids)
+ {
+ $str .= ">\n";
+ for (@$kids)
+ {
+ $str .= $_->toString ($depth + 1);
+ }
+ $str .= $indent . "</dir>\n";
+ }
+ else
+ {
+ $str .= "/>\n";
+ }
+}
+
+#----------------------------------------------------------------------------
+package XML::XQL::Dir; # Element node
+use vars qw{ @ISA $ATTRDEF };
+@ISA = qw( XML::XQL::DirElem );
+
+$ATTRDEF = $XML::XQL::DirElem::ATTRDEF->clone;
+$ATTRDEF->define_attr (Name => 'd', Get => \&XML::XQL::DirAttr::is_dir,
+ Alias => [ 'is_dir' ] );
+#dump_attr_def();
+
+sub tag_for_print { "dir" }
+sub print_kids { 1 }
+sub dump_attr_def { $ATTRDEF->dump }
+
+sub new
+{
+ my ($type, %hash) = @_;
+ $hash{AttrDef} = $ATTRDEF;
+ bless \%hash, $type;
+}
+
+sub build
+{
+ my ($self) = @_;
+ my $dirname = $self->fullname;
+# print "dirname=$dirname\n";
+
+ if (opendir (DIR, $dirname))
+ {
+ my @kids;
+
+ my @f = readdir (DIR);
+ closedir DIR;
+
+ for my $f (@f)
+ {
+ next if $f =~ /^..?$/;
+# print "dirname=$dirname f=$f\n";
+
+ my $full = defined $dirname ? "$dirname${XML::XQL::DirNode::SEP}$f" : $f;
+# print "dirname=$dirname full=$full\n";
+
+ if (-f $full)
+ {
+ push @kids, XML::XQL::File->new (Parent => $self,
+ TagName => $f
+ );
+ }
+ elsif (-d _)
+ {
+ push @kids, XML::XQL::Dir->new (Parent => $self,
+ TagName => $f
+ );
+ }
+ }
+ $self->{C} = \@kids;
+ $self->{Built} = 1;
+ }
+ else
+ {
+ print "can't opendir $dirname: $!";
+ }
+}
+
+sub xql_childCount
+{
+ my $self = shift;
+ $self->build unless $self->{Built};
+ my $ch = $self->{C};
+
+ defined $ch ? scalar(@$ch) : 0;
+}
+
+#----------------------------------------------------------------------------
+package XML::XQL::File; # Element node
+use vars qw{ @ISA $ATTRDEF };
+@ISA = qw( XML::XQL::DirElem );
+
+$ATTRDEF = $XML::XQL::DirElem::ATTRDEF->clone;
+$ATTRDEF->define_attr (Name => 'f', Get => \&XML::XQL::DirAttr::is_file,
+ Alias => [ 'is_file' ] );
+$ATTRDEF->define_attr (Name => 'size', Get => \&XML::XQL::DirAttr::size,
+ Alias => [ 's' ]);
+#dump_attr_def();
+
+sub new
+{
+ my ($type, %hash) = @_;
+ $hash{AttrDef} = $ATTRDEF;
+ bless \%hash, $type;
+}
+
+sub getChildIndex { 0 }
+sub xql_childCount { 1 }
+sub contents { $_[0]->build unless $_[0]->{Built}; $_[0]->{C}->[0] }
+sub xql_text { $_[0]->contents->xql_text }
+sub xql_rawText { $_[0]->contents->xql_text }
+sub tag_for_print { "file" }
+sub print_kids { 0 }
+sub dump_attr_def { $ATTRDEF->dump }
+
+sub xql_rawTextBlocks
+{
+ my $self = shift;
+ ( [ 0, 0, $self->xql_text ])
+}
+
+sub xql_setValue
+{
+ my ($self, $text) = @_;
+ $self->contents->xql_setValue ($text);
+}
+
+sub xql_replaceBlockWithText
+{
+ my ($self, $start, $end, $text) = @_;
+ if ($start == 0 && $end == 0)
+ {
+ $self->xql_setValue ($text);
+ }
+ else
+ {
+ warn "xql_setText bad index start=$start end=$end";
+ }
+}
+
+sub build
+{
+ my $self = shift;
+ push @{ $self->{C} }, XML::XQL::FileContents->new (Parent => $self);
+ $self->{Built} = 1;
+}
+
+#----------------------------------------------------------------------------
+package XML::XQL::FileContents; # Text node
+use vars qw{ @ISA };
+@ISA = qw{ XML::XQL::DirNode };
+
+sub new
+{
+ my ($type, %hash) = @_;
+ bless \%hash, $type;
+}
+
+sub isTextNode { 1 }
+sub xql_nodeType { 3 }
+sub xql_nodeName { "#contents" }
+sub getChildIndex { 0 }
+sub xql_childCount { 0 }
+sub xql_rawText { $_[0]->xql_text }
+
+sub xql_text
+{
+ my $self = shift;
+ unless ($self->{Built})
+ {
+ local *FILE;
+ local $/; # slurp mode
+
+ if (open (FILE, $self->{Parent}->fullname))
+ {
+ $self->{Data} = <FILE>;
+ close FILE;
+ }
+ else
+ {
+#?? warning
+ }
+ $self->{Built} = 1;
+ }
+ $self->{Data};
+}
+
+sub xql_setValue
+{
+ my ($self, $text) = @_;
+
+ my $filename = $self->{Parent}->fullname;
+ local *FILE;
+ if (open (FILE, ">$filename"))
+ {
+ print FILE $text;
+ $self->{Data} = $text;
+ $self->{Built} = 1;
+ close FILE;
+ }
+ else
+ {
+ warn "xql_setValue could not open $filename for writing";
+ }
+}
+
+return 1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL/Parser.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1438 @@
+#########################################################################
+#
+# This file was generated using Parse::Yapp version 0.16.
+#
+# Don't edit this file, use source file instead.
+#
+# ANY CHANGE MADE HERE WILL BE LOST !
+#
+#########################################################################
+package XML::XQL::Parser;
+use vars qw ( @ISA );
+use strict;
+
+@ISA= qw ( Parse::Yapp::Driver );
+use Parse::Yapp::Driver;
+
+
+
+sub new {
+ my($class)=shift;
+ ref($class)
+ and $class=ref($class);
+
+ my($self)=$class->SUPER::new( yyversion => '0.16',
+ yystates =>
+[
+ {#State 0
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11,
+ "not" => 17
+ },
+ GOTOS => {
+ 'WildQName' => 19,
+ 'WildNCName' => 18,
+ 'Filter' => 1,
+ 'Union' => 21,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'Conjunction' => 5,
+ 'Disjunction' => 6,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Negation' => 26,
+ 'Query' => 27,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Sequence' => 31,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 1
+ ACTIONS => {
+ "[" => 36
+ },
+ DEFAULT => -51,
+ GOTOS => {
+ 'Subscript_2' => 37
+ }
+ },
+ {#State 2
+ DEFAULT => -43
+ },
+ {#State 3
+ ACTIONS => {
+ 'MATCH' => 40,
+ 'COMPARE' => 39
+ },
+ GOTOS => {
+ 'ComparisonOp' => 38
+ }
+ },
+ {#State 4
+ DEFAULT => -65
+ },
+ {#State 5
+ ACTIONS => {
+ "or" => 41
+ },
+ DEFAULT => -21
+ },
+ {#State 6
+ ACTIONS => {
+ 'SeqOp' => 42
+ },
+ DEFAULT => -19
+ },
+ {#State 7
+ DEFAULT => -67
+ },
+ {#State 8
+ DEFAULT => -59
+ },
+ {#State 9
+ DEFAULT => -42
+ },
+ {#State 10
+ ACTIONS => {
+ 'COMPARE' => -37,
+ 'MATCH' => -37
+ },
+ DEFAULT => -33
+ },
+ {#State 11
+ ACTIONS => {
+ "*" => 29,
+ 'NCName' => 25
+ },
+ GOTOS => {
+ 'WildQName' => 43,
+ 'WildNCName' => 18
+ }
+ },
+ {#State 12
+ DEFAULT => -62
+ },
+ {#State 13
+ DEFAULT => -68
+ },
+ {#State 14
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Filter' => 1,
+ 'Bang' => 30,
+ 'RelativePath' => 2,
+ 'LValue' => 44,
+ 'Invocation' => 32,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 45,
+ 'Subscript' => 35
+ }
+ },
+ {#State 15
+ ACTIONS => {
+ 'UnionOp' => 46
+ },
+ DEFAULT => -27
+ },
+ {#State 16
+ ACTIONS => {
+ ".." => -17,
+ 'XQLName_Paren' => -17,
+ "\@" => -17,
+ 'NCName' => -17,
+ "(" => -17,
+ "*" => -17,
+ "." => -17
+ },
+ DEFAULT => -44
+ },
+ {#State 17
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11,
+ "not" => 17
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'Union' => 21,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Negation' => 47,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 18
+ ACTIONS => {
+ ":" => 48
+ },
+ DEFAULT => -4
+ },
+ {#State 19
+ DEFAULT => -10
+ },
+ {#State 20
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Filter' => 1,
+ 'Bang' => 30,
+ 'RelativePath' => 2,
+ 'LValue' => 49,
+ 'Invocation' => 32,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 45,
+ 'Subscript' => 35
+ }
+ },
+ {#State 21
+ DEFAULT => -25
+ },
+ {#State 22
+ ACTIONS => {
+ 'NCName' => 25,
+ 'TEXT' => 50,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ ")" => 54,
+ "*" => 29,
+ 'NUMBER' => 51,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11,
+ 'INTEGER' => 53,
+ "not" => 17
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'Union' => 21,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'Conjunction' => 5,
+ 'Disjunction' => 52,
+ 'Invocation_2' => 55,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'Param' => 56,
+ 'RelativeTerm' => 12,
+ 'Negation' => 26,
+ 'AttributeName' => 13,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 23
+ DEFAULT => -18
+ },
+ {#State 24
+ ACTIONS => {
+ "*" => 29,
+ 'NCName' => 25,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "(" => 28,
+ "\@" => 11
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Filter' => 1,
+ 'Bang' => 30,
+ 'RelativePath' => 57,
+ 'Invocation' => 32,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'Subscript' => 35
+ }
+ },
+ {#State 25
+ DEFAULT => -2
+ },
+ {#State 26
+ ACTIONS => {
+ "and" => 58
+ },
+ DEFAULT => -23
+ },
+ {#State 27
+ ACTIONS => {
+ '' => 59
+ }
+ },
+ {#State 28
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11,
+ "not" => 17
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'Union' => 21,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'Conjunction' => 5,
+ 'Disjunction' => 6,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Negation' => 26,
+ 'Query' => 60,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Sequence' => 31,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 29
+ DEFAULT => -3
+ },
+ {#State 30
+ ACTIONS => {
+ "//" => 23,
+ "/" => 61
+ },
+ DEFAULT => -46,
+ GOTOS => {
+ 'PathOp' => 62
+ }
+ },
+ {#State 31
+ DEFAULT => -1
+ },
+ {#State 32
+ DEFAULT => -66
+ },
+ {#State 33
+ ACTIONS => {
+ "intersect" => 63
+ },
+ DEFAULT => -29
+ },
+ {#State 34
+ DEFAULT => -64
+ },
+ {#State 35
+ ACTIONS => {
+ "!" => 64
+ },
+ DEFAULT => -48
+ },
+ {#State 36
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ 'INTEGER' => 65,
+ "\@" => 11,
+ "not" => 17
+ },
+ GOTOS => {
+ 'Subquery' => 67,
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'Union' => 21,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'Conjunction' => 5,
+ 'Disjunction' => 6,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Range' => 68,
+ 'Path' => 10,
+ 'IndexArg' => 69,
+ 'RelativeTerm' => 12,
+ 'IndexList' => 66,
+ 'AttributeName' => 13,
+ 'Negation' => 26,
+ 'Query' => 70,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Sequence' => 31,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 37
+ DEFAULT => -50
+ },
+ {#State 38
+ ACTIONS => {
+ 'NCName' => 25,
+ 'TEXT' => 71,
+ "(" => 28,
+ "*" => 29,
+ 'NUMBER' => 72,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ 'INTEGER' => 74,
+ "\@" => 11
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Filter' => 1,
+ 'Bang' => 30,
+ 'RelativePath' => 2,
+ 'Invocation' => 32,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 73,
+ 'Subscript' => 35,
+ 'RValue' => 75
+ }
+ },
+ {#State 39
+ DEFAULT => -31
+ },
+ {#State 40
+ DEFAULT => -32
+ },
+ {#State 41
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11,
+ "not" => 17
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'Union' => 21,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'Conjunction' => 5,
+ 'Disjunction' => 76,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Negation' => 26,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 42
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11,
+ "not" => 17
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'Union' => 21,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'Conjunction' => 5,
+ 'Disjunction' => 6,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Negation' => 26,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Sequence' => 77,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 43
+ DEFAULT => -11
+ },
+ {#State 44
+ ACTIONS => {
+ 'MATCH' => 40,
+ 'COMPARE' => 39
+ },
+ GOTOS => {
+ 'ComparisonOp' => 78
+ }
+ },
+ {#State 45
+ DEFAULT => -37
+ },
+ {#State 46
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'Union' => 79,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 47
+ DEFAULT => -26
+ },
+ {#State 48
+ ACTIONS => {
+ "*" => 29,
+ 'NCName' => 25
+ },
+ GOTOS => {
+ 'WildNCName' => 80
+ }
+ },
+ {#State 49
+ ACTIONS => {
+ 'MATCH' => 40,
+ 'COMPARE' => 39
+ },
+ GOTOS => {
+ 'ComparisonOp' => 81
+ }
+ },
+ {#State 50
+ DEFAULT => -9
+ },
+ {#State 51
+ DEFAULT => -8
+ },
+ {#State 52
+ DEFAULT => -6
+ },
+ {#State 53
+ DEFAULT => -7
+ },
+ {#State 54
+ DEFAULT => -13
+ },
+ {#State 55
+ DEFAULT => -12
+ },
+ {#State 56
+ ACTIONS => {
+ "," => 83
+ },
+ DEFAULT => -15,
+ GOTOS => {
+ 'Invocation_3' => 82
+ }
+ },
+ {#State 57
+ DEFAULT => -45
+ },
+ {#State 58
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11,
+ "not" => 17
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'Union' => 21,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'Conjunction' => 84,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Negation' => 26,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 59
+ DEFAULT => -0
+ },
+ {#State 60
+ ACTIONS => {
+ ")" => 85
+ }
+ },
+ {#State 61
+ DEFAULT => -17
+ },
+ {#State 62
+ ACTIONS => {
+ "*" => 29,
+ 'NCName' => 25,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "(" => 28,
+ "\@" => 11
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Filter' => 1,
+ 'Bang' => 30,
+ 'RelativePath' => 86,
+ 'Invocation' => 32,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'Subscript' => 35
+ }
+ },
+ {#State 63
+ ACTIONS => {
+ 'NCName' => 25,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Intersection' => 87,
+ 'Bang' => 30,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 64
+ ACTIONS => {
+ 'XQLName_Paren' => 22
+ },
+ GOTOS => {
+ 'Invocation' => 88
+ }
+ },
+ {#State 65
+ ACTIONS => {
+ "to" => 89
+ },
+ DEFAULT => -56
+ },
+ {#State 66
+ ACTIONS => {
+ "]" => 90
+ }
+ },
+ {#State 67
+ ACTIONS => {
+ "]" => 91
+ }
+ },
+ {#State 68
+ DEFAULT => -57
+ },
+ {#State 69
+ ACTIONS => {
+ "," => 93
+ },
+ DEFAULT => -54,
+ GOTOS => {
+ 'IndexList_2' => 92
+ }
+ },
+ {#State 70
+ DEFAULT => -61
+ },
+ {#State 71
+ DEFAULT => -41
+ },
+ {#State 72
+ DEFAULT => -40
+ },
+ {#State 73
+ DEFAULT => -38
+ },
+ {#State 74
+ DEFAULT => -39
+ },
+ {#State 75
+ DEFAULT => -34
+ },
+ {#State 76
+ DEFAULT => -22
+ },
+ {#State 77
+ DEFAULT => -20
+ },
+ {#State 78
+ ACTIONS => {
+ 'NCName' => 25,
+ 'TEXT' => 71,
+ "(" => 28,
+ "*" => 29,
+ 'NUMBER' => 72,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ 'INTEGER' => 74,
+ "\@" => 11
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Filter' => 1,
+ 'Bang' => 30,
+ 'RelativePath' => 2,
+ 'Invocation' => 32,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 73,
+ 'Subscript' => 35,
+ 'RValue' => 94
+ }
+ },
+ {#State 79
+ DEFAULT => -28
+ },
+ {#State 80
+ DEFAULT => -5
+ },
+ {#State 81
+ ACTIONS => {
+ 'NCName' => 25,
+ 'TEXT' => 71,
+ "(" => 28,
+ "*" => 29,
+ 'NUMBER' => 72,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ 'INTEGER' => 74,
+ "\@" => 11
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'RelativeTerm' => 12,
+ 'AttributeName' => 13,
+ 'Filter' => 1,
+ 'Bang' => 30,
+ 'RelativePath' => 2,
+ 'Invocation' => 32,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 73,
+ 'Subscript' => 35,
+ 'RValue' => 95
+ }
+ },
+ {#State 82
+ ACTIONS => {
+ ")" => 96
+ }
+ },
+ {#State 83
+ ACTIONS => {
+ 'NCName' => 25,
+ 'TEXT' => 50,
+ "(" => 28,
+ "any" => 14,
+ "all" => 20,
+ "*" => 29,
+ 'NUMBER' => 51,
+ ".." => 4,
+ 'XQLName_Paren' => 22,
+ "." => 34,
+ "//" => 23,
+ "/" => 16,
+ "\@" => 11,
+ 'INTEGER' => 53,
+ "not" => 17
+ },
+ GOTOS => {
+ 'WildNCName' => 18,
+ 'WildQName' => 19,
+ 'Filter' => 1,
+ 'Union' => 21,
+ 'RelativePath' => 2,
+ 'LValue' => 3,
+ 'Conjunction' => 5,
+ 'Disjunction' => 52,
+ 'ElementName' => 7,
+ 'Grouping' => 8,
+ 'PathOp' => 24,
+ 'AbsolutePath' => 9,
+ 'Path' => 10,
+ 'Param' => 97,
+ 'RelativeTerm' => 12,
+ 'Negation' => 26,
+ 'AttributeName' => 13,
+ 'Intersection' => 15,
+ 'Bang' => 30,
+ 'Invocation' => 32,
+ 'Comparison' => 33,
+ 'Subscript' => 35
+ }
+ },
+ {#State 84
+ DEFAULT => -24
+ },
+ {#State 85
+ DEFAULT => -63
+ },
+ {#State 86
+ DEFAULT => -47
+ },
+ {#State 87
+ DEFAULT => -30
+ },
+ {#State 88
+ DEFAULT => -49
+ },
+ {#State 89
+ ACTIONS => {
+ 'INTEGER' => 98
+ }
+ },
+ {#State 90
+ DEFAULT => -52
+ },
+ {#State 91
+ DEFAULT => -60
+ },
+ {#State 92
+ DEFAULT => -53
+ },
+ {#State 93
+ ACTIONS => {
+ 'INTEGER' => 65
+ },
+ GOTOS => {
+ 'IndexArg' => 99,
+ 'Range' => 68
+ }
+ },
+ {#State 94
+ DEFAULT => -35
+ },
+ {#State 95
+ DEFAULT => -36
+ },
+ {#State 96
+ DEFAULT => -14
+ },
+ {#State 97
+ ACTIONS => {
+ "," => 83
+ },
+ DEFAULT => -15,
+ GOTOS => {
+ 'Invocation_3' => 100
+ }
+ },
+ {#State 98
+ DEFAULT => -58
+ },
+ {#State 99
+ ACTIONS => {
+ "," => 93
+ },
+ DEFAULT => -54,
+ GOTOS => {
+ 'IndexList_2' => 101
+ }
+ },
+ {#State 100
+ DEFAULT => -16
+ },
+ {#State 101
+ DEFAULT => -55
+ }
+],
+ yyrules =>
+[
+ [#Rule 0
+ '$start', 2, undef
+ ],
+ [#Rule 1
+ 'Query', 1, undef
+ ],
+ [#Rule 2
+ 'WildNCName', 1, undef
+ ],
+ [#Rule 3
+ 'WildNCName', 1, undef
+ ],
+ [#Rule 4
+ 'WildQName', 1,
+sub {
+ [ Name => $_[1] ];
+}
+ ],
+ [#Rule 5
+ 'WildQName', 3,
+sub {
+
+ [ NameSpace => $_[1], Name => $_[2]];
+}
+ ],
+ [#Rule 6
+ 'Param', 1, undef
+ ],
+ [#Rule 7
+ 'Param', 1,
+sub {
+ new XML::XQL::Number ($_[1]);
+}
+ ],
+ [#Rule 8
+ 'Param', 1,
+sub {
+ new XML::XQL::Number ($_[1]);
+}
+ ],
+ [#Rule 9
+ 'Param', 1,
+sub {
+ new XML::XQL::Text ($_[1]);
+}
+ ],
+ [#Rule 10
+ 'ElementName', 1,
+sub {
+ new XML::XQL::Element (@{$_[1]});
+}
+ ],
+ [#Rule 11
+ 'AttributeName', 2,
+sub {
+ new XML::XQL::Attribute (@{$_[2]});
+}
+ ],
+ [#Rule 12
+ 'Invocation', 2,
+sub {
+
+ my ($func, $type) = $_[0]->{Query}->findFunctionOrMethod ($_[1], $_[2]);
+
+ new XML::XQL::Invocation (Name => $_[1],
+ Args => $_[2],
+ Func => $func,
+ Type => $type);
+}
+ ],
+ [#Rule 13
+ 'Invocation_2', 1,
+sub {
+ []
+}
+ ],
+ [#Rule 14
+ 'Invocation_2', 3,
+sub {
+ unshift @{$_[2]}, $_[1]; $_[2];
+}
+ ],
+ [#Rule 15
+ 'Invocation_3', 0,
+sub {
+ []
+}
+ ],
+ [#Rule 16
+ 'Invocation_3', 3,
+sub {
+ unshift @{$_[3]}, $_[2]; $_[3];
+}
+ ],
+ [#Rule 17
+ 'PathOp', 1, undef
+ ],
+ [#Rule 18
+ 'PathOp', 1, undef
+ ],
+ [#Rule 19
+ 'Sequence', 1, undef
+ ],
+ [#Rule 20
+ 'Sequence', 3,
+sub {
+
+ new XML::XQL::Sequence (Left => $_[1], Oper => $_[2],
+ Right => $_[3]);
+}
+ ],
+ [#Rule 21
+ 'Disjunction', 1, undef
+ ],
+ [#Rule 22
+ 'Disjunction', 3,
+sub {
+
+ new XML::XQL::Or (Left => $_[1], Right => $_[3]);
+}
+ ],
+ [#Rule 23
+ 'Conjunction', 1, undef
+ ],
+ [#Rule 24
+ 'Conjunction', 3,
+sub {
+
+ new XML::XQL::And (Left => $_[1], Right => $_[3]);
+}
+ ],
+ [#Rule 25
+ 'Negation', 1, undef
+ ],
+ [#Rule 26
+ 'Negation', 2,
+sub {
+ new XML::XQL::Not (Left => $_[2]);
+}
+ ],
+ [#Rule 27
+ 'Union', 1, undef
+ ],
+ [#Rule 28
+ 'Union', 3,
+sub {
+
+ new XML::XQL::Union (Left => $_[1], Right => $_[3]);
+}
+ ],
+ [#Rule 29
+ 'Intersection', 1, undef
+ ],
+ [#Rule 30
+ 'Intersection', 3,
+sub {
+
+ new XML::XQL::Intersect ($_[1], $_[3]);
+}
+ ],
+ [#Rule 31
+ 'ComparisonOp', 1,
+sub {
+
+ [ $_[1], $_[0]->{Query}->findComparisonOperator ($_[1]) ];
+}
+ ],
+ [#Rule 32
+ 'ComparisonOp', 1,
+sub {
+
+ [ $_[1], $_[0]->{Query}->findComparisonOperator ($_[1]) ];
+}
+ ],
+ [#Rule 33
+ 'Comparison', 1, undef
+ ],
+ [#Rule 34
+ 'Comparison', 3,
+sub {
+
+ new XML::XQL::Compare (All => 0, Left => $_[1],
+ Oper => $_[2]->[0], Func => $_[2]->[1],
+ Right => $_[3]);
+}
+ ],
+ [#Rule 35
+ 'Comparison', 4,
+sub {
+
+ new XML::XQL::Compare (All => 0, Left => $_[2],
+ Oper => $_[3]->[0], Func => $_[3]->[0],
+ Right => $_[4]);
+}
+ ],
+ [#Rule 36
+ 'Comparison', 4,
+sub {
+
+ new XML::XQL::Compare (All => 1, Left => $_[2],
+ Oper => $_[3]->[0], Func => $_[3]->[0],
+ Right => $_[4]);
+}
+ ],
+ [#Rule 37
+ 'LValue', 1, undef
+ ],
+ [#Rule 38
+ 'RValue', 1, undef
+ ],
+ [#Rule 39
+ 'RValue', 1,
+sub {
+ new XML::XQL::Number ($_[1]);
+}
+ ],
+ [#Rule 40
+ 'RValue', 1,
+sub {
+ new XML::XQL::Number ($_[1]);
+}
+ ],
+ [#Rule 41
+ 'RValue', 1,
+sub {
+ new XML::XQL::Text ($_[1]);
+}
+ ],
+ [#Rule 42
+ 'Path', 1, undef
+ ],
+ [#Rule 43
+ 'Path', 1, undef
+ ],
+ [#Rule 44
+ 'AbsolutePath', 1,
+sub {
+ new XML::Root;
+}
+ ],
+ [#Rule 45
+ 'AbsolutePath', 2,
+sub {
+
+ new XML::XQL::Path (PathOp => $_[1], Right => $_[2]);
+}
+ ],
+ [#Rule 46
+ 'RelativePath', 1, undef
+ ],
+ [#Rule 47
+ 'RelativePath', 3,
+sub {
+
+ new XML::XQL::Path (Left => $_[1], PathOp => $_[2],
+ Right => $_[3]);
+}
+ ],
+ [#Rule 48
+ 'Bang', 1, undef
+ ],
+ [#Rule 49
+ 'Bang', 3,
+sub {
+
+ XML::XQL::parseError ("only methods (not functions) can be used after the Bang (near '!" . $_[3]->{Name} . "'")
+ unless $_[3]->isMethod;
+
+ new XML::XQL::Bang (Left => $_[1],
+ Right => $_[3]);
+}
+ ],
+ [#Rule 50
+ 'Subscript', 2,
+sub {
+
+ defined($_[2]) ?
+ new XML::XQL::Subscript (Left => $_[1],
+ IndexList => $_[2]) : $_[1];
+}
+ ],
+ [#Rule 51
+ 'Subscript_2', 0, undef
+ ],
+ [#Rule 52
+ 'Subscript_2', 3,
+sub {
+ $_[2];
+}
+ ],
+ [#Rule 53
+ 'IndexList', 2,
+sub {
+ push (@{$_[1]}, @{$_[2]}); $_[1];
+}
+ ],
+ [#Rule 54
+ 'IndexList_2', 0,
+sub {
+ []
+}
+ ],
+ [#Rule 55
+ 'IndexList_2', 3,
+sub {
+ push (@{$_[2]}, @{$_[3]}); $_[2];
+}
+ ],
+ [#Rule 56
+ 'IndexArg', 1,
+sub {
+ [ $_[1], $_[1] ];
+}
+ ],
+ [#Rule 57
+ 'IndexArg', 1, undef
+ ],
+ [#Rule 58
+ 'Range', 3,
+sub {
+
+ # Syntactic Constraint 9:
+ # If both integers are positive or if both integers are
+ # negative, the first integer must be less than or
+ # equal to the second integer.
+
+ XML::XQL::parseError (
+ "$_[1] should be less than $_[3] in '$_[1] $_[2] $_[3]'")
+ if ($_[1] > $_[3] && ($_[1] < 0) == ($_[3] < 0));
+ [ $_[1], $_[3] ];
+}
+ ],
+ [#Rule 59
+ 'Filter', 1, undef
+ ],
+ [#Rule 60
+ 'Filter', 4,
+sub {
+
+ new XML::XQL::Filter (Left => $_[1], Right => $_[3]);
+}
+ ],
+ [#Rule 61
+ 'Subquery', 1, undef
+ ],
+ [#Rule 62
+ 'Grouping', 1, undef
+ ],
+ [#Rule 63
+ 'Grouping', 3,
+sub {
+ $_[2];
+}
+ ],
+ [#Rule 64
+ 'RelativeTerm', 1,
+sub {
+ new XML::XQL::Current;
+}
+ ],
+ [#Rule 65
+ 'RelativeTerm', 1,
+sub {
+ new XML::XQL::Parent;
+}
+ ],
+ [#Rule 66
+ 'RelativeTerm', 1, undef
+ ],
+ [#Rule 67
+ 'RelativeTerm', 1, undef
+ ],
+ [#Rule 68
+ 'RelativeTerm', 1, undef
+ ]
+],
+ @_);
+ bless($self,$class);
+}
+
+
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL/Plus.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,634 @@
+############################################################################
+# Copyright (c) 1998 Enno Derksen
+# All rights reserved.
+# This program is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+############################################################################
+#
+# Extra functionality that is not part of the XQL spec
+#
+
+package XML::XQL;
+use strict;
+
+BEGIN
+{
+ die "don't use/require XML::XQL::Plus, either use/require XML::XQL or XML::XQL::Strict" unless $XML::XQL::Included;
+};
+
+defineComparisonOperators
+(
+ "=~" => \&XML::XQL::match_oper,
+ "!~" => \&XML::XQL::no_match_oper,
+ "match" => \&XML::XQL::match_oper,
+ "no_match" => \&XML::XQL::no_match_oper,
+ "isa" => \&XML::XQL::isa_oper,
+ "can" => \&XML::XQL::can_oper,
+);
+
+sub match_oper
+{
+ my ($node, $expr) = @_;
+
+ return [] if isEmptyList ($node);
+#?? can this happen?
+
+ my $str = $node->xql_toString;
+
+ $expr = prepareRvalue ($expr->solve ([$node]));
+ return [] if isEmptyList ($expr);
+#?? can this happen?
+
+ $expr = $expr->xql_toString;
+ croak "bad search pattern '$expr' for =~" unless $expr =~ m!^\s*[m/]!o;
+
+ my $res = eval "\$str =~ $expr";
+ croak "bad search pattern '$expr' for =~ operator: $@" if ($@);
+ $res;
+}
+
+sub no_match_oper
+{
+ my ($node, $expr) = @_;
+
+ return [] if isEmptyList ($node);
+#?? can this happen?
+
+ my $str = $node->xql_toString;
+
+ $expr = prepareRvalue ($expr->solve ([$node]));
+ return [] if isEmptyList ($expr);
+#?? can this happen?
+
+ $expr = $expr->xql_toString;
+ croak "bad search pattern '$expr' for !~" unless $expr =~ m!^\s*[m/]!o;
+
+ my $res = eval "\$str !~ $expr";
+ croak "bad search pattern '$expr' for !~ operator: $@" if ($@);
+ $res;
+}
+
+sub isa_oper
+{
+ my ($node, $expr) = @_;
+
+ return [] if isEmptyList ($node);
+#?? can this happen?
+
+ $expr = prepareRvalue ($expr->solve ([$node]));
+ return [] if isEmptyList ($expr);
+#?? can this happen?
+
+ $expr = $expr->xql_toString;
+
+ # Expand "number" to "XML::XQL::Number" etc.
+ $expr = expandType ($expr);
+
+#?? I don't think empty lists are possible here. If so, add "[]" as expr
+
+ ref($node) and $node->isa ($expr);
+}
+
+#
+# Not sure how useful this is, unless it supports XQL functions/methods...
+#
+sub can_oper
+{
+ my ($node, $expr) = @_;
+
+ return [] if isEmptyList ($node);
+#?? can this happen?
+
+ $expr = prepareRvalue ($expr->solve ([$node]));
+ return [] if isEmptyList ($expr);
+#?? can this happen?
+
+ $expr = $expr->xql_toString;
+
+ ref ($node) and $node->can ($expr);
+}
+
+sub once
+{
+ my ($context, $list, $expr) = @_;
+ $expr->solve ($context, $list);
+}
+
+sub xql_eval
+{
+ my ($context, $list, $query, $type) = @_;
+
+# return [] if @$list == 0;
+
+ $query = toList ($query->solve ($context, $list));
+ return [] unless @$query;
+
+ if (defined $type)
+ {
+ $type = prepareRvalue ($type->solve ($context, $list));
+ $type = isEmptyList ($type) ? "Text" : $type->xql_toString;
+
+ # Expand "number" to "XML::XQL::Number" etc.
+ $type = expandType ($type);
+ }
+ else
+ {
+ $type = "XML::XQL::Text";
+ }
+
+ my @result = ();
+ for my $val (@$query)
+ {
+ $val = $val->xql_toString;
+ $val = eval $val;
+
+#print "eval result=$val\n";
+#?? check result?
+ push @result, eval "new $type (\$val)" if defined $val;
+ }
+ \@result;
+}
+
+sub subst
+{
+ my ($context, $list, $query, $expr, $repl, $mod, $mode) = @_;
+
+#?? not sure?
+ return [] if @$list == 0;
+
+ $expr = prepareRvalue ($expr->solve ($context, $list));
+ return [] if isEmptyList ($expr);
+ $expr = $expr->xql_toString;
+
+ $repl = prepareRvalue ($repl->solve ($context, $list));
+ return [] if isEmptyList ($repl);
+ $repl = $repl->xql_toString;
+
+ if (defined $mod)
+ {
+ $mod = prepareRvalue ($mod->solve ($context, $list));
+ $mod = isEmptyList ($mod) ? "" : $mod->xql_toString;
+ }
+
+ if (defined $mode)
+ {
+ $mode = prepareRvalue ($mode->solve ($context, $list));
+ $mode = isEmptyList ($mode) ? 0 : $mode->xql_toString;
+ }
+ else
+ {
+ $mode = 0; # default mode: use textBlocks for Elements
+ }
+
+ my @result = ();
+ my $nodes = toList ($query->solve ($context, $list));
+
+ for my $node (@$nodes)
+ {
+ if ($mode == 0 && $node->xql_nodeType == 1) # 1: Element node
+ {
+ # For Element nodes, replace text in consecutive text blocks
+ # Note that xql_rawtextBlocks, returns the blocks in reverse order,
+ # so that the indices of nodes within previous blocks don't need
+ # to be adjusted when a replacement occurs.
+ my $block_matched = 0;
+ BLOCK: for my $block ($node->xql_rawTextBlocks)
+ {
+ my $str = $block->[2];
+ my $result = eval "\$str =~ s/\$expr/\$repl/$mod";
+ croak "bad subst expression s/$expr/$repl/$mod: $@" if ($@);
+ next BLOCK unless $result;
+
+ $block_matched++;
+ $node->xql_replaceBlockWithText ($block->[0], $block->[1], $str);
+ }
+ # Return the input parameter only if a substitution occurred
+ push @result, $node if $block_matched;
+ }
+ else
+ {
+ my $str = $node->xql_toString;
+ next unless defined $str;
+
+ my $result = eval "\$str =~ s/\$expr/\$repl/$mod";
+ croak "bad subst expression s/$expr/$repl/$mod: $@" if ($@);
+ next unless $result;
+#print "result=$result for str[$str] =~ s/$expr/$repl/$mod\n";
+
+ # Return the input parameter only if a substitution occurred
+ $node->xql_setValue ($str);
+ push @result, $node;
+ }
+ # xql_setValue will actually change the value of the node for an Attr,
+ # Text, CDataSection, EntityRef or Element
+ }
+ \@result;
+}
+
+#?? redo match - what should it return?
+sub match
+{
+ my ($context, $list, $query, $repl, $mod) = @_;
+
+ return [] if @$list == 0;
+
+ $query = prepareRvalue ($query->solve ($context, $list));
+ return [] if isEmptyList ($query);
+ $query = $query->xql_toString;
+
+ if (defined $mod)
+ {
+ $mod = prepareRvalue ($mod->solve ($context, $list));
+ $mod = isEmptyList ($mod) ? "" : $mod->xql_toString;
+ }
+
+ my $str = $list->[0]->xql_toString;
+ return [] unless defined $str;
+
+ my (@matches) = ();
+ eval "\@matches = (\$str =~ /\$query/$mod)";
+ croak "bad match expression m/$query/$mod" if ($@);
+
+#?? or should I map undef to XML::XQL::Text("") ?
+ @matches = map { defined($_) ? new XML::XQL::Text ($_) : [] } @matches;
+ \@matches;
+}
+
+sub xql_map
+{
+ my ($context, $list, $query, $code) = @_;
+
+#?? not sure?
+ return [] if @$list == 0;
+
+ $code = prepareRvalue ($code->solve ($context, $list));
+ return [] if isEmptyList ($code);
+ $code = $code->xql_toString;
+
+ my @result = ();
+ my $nodes = toList ($query->solve ($context, $list));
+
+ for my $node (@$nodes)
+ {
+ my $str = $node->xql_toString;
+ next unless defined $str;
+
+ my (@mapresult) = ($str);
+
+#?? NOTE: the $code should
+ eval "\@mapresult = map { $code } (\$str)";
+ croak "bad map expression '$code' ($@)" if ($@);
+
+ # Return the input parameter only if a change occurred
+ next unless $mapresult[0] eq $str;
+
+ # xql_setValue will actually change the value of the node for an Attr,
+ # Text, CDataSection, EntityRef or Element
+ $node->xql_setValue ($str);
+ push @result, $node;
+ }
+ \@result;
+}
+
+sub xql_new
+{
+ my ($type, @arg) = @_;
+
+ # Expand "number" to "XML::XQL::Number" etc.
+ $type = expandType ($type);
+
+ my $obj = eval "new $type (\@arg)";
+ $@ ? [] : $obj; # return empty list on exception
+}
+
+my $DOM_PARSER; # used by xql_document (below)
+sub setDocParser
+{
+ $DOM_PARSER = shift;
+}
+
+sub xql_document
+{
+ my ($docname) = @_;
+ my $parser = $DOM_PARSER ||= new XML::DOM::Parser;
+ my $doc;
+ eval
+ {
+ $doc = $parser->parsefile ($docname);
+ };
+ if ($@)
+ {
+ warn "xql_document: could not read XML file [$docname]: $@";
+ }
+ return defined $doc ? $doc : [];
+}
+
+#----------- XQL+ methods --------------------------------------------
+
+
+sub DOM_nodeType
+{
+ my ($context, $list) = @_;
+
+ return [] if @$list == 0;
+
+ new XML::XQL::Number ($list->[0]->xql_DOM_nodeType, $list->[0]);
+}
+
+#----------- Perl Builtin Functions ----------------------------------
+
+# Note that certain functions (like mkdir) are not considered "constant"
+# because we don't want their invocation values cached. (We want the
+# function to be called every time the Invocation is solved/evaluated.)
+my %PerlFunc =
+(
+ # Format:
+ # "funcName", => [ARGCOUNT, RETURN_TYPE [, CONSTANT = 0, [QUERY_ARG = 0]]]
+
+ #-------- Arithmetic Functions
+
+ "abs" => [1, "Number", 1],
+ "atan2" => [2, "Number", 1, -1],
+ "cos" => [1, "Number", 1],
+ "exp" => [1, "Number", 1],
+ "int" => [1, "Number", 1],
+ "log" => [1, "Number", 1],
+ "rand" => [[0, 1], "Number", 0, -1],
+ "sin" => [1, "Number", 1],
+ "sqrt" => [1, "Number", 1],
+ "srand" => [[0, 1], "Number", 0, -1],
+ "time" => [0, "Number", 0, -1],
+
+ #-------- Conversion Functions
+
+ "chr" => [1, "Text", 1],
+# "gmtime" => [1, "List of Number", 1],
+ "hex" => [1, "Number", 1],
+# "localtime" => [1, "List of Number", 1],
+ "oct" => [1, "Number", 1],
+ "ord" => [1, "Text", 1],
+ "vec" => [3, "Number", 1],
+ "pack" => [[1, -1], "Text", 1, -1], #?? how should this work??
+# "unpack" => [2, "List of ?", 1],
+
+ #-------- String Functions
+
+ "chomp" => [1, "Text", 1],
+ "chop" => [1, "Text", 1],
+ "crypt" => [2, "Text", 1],
+ "lindex" => [[2, 3], "Number", 1], # "index" is already taken by XQL
+ "length" => [1, "Number", 1],
+ "lc" => [1, "Text", 1],
+ "lcfirst" => [1, "Text", 1],
+ "quotemeta" => [1, "Text", 1],
+ "rindex" => [[2, 3], "Number", 1],
+ "substr" => [[2, 3], "Text", 1],
+ "uc" => [1, "Text", 1],
+ "ucfirst" => [1, "Text", 1],
+ "reverse" => [1, "Text", 1],
+ "sprintf" => [[1, -1], "Text", 1, -1],
+
+ #-------- Array Functions
+
+ "join" => [[1, -1], "Text", 1],
+# "split" => [[2, 3], "List of Text", 1],
+
+ #-------- File Functions
+
+ "chmod" => [2, "Boolean", 0, 1],
+ "chown" => [3, "Boolean", 0, 2],
+ "link" => [2, "Number", 0, -1], #?? no return value
+# "lstat" => [1, "List of Number"],
+ "mkdir" => [2, "Boolean"], #?? or is 1 arg also allowed?
+ "readlink" => [1, "Text"],
+ "rename" => [2, "Boolean", 0, -1],
+ "rmdir" => [1, "Boolean"],
+# "stat" => [1, "List of Number"],
+ "symlink" => [2, "Boolean", 0, -1],
+ "unlink" => [1, "Boolean"],
+ "utime" => [3, "Boolean", 0, 2],
+ "truncate" => [2, "Number"], #?? no return value
+
+ #-------- System Interaction
+
+ "exit" => [[0, 1], "Number"],
+# "glob" => [1, "List of Text"],
+ "system" => [[1, -1], "Number", 0, -1],
+# "times" => [0, "List of Number"],
+
+ #-------- Miscellaneous
+
+ "defined" => [1, "Boolean"], # is this useful??
+ "dump" => [[0, 1], "Number", 0, -1],
+ "ref" => [1, "Text"],
+);
+#?? die, warn, croak (etc.),
+#?? file test (-X), tr// (same as y//)
+#?? array functions, sort
+
+# Generate wrapper for Perl builtin function on the fly
+sub generatePerlWrapper
+{
+ my ($name) = @_;
+ my $args = $PerlFunc{$name};
+ return undef unless defined $args; # not found
+
+ my ($argCount, $returnType, $const, $queryArg) = @$args;
+ my $funcName = $name;
+ if ($name eq "lindex") # "index" is already taken
+ {
+ $funcName = "index";
+ }
+ generateFunction ($name, $funcName, $returnType, $argCount, 0, $const,
+ $queryArg);
+ $Func{$name};
+}
+
+#?? Inline functions, do they make sense? E.g. 'elem!sub("code", "arg1")'
+#?? Normally, user should use defineFunction, but if most of them have
+#?? a lot of common code, I could provide the pre- and post-code.
+#?? After processing the user-supplied code block, how should I convert the
+#?? user's result back to an Invocation result. E.g. do I get a single value
+#?? or a list back?
+
+defineFunction ("eval", \&XML::XQL::xql_eval, [1, 2]);
+defineFunction ("subst", \&XML::XQL::subst, [3, 5], 1);
+defineFunction ("s", \&XML::XQL::subst, [3, 5], 1);
+defineFunction ("match", \&XML::XQL::match, [1, 2]);
+defineFunction ("m", \&XML::XQL::match, [1, 2]);
+defineFunction ("map", \&XML::XQL::xql_map, 2, 1);
+defineFunction ("once", \&XML::XQL::once, 1, 1);
+
+defineMethod ("DOM_nodeType", \&XML::XQL::DOM_nodeType, 0, 0);
+
+generateFunction ("new", "XML::XQL::xql_new", "*", [1, -1], 1, 0, 1);
+generateFunction ("document", "XML::XQL::xql_document", "*", 1, 1, 0, 0);
+
+# doc() is an alias for document()
+defineFunction ("doc", \&XML::XQL::xql_wrap_document, 1, 1);
+
+#------------------------------------------------------------------------------
+# The following functions were found in the XPath spec.
+
+# Found in XPath but not (yet) implemented in XML::XQL:
+# - type casting (string, number, boolean) - Not sure if needed...
+# Note that string() converts booleans to 'true' and 'false', but our
+# internal type casting converts it to perl values '0' and '1'...
+# - math (+,-,*,mod,div) - Use eval() for now
+# - last(), position() - Similar to end() and index() except they're 1-based
+# - local-name(node-set?), namespace-uri(node-set?)
+# - name(node-set?) - Can we pass a node-set in XQL?
+# - lang(string)
+
+sub xpath_concat { join ("", @_) }
+sub xpath_starts_with { $_[0] =~ /^\Q$_[1]\E/ }
+# ends-with is not part of XPath
+sub xpath_ends_with { $_[0] =~ /\Q$_[1]\E$/ }
+sub xpath_contains { $_[0] =~ /\Q$_[1]\E/ }
+
+# The following methods don't know about NaN, +/-Infinity or -0.
+sub xpath_floor { use POSIX; POSIX::floor ($_[0]) }
+sub xpath_ceiling { use POSIX; POSIX::ceil ($_[0]) }
+sub xpath_round { use POSIX; POSIX::floor ($_[0] + 0.5) }
+
+# Note that the start-index is 1-based in XPath
+sub xpath_substring
+{
+ defined $_[2] ? substr ($_[0], $_[1] - 1, $_[2])
+ : substr ($_[0], $_[1] - 1)
+}
+
+sub xpath_substring_before
+{
+ my $i = index ($_[0], $_[1]);
+ $i == -1 ? undef : substr ($_[0], 0, $i)
+}
+
+sub xpath_substring_after
+{
+ my $i = index ($_[0], $_[1]);
+ $i == -1 ? undef : substr ($_[0], $i + length($_[1]))
+}
+
+# Note that d,c,s are tr/// modifiers. Also can't use open delimiters i.e. {[(<
+my @TR_DELIMITERS = split //, "/!%^&*)-_=+|~]}'\";:,.>/?abefghijklmnopqrtuvwxyz";
+
+sub xpath_translate
+{
+ my ($str, $from, $to) = @_;
+
+ my $delim;
+ for my $d (@TR_DELIMITERS)
+ {
+ if (index ($from, $d) == -1 && index ($to, $d) == -1)
+ {
+ $delim = $d;
+ last;
+ }
+ }
+ die "(xpath_)translate: can't find suitable 'tr' delimiter"
+ unless defined $delim;
+
+ # XPath defines that if length($from) > length($to), characters in $from
+ # for which there is no match in $to, should be deleted.
+ # (So we must use the 's' modifier.)
+ eval "\$str =~ tr$delim$from$delim$to${delim}d";
+ $str;
+}
+
+sub xpath_string_length
+{
+ my ($context, $list, $text) = @_;
+
+ if (defined $text)
+ {
+ $text = XML::XQL::prepareRvalue ($text->solve ($context, $list));
+ return [] unless defined $text;
+
+ return new XML::XQL::Number (length $text->xql_toString,
+ $text->xql_sourceNode);
+ }
+ else
+ {
+ return [] if @$list == 0;
+
+ my @result;
+ for my $node (@$list)
+ {
+ push @result, new XML::XQL::Number (length $node->xql_toString,
+ $node);
+ }
+ return \@result;
+ }
+}
+
+sub _normalize
+{
+ $_[0] =~ s/\s+/ /g;
+ $_[0] =~ s/^\s+//;
+ $_[0] =~ s/\s+$//;
+ $_[0];
+}
+
+sub xpath_normalize_space
+{
+ my ($context, $list, $text) = @_;
+
+ return [] if @$list == 0;
+
+ if (defined $text)
+ {
+ $text = XML::XQL::prepareRvalue ($text->solve ($context, $list));
+ return [] unless defined $text;
+
+ return new XML::XQL::Text (_normalize ($text->xql_toString),
+ $text->xql_sourceNode);
+ }
+ else
+ {
+ my @result;
+ for my $node (@$list)
+ {
+ push @result, new XML::XQL::Text (_normalize ($node->xql_toString),
+ $node);
+ }
+ return \@result;
+ }
+}
+
+sub xpath_sum
+{
+ my ($context, $list, $expr) = @_;
+
+ return [] if @$list == 0;
+#?? or return Number(0) ?
+
+ my $sum = 0;
+ $expr = XML::XQL::toList ($expr->solve ($context, $list));
+ for my $r (@{ $expr })
+ {
+ $sum += $r->xql_toString;
+ }
+ return new XML::XQL::Number ($sum, undef);
+}
+
+generateFunction ("round", "XML::XQL::xpath_round", "Number", 1, 1);
+generateFunction ("floor", "XML::XQL::xpath_floor", "Number", 1, 1);
+generateFunction ("ceiling", "XML::XQL::xpath_ceiling", "Number", 1, 1);
+
+generateFunction ("concat", "XML::XQL::xpath_concat", "Text", [2, -1], 1);
+generateFunction ("starts-with", "XML::XQL::xpath_starts_with", "Boolean", 2, 1);
+generateFunction ("ends-with", "XML::XQL::xpath_ends_with", "Boolean", 2, 1);
+generateFunction ("contains", "XML::XQL::xpath_contains", "Boolean", 2, 1);
+generateFunction ("substring-before", "XML::XQL::xpath_substring_before", "Text", 2, 1);
+generateFunction ("substring-after", "XML::XQL::xpath_substring_after", "Text", 2, 1);
+# Same as Perl substr() except index is 1-based
+generateFunction ("substring", "XML::XQL::xpath_substring", "Text", [2, 3], 1);
+generateFunction ("translate", "XML::XQL::xpath_translate", "Text", 3, 1);
+
+defineMethod ("string-length", \&XML::XQL::xpath_string_length, [0, 1], 1);
+defineMethod ("normalize-space", \&XML::XQL::xpath_normalize_space, [0, 1], 1);
+
+defineFunction ("sum", \&XML::XQL::xpath_sum, 1, 1);
+
+1; # module return code
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL/Query.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,155 @@
+=head1 NAME
+
+XML::XQL::Query - Creates an XQL query evaluater from a XQL expression
+
+=head1 SYNOPSIS
+
+ use XML::XQL;
+
+ $parser = new XML::DOM::Parser;
+ $doc = $parser->parsefile ("file.xml");
+
+ # Return all elements with tagName='title' under the root element 'book'
+ $query = new XML::XQL::Query (Expr => "book/title");
+ @result = $query->solve ($doc);
+
+ # Or (to save some typing)
+ @result = XML::XQL::solve ("book/title", $doc);
+
+=head1 DESCRIPTION
+
+To perform XQL queries on an XML::DOM document (or, in the future, on other XML
+storage structures), you first have to create an XML::XQL::Query object and
+pass it a valid XQL query expression. You can then perform queries on one or
+more documents by calling the solve() method.
+
+=head1 XML::XQL::Query constructor
+
+Usage, e.g:
+
+ $query = new XML::XQL::Query(
+ Expr => "book/author",
+ Func => [ myfunc => \&my_func, # define 2 functions
+ myfunc2 => \&my_func2 ],
+ FuncArgCount => [ myfunc2 => [2, -1] ], # myfunc2 has 2 or more args
+ AllowedOutSideSubquery => [ myfunc => 1 ],
+ ConstFunc => [ myfunc2 => 1],
+ CompareOper => [ mycmp => \&mycmp ], # define comparison operator
+ q => "str"); # use str// as string delim
+
+=over 4
+
+=item Expr => STRING
+
+The query expression to be evaluated.
+
+=item NodeQuery => BOOLEAN
+
+If set to 1, the query is a I<Node Query> as opposed to a
+I<Full Query> (which is the default.)
+A node query is a query that is only capable of returning Nodes.
+A full query is capable of returning Node values and non-Node values.
+Non-Node values include XML Primitives, element type names, namespace URI's,
+concatenated text nodes, and node type names. The distinction is significant
+because node queries may appear as XSL match and select patterns, while full
+queries have use in other applications.
+The difference between the two forms of queries is trivial and exists only as
+constraints on the syntax of node queries.
+Node queries may contain nested full queries.
+
+=item Func => [ FUNCNAME => FUNCREF, ...]
+
+Defines one or more functions. FUNCNAME is the name as used in the query
+expression. FUNCREF can be either a function reference like \&my_func or
+an anonymous sub.
+See also: defineFunction
+
+=item Method => [ FUNCNAME => FUNCREF, ...]
+
+Defines one or more methods. FUNCNAME is the name as used in the query
+expression. FUNCREF can be either a function reference like \&my_func or
+an anonymous sub.
+See also: defineMethod
+
+=item FuncArgCount => [ FUNCNAME => ARGCOUNT, ...]
+
+Defines the number of arguments for one or more functions or methods.
+FUNCNAME is the name as used in the query expression.
+See also: defineFunction and defineMethod
+
+=item AllowedOutsideSubquery => [ FUNCNAME => BOOLEAN, ...]
+
+Defines whether the specified function or method is allowed outside
+subqueries. FUNCNAME is the name as used in the query expression.
+See also: defineFunction and defineMethod
+
+=item ConstFunc => [ FUNCNAME => BOOLEAN, ...]
+
+Defines whether the function (not method!) is a "constant" function.
+FUNCNAME is the name as used in the query expression.
+See L<Constant Function Invocations> for a definition of "constant"
+See also: defineFunction and defineMethod
+
+=item CompareOper => [ OPERNAME => FUNCREF, ...]
+
+Defines the comparison operator with the specified OPERNAME, e.g. if
+OPERNAME is "contains", you can use "$contains$" in the query.
+See also: defineComparisonOperators
+
+=item q => TOKEN
+
+Defines the q// token. See also: defineTokenQ
+
+=item qq => TOKEN
+
+Defines the qq// token. See also: defineTokenQQ
+
+=item Error => FUNCREF
+
+Defines the function that is called when errors occur during parsing the
+query expression. The default function prints an error message to STDERR.
+
+=item Debug => FLAGS
+
+Sets the debug level for the Yapp parser that parses the query expression.
+Default value is 0 (don't print anything). The maximum value is 0x17, which
+prints a lot of stuff. See the Parse::Yapp manpage for the meaning of the
+individual bits.
+
+=item Reserved hash keys
+
+Users may add their own (key, value) pairs to the Query constructor.
+Beware that the key 'Tree' is used internally.
+
+=back
+
+=head1 XML::XQL::Query methods
+
+=over 4
+
+=item solve (INPUT_LIST...)
+
+Note that solve takes a list of nodes which are assumed to be in document order
+and must belong to the same document. E.g:
+
+ $query = new XML::XQL::Query (Expr => "doc//book");
+ @result = $query->solve ($doc);
+ @result2 = $query->solve ($node1, $node2, $node3);
+
+=back
+
+The following functions are also available at the query level, i.e. when called
+on a Query object they only affect this Query and no others:
+
+ defineFunction, defineMethod, defineComparisonOperators,
+ defineTokenQ, defineTokenQQ
+
+See L<Global functions|XML::XQL/XML::XQL global functions> for details.
+Another way to define these features for a particular Query is by passing the
+appropriate values to the XML::XQL::Query constructor.
+
+=head1 SEE ALSO
+
+L<XML::XQL> for general information about the XML::XQL module
+
+L<XML::XQL::Tutorial> which describes the XQL syntax
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL/Strict.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,12 @@
+package XML::XQL::Strict;
+
+BEGIN
+{
+ die "Can't 'use' or 'require' XML::XQL module before XML::XQL::Strict\nJust 'us' or 'require' XML::XQL::Strict instead" if ($XML::XQL::Included);
+
+ $XML::XQL::Restricted = 1;
+
+ require XML::XQL;
+};
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/XQL/Tutorial.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1357 @@
+=head1 NAME
+
+XML::XQL::Tutorial - Describes the XQL query syntax
+
+=head1 DESCRIPTION
+
+This document describes basic the features of the XML Query Language (XQL.)
+A proposal for the XML Query Language (XQL) specification was submitted
+to the XSL Working Group in September 1998.
+The spec can be found at L<http://www.w3.org/TandS/QL/QL98/pp/xql.html>.
+Since it is only a proposal at this point, things may change, but it is very
+likely that the final version will be close to the proposal.
+Most of this document was copied straight from the spec.
+
+See also the L<XML::XQL> man page.
+
+=head1 INTRODUCTION
+
+XQL (XML Query Language) provides a natural extension to the XSL pattern
+language. It builds upon the capabilities XSL provides for identifying classes
+of nodes, by adding Boolean logic, filters, indexing into collections of nodes,
+and more.
+
+XQL is designed specifically for XML documents.
+It is a general purpose query language, providing a single syntax
+that can be used for queries, addressing, and patterns.
+XQL is concise, simple, and powerful.
+
+XQL is designed to be used in many contexts. Although it is a superset of XSL
+patterns, it is also applicable to providing links to nodes, for searching
+repositories, and for many other applications.
+
+Note that the term XQL is a working term for the language described in this
+proposal. It is not their intent that this term be used permanently.
+Also, beware that another query language exists called XML-QL,
+which uses a syntax very similar to SQL.
+
+The L<XML::XQL> module has added functionality to the XQL spec, called I<XQL+>.
+To allow only XQL functionality as described in the spec, use the
+XML::XQL::Strict module. Note that the XQL spec makes the distinction between
+core XQL and XQL extensions. This implementation makes no distinction and
+the Strict module, therefore, implements everything described in the XQL spec.
+See the L<XML::XQL> man page for more information about the Strict module.
+This tutorial will clearly indicate when referring to XQL+.
+
+=head1 XQL Patterns
+
+This section describes the core XQL notation. These features should be part
+of every XQL implementation, and serve as the base level of functionality
+for its use in different technologies.
+
+The basic syntax for XQL mimics the URI directory navigation syntax, but
+instead of specifying navigation through a
+physical file structure, the navigation is through elements in the XML tree.
+
+For example, the following URI means find the foo.jpg file within the bar
+directory:
+
+ bar/foo.jpg
+
+Similarly, in XQL, the following means find the collection of fuz elements
+within baz elements:
+
+ baz/fuz
+
+Throughout this document you will find numerous samples. They refer to the data
+shown in the sample file at the end of this man page.
+
+=head1 Context
+
+A I<context> is the set of nodes against which a query operates.
+For the entire query, which is passed to the L<XML::XQL::Query>
+constructor through the I<Expr> option, the context is the list of input nodes
+that is passed to the query() method.
+
+XQL allows a query to select between using the current context as the input
+context and using the 'root context' as the input context.
+The 'root context' is a context containing only the root-most
+element of the document. When using XML::DOM, this is the Document object.
+
+By default, a query uses the current context. A query prefixed with '/'
+(forward slash) uses the root context. A query may
+optionally explicitly state that it is using the current context by using
+the './' (dot, forward slash) prefix. Both of these
+notations are analogous to the notations used to navigate directories in a file
+system.
+
+The './' prefix is only required in one situation. A query may use the '//'
+operator to indicate recursive descent. When
+this operator appears at the beginning of the query, the initial '/' causes the
+recursive decent to perform relative to the
+root of the document or repository. The prefix './/' allows a query to perform
+a recursive descent relative to the current context.
+
+=over 4
+
+=item Examples:
+
+Find all author elements within the current context. Since the period is really
+not used alone, this example forward-references other features:
+
+ ./author
+
+Note that this is equivalent to:
+
+ author
+
+Find the root element (bookstore) of this document:
+
+ /bookstore
+
+Find all author elements anywhere within the current document:
+
+ //author
+
+Find all books where the value of the style attribute on the book is equal to
+the value of the specialty attribute of the bookstore element at the root of
+the document:
+
+ book[/bookstore/@specialty = @style]
+
+=back
+
+=head1 Query Results
+
+The collection returned by an XQL expression preserves document order,
+hierarchy, and identity, to the extent that these are defined.
+That is, a collection of elements will always be returned in document order
+without repeats. Note that the spec states that the order of attributes within
+an element is undefined, but that this implementation does keep attributes
+in document order. See the L<XML::XQL> man page for more details regarding
+I<Document Order>.
+
+=head1 Collections - 'element' and '.'
+
+The collection of all elements with a certain tag name is expressed using the
+tag name itself. This can be qualified by showing that the elements are
+selected from the current context './', but the current context is assumed and
+often need not be noted explicitly.
+
+=over 4
+
+=item Examples:
+
+Find all first-name elements. These examples are equivalent:
+
+ ./first-name
+
+ first-name
+
+Find all unqualified book elements:
+
+ book
+
+Find all first.name elements:
+
+ first.name
+
+=back
+
+=head1 Selecting children and descendants - '/' and '//'
+
+The collection of elements of a certain type can be determined using the path
+operators ('/' or '//'). These operators take as their arguments a collection
+(left side) from which to query elements, and a collection indicating which
+elements to select (right side). The child operator ('/')selects from immediate
+children of the left-side collection, while the descendant operator ('//')
+selects from arbitrary descendants of the left-side collection.
+In effect, the '//' can be thought of as a substitute for one or more levels of
+hierarchy. Note that the path operators change the context as the
+query is performed. By stringing them together users can 'drill down' into the
+document.
+
+=over 4
+
+=item Examples:
+
+Find all first-name elements within an author element. Note that the author
+children of the current context are found, and then first-name children are
+found relative to the context of the author elements:
+
+ author/first-name
+
+Find all title elements, one or more levels deep in the bookstore
+(arbitrary descendants):
+
+ bookstore//title
+
+Note that this is different from the following query, which finds all title
+elements that are grandchildren of bookstore elements:
+
+ bookstore/*/title
+
+Find emph elements anywhere inside book excerpts, anywhere inside the bookstore:
+
+ bookstore//book/excerpt//emph
+
+Find all titles, one or more levels deep in the current context. Note that this
+situation is essentially the only one where
+the period notation is required:
+
+ .//title
+
+=back
+
+=head1 Collecting element children - '*'
+
+An element can be referenced without using its name by substituting the '*'
+collection. The '*' collection returns all
+elements that are children of the current context, regardless of their tag name.
+
+=over 4
+
+=item Examples:
+
+Find all element children of author elements:
+
+ author/*
+
+Find all last-names that are grand-children of books:
+
+ book/*/last-name
+
+Find the grandchildren elements of the current context:
+
+ */*
+
+Find all elements with specialty attributes. Note that this example uses
+subqueries, which are covered in Filters, and
+attributes, which are discussed in Finding an attribute:
+
+ *[@specialty]
+
+=back
+
+=head1 Finding an attribute - '@'
+
+Attribute names are preceded by the '@' symbol. XQL is designed to treat
+attributes and sub-elements impartially,
+and capabilities are equivalent between the two types wherever possible.
+
+Note: attributes cannot contain subelements. Thus, attributes cannot have path
+operators applied to them in a query.
+Such expressions will result in a syntax error.
+The XQL spec states that attributes are inherently unordered and indices
+cannot be applied to them, but this implementation allows it.
+
+=over 4
+
+=item Examples:
+
+Find the style attribute of the current element context:
+
+ @style
+
+Find the exchange attribute on price elements within the current context:
+
+ price/@exchange
+
+The following example is not valid:
+
+ price/@exchange/total
+
+Find all books with style attributes. Note that this example uses subqueries,
+which are covered in Filters:
+
+ book[@style]
+
+Find the style attribute for all book elements:
+
+ book/@style
+
+=back
+
+=head1 XQL Literals
+
+XQL query expressions may contain literal values (i.e. constants.)
+Numbers (integers and floats) are wrapped in XML::XQL::Number objects and
+strings in XML::XQL::Text objects. Booleans (as returned by true() and false())
+are wrapped in XML::XQL::Boolean objects.
+
+Strings must be enclosed in single or double quotes. Since XQL does not allow
+escaping of special characters, it's impossible to create a string with both
+a single and a double quote in it. To remedy this, XQL+ has added the q// and
+qq// string delimiters which behave just like they do in Perl.
+
+For Numbers, exponential notation is not allowed. Use the XQL+ function eval()
+to circumvent this problem. See L<XML::XQL> man page for details.
+
+The empty list or undef is represented by [] (i.e. reference to empty array)
+in this implementation.
+
+=over 4
+
+=item Example
+
+Integer Numbers:
+
+ 234
+ -456
+
+Floating point Numbers:
+
+ 1.23
+ -0.99
+
+Strings:
+
+ "some text with 'single' quotes"
+ 'text with "double" quotes'
+
+Not allowed:
+
+ 1.23E-4 (use eval("1.23E-4", "Number") in XQL+)
+
+ "can't use \"double \"quotes" (use q/can't use "double" quotes/ in XQL+)
+
+=back
+
+=head1 Grouping - '()'
+
+Parentheses can be used to group collection operators for clarity or where the
+normal precedence is inadequate to express an operation.
+
+=head1 Filters - '[]'
+
+Constraints and branching can be applied to any collection by adding a filter
+clause '[ ]' to the collection. The filter is analogous to the SQL WHERE clause
+with ANY semantics. The filter contains a query within it, called the
+subquery. The subquery evaluates to a Boolean, and is tested for each element
+in the collection. Any elements in the collection failing the subquery test are
+omitted from the result collection.
+
+For convenience, if a collection is placed within the filter, a Boolean TRUE
+is generated if the collection contains any members, and a FALSE is generated
+if the collection is empty. In essence, an expression such as author/degree
+implies a collection-to-Boolean conversion function like the following
+mythical 'there-exists-a' method.
+
+ author[.there-exists-a(degree)]
+
+Note that any number of filters can appear at a given level of an expression.
+Empty filters are not allowed.
+
+=over 4
+
+=item Examples:
+
+Find all books that contain at least one excerpt element:
+
+ book[excerpt]
+
+Find all titles of books that contain at least one excerpt element:
+
+ book[excerpt]/title
+
+Find all authors of books where the book contains at least one excerpt, and
+the author has at least one degree:
+
+ book[excerpt]/author[degree]
+
+Find all books that have authors with at least one degree:
+
+ book[author/degree]
+
+Find all books that have an excerpt and a title:
+
+ book[excerpt][title]
+
+=back
+
+=head2 Any and all semantics - '$any$' and '$all$'
+
+Users can explicitly indicate whether to use any or all semantics through
+the $any$ and $all$ keywords.
+
+$any$ flags that a condition will hold true if any item in a set meets that
+condition. $all$ means that all elements in a
+set must meet the condition for the condition to hold true.
+
+$any$ and $all$ are keywords that appear before a subquery expression within
+a filter.
+
+=over 4
+
+=item Examples:
+
+Find all author elements where one of the last names is Bob:
+
+ author[last-name = 'Bob']
+
+ author[$any$ last-name = 'Bob']
+
+Find all author elements where none of the last-name elements are Bob:
+
+ author[$all$ last-name != 'Bob']
+
+Find all author elements where the first last name is Bob:
+
+ author[last-name[0] = 'Bob']
+
+=back
+
+=head1 Indexing into a collection - '[]' and '$to$'
+
+XQL makes it easy to find a specific node within a set of nodes.
+Simply enclose the index ordinal within square brackets. The ordinal is 0 based.
+
+A range of elements can be returned. To do so, specify an expression rather
+than a single value inside of the subscript operator (square brackets).
+Such expressions can be a comma separated list of any of the following:
+
+ n Returns the nth element
+ -n Returns the element that is n-1 units from the last element.
+ E.g., -1 means the last element. -2 is the next to last element.
+ m $to$ n Returns elements m through n, inclusive
+
+=over 4
+
+=item Examples:
+
+Find the first author element:
+
+ author[0]
+
+Find the third author element that has a first-name:
+
+ author[first-name][2]
+
+Note that indices are relative to the parent. In other words, consider the
+following data:
+
+ <x>
+ <y/>
+ <y/>
+ </x>
+ <x>
+ <y/>
+ <y/>
+ </x>
+
+The following expression will return the first y from each of the x's:
+
+ x/y[0]
+
+The following will return the first y from the entire set of y's within x's:
+
+ (x/y)[0]
+
+The following will return the first y from the first x:
+
+ x[0]/y[0]
+
+Find the first and fourth author elements:
+
+ author[0,3]
+
+Find the first through fourth author elements:
+
+ author[0 $to$ 3]
+
+Find the first, the third through fifth, and the last author elements:
+
+ author[0, 2 $to$ 4, -1]
+
+Find the last author element:
+
+ author[-1]
+
+=back
+
+=head1 Boolean Expressions
+
+Boolean expressions can be used within subqueries. For example, one could use
+Boolean expressions to find all nodes of a particular value, or all nodes with
+nodes in particular ranges. Boolean expressions are of the form
+${op}$, where {op} may be any expression of the form {b|a} - that is, the
+operator takes lvalue and rvalue arguments and returns a Boolean result.
+
+Note that the XQL Extensions section defines additional Boolean operations.
+
+=head2 Boolean AND and OR - '$and$' and '$or$'
+
+$and$ and $or$ are used to perform Boolean ands and ors.
+
+The Boolean operators, in conjunction with grouping parentheses, can be used to
+build very sophisticated logical expressions.
+
+Note that spaces are not significant and can be omitted, or included for
+clarity as shown here.
+
+=over 4
+
+=item Examples:
+
+Find all author elements that contain at least one degree and one award.
+
+ author[degree $and$ award]
+
+Find all author elements that contain at least one degree or award and at
+least one publication.
+
+ author[(degree $or$ award) $and$ publication]
+
+=back
+
+=head2 Boolean NOT - '$not$'
+
+$not$ is a Boolean operator that negates the value of an expression within a
+subquery.
+
+=over 4
+
+=item Examples:
+
+Find all author elements that contain at least one degree element and that
+contain no publication elements.
+
+ author[degree $and$ $not$ publication]
+
+Find all author elements that contain publications elements but do not contain
+either degree elements or award elements.
+
+ author[$not$ (degree $or$ award) $and$ publication]
+
+=back
+
+=head1 Union and intersection - '$union$', '|' and '$intersect$'
+
+The $union$ operator (shortcut is '|') returns the combined set of values from
+the query on the left and the query on the right. Duplicates are filtered out.
+The resulting list is sorted in document order.
+
+Note: because this is a union, the set returned may include 0 or more elements
+of each element type in the list. To restrict the returned set to nodes that
+contain at least one of each of the elements in the list, use a filter, as
+discussed in Filters.
+
+The $intersect$ operator returns the set of elements in common between two sets.
+
+=over 4
+
+=item Examples:
+
+Find all first-names and last-names:
+
+ first-name $union$ last-name
+
+Find all books and magazines from a bookstore:
+
+ bookstore/(book | magazine)
+
+Find all books and all authors:
+
+ book $union$ book/author
+
+Find the first-names, last-names, or degrees from authors within either books
+or magazines:
+
+ (book $union$ magazine)/author/(first-name $union$ last-name $union$ degree)
+
+Find all books with author/first-name equal to 'Bob' and all magazines with
+price less than 10:
+
+ book[author/first-name = 'Bob'] $union$ magazine[price $lt$ 10]
+
+=back
+
+=head1 Equivalence - '$eq$', '=', '$ne$' and '!='
+
+The '=' sign is used for equality; '!=' for inequality. Alternatively, $eq$ and
+ $ne$ can be used for equality and inequality.
+
+Single or double quotes can be used for string delimiters in expressions.
+This makes it easier to construct and pass XQL from within scripting languages.
+
+For comparing values of elements, the value() method is implied. That is,
+last-name < 'foo' really means last-name!value() < 'foo'.
+
+Note that filters are always with respect to a context. That is, the expression
+book[author] means for every book element that is found, see if it has an
+author subelement. Likewise, book[author = 'Bob'] means for
+every book element that is found, see if it has a subelement named author
+whose value is 'Bob'. One can examine the value of the context as well, by
+using the . (period). For example, book[. = 'Trenton'] means for every
+book that is found, see if its value is 'Trenton'.
+
+=over 4
+
+=item Examples:
+
+Find all author elements whose last name is Bob:
+
+ author[last-name = 'Bob']
+
+ author[last-name $eq$ 'Bob']
+
+Find all authors where the from attribute is not equal to 'Harvard':
+
+ degree[@from != 'Harvard']
+
+ degree[@from $ne$ 'Harvard']
+
+Find all authors where the last-name is the same as the /guest/last-name element:
+
+ author[last-name = /guest/last-name]
+
+Find all authors whose text is 'Matthew Bob':
+
+ author[. = 'Matthew Bob']
+
+ author = 'Matthew Bob'
+
+=back
+
+=head2 Comparison - '<', '<=', '>', '>=', '$lt', '$ilt$' etc.
+
+A set of binary comparison operators is available for comparing numbers and
+strings and returning Boolean results.
+$lt$, $le$, $gt$, $ge$ are used for less than, less than or equal, greater
+than, or greater than or equal. These same
+operators are also available in a case insensitive form: $ieq$, $ine$, $ilt$,
+$ile$, $igt$, $ige$.
+
+<, <=, > and >= are allowed short cuts for $lt$, $le$, $gt$ and $ge$.
+
+=over 4
+
+=item Examples:
+
+Find all author elements whose last name is bob and whose price is > 50
+
+ author[last-name = 'Bob' $and$ price $gt$ 50]
+
+Find all authors where the from attribute is not equal to 'Harvard':
+
+ degree[@from != 'Harvard']
+
+Find all authors whose last name begins with 'M' or greater:
+
+ author[last-name $ge$ 'M']
+
+Find all authors whose last name begins with 'M', 'm' or greater:
+
+ author[last-name $ige$ 'M']
+
+Find the first three books:
+
+ book[index() $le$ 2]
+
+Find all authors who have more than 10 publications:
+
+ author[publications!count() $gt$ 10]
+
+=back
+
+=head2 XQL+ Match operators - '$match$', '$no_match$', '=~' and '!~'
+
+XQL+ defines additional operators for pattern matching. The $match$ operator
+(shortcut is '=~') returns TRUE if the lvalue matches the pattern described by
+the rvalue. The $no_match$ operator (shortcut is '!~') returns FALSE if they
+match. Both lvalue and rvalue are first cast to strings.
+
+The rvalue string should have the syntax of a Perl rvalue, that is the delimiters
+should be included and modifiers are allowed. When using delimiters other than
+slashes '/', the 'm' should be included. The rvalue should be a string, so don't
+forget the quotes! (Or use the q// or qq// delimiters in XQL+, see L<XML::XQL>
+man page.)
+
+Note that you can't use the Perl substitution operator s/// here. Try using the
+XQL+ subst() function instead.
+
+=over 4
+
+=item Examples:
+
+Find all authors whose name contains bob or Bob:
+
+ author[first-name =~ '/[Bb]ob/']
+
+Find all book titles that don't contain 'Trenton' (case-insensitive):
+
+ book[title !~ 'm!trenton!i']
+
+=back
+
+=head2 Oher XQL+ comparison operators - '$isa', '$can$'
+
+See the L<XML::XQL> man page for other operators available in XQL+.
+
+=head2 Comparisons and vectors
+
+The lvalue of a comparison can be a vector or a scalar. The rvalue of a
+comparison must be a scalar or a value that can be cast at runtime to a scalar.
+
+If the lvalue of a comparison is a set, then any (exists) semantics are used
+for the comparison operators. That is, the result of a comparison is true if
+any item in the set meets the condition.
+
+=head2 Comparisons and literals
+
+The spec states that the lvalue of an expression cannot be a literal.
+That is, I<'1' = a> is not allowed. This implementation allows it, but it's not
+clear how useful that is.
+
+=head2 Casting of literals during comparison
+
+Elements, attributes and other XML node types are casted to strings (Text)
+by applying the value() method. The value() method calls the text() method by
+default, but this behavior can be altered by the user, so the value() method
+may return other XQL data types.
+
+When two values are compared, they are first casted to the same type.
+See the L<XML::XQL> man page for details on casting.
+
+Note that the XQL spec is not very clear on how values should be casted for
+comparison. Discussions with the authors of the XQL spec revealed that there
+was some disagreement and their implementations differed on this point.
+This implementation is closest to that of Joe Lapp from webMethods, Inc.
+
+=head1 Methods - 'method()' or 'query!method()'
+
+XQL makes a distinction between functions and methods.
+See the L<XML::XQL> man page for details.
+
+XQL provides methods for advanced manipulation of collections. These methods
+provide specialized collections of nodes (see Collection methods), as well as
+information about sets and nodes.
+
+Methods are of the form I<method(arglist)>
+
+Consider the query book[author]. It will find all books that have authors.
+Formally, we call the book corresponding to a particular author the reference
+node for that author. That is, every author element that is examined is an author
+for one of the book elements. (See the Annotated XQL BNF Appendix for a much
+more thorough definition of reference node and other terms. See also the
+XML::XQL man page.) Methods always apply to the reference node.
+
+For example, the text() method returns the text contained within a node,
+minus any structure. (That is, it is the concatenation of all text nodes
+contained with an element and its descendants.) The following expression will
+return all authors named 'Bob':
+
+ author[text() = 'Bob']
+
+The following will return all authors containing a first-name child whose
+text is 'Bob':
+
+ author[first-name!text() = 'Bob']
+
+The following will return all authors containing a child named Bob:
+
+ author[*!text() = 'Bob']
+
+Method names are case sensitive.
+See the L<XML::XQL> man page on how to define your own methods and functions.
+
+=head2 Information methods
+
+The following methods provide information about nodes in a collection.
+These methods return strings or numbers,
+and may be used in conjunction with comparison operators within subqueries.
+
+=over 4
+
+=item Method: text()
+
+The text() method concatenates text of the descendents of a node,
+normalizing white space along the way. White space will be preserved for a node
+if the node has the xml:space attribute set to 'preserve', or if the
+nearest ancestor with the xml:space attribute has the attribute set to
+'preserve'. When white space is normalized, it is normalized across the
+entire string. Spaces are used to separate the text between nodes.
+When entity references are used in a document, spacing is not inserted
+around the entity refs when they are expanded.
+
+In this implementation, the method may receive an optional parameter
+to indicate whether the text() of Element nodes should include the text() of
+its Element descendants. See L<XML::XQL> man page for details.
+
+Examples:
+
+Find the authors whose last name is 'Bob':
+
+ author[last-name!text() = 'Bob']
+
+Note this is equivalent to:
+
+ author[last-name = 'Bob']
+
+Find the authors with value 'Matthew Bob':
+
+ author[text() = 'Matthew Bob']
+
+ author[. = 'Matthew Bob']
+
+ author = 'Matthew Bob'
+
+=item Method: rawText()
+
+The rawText() method is similar to the text() method, but it does not
+normalize whitespace.
+
+In this implementation, the method may receive an optional parameter
+to indicate whether the rawText() of Element nodes should include the
+rawText() of its Element descendants. See L<XML::XQL> man page for details.
+
+=item Method: value()
+
+Returns a type cast version of the value of a node. If no data type is
+provided, returns the same as text().
+
+=over 4
+
+=item Shortcuts
+
+For the purposes of comparison, value( )is implied if omitted.
+In other words, when two items are compared, the comparison is between
+the value of the two items. Remember that in absence of type information,
+value() returns text().
+
+The following examples are equivalent:
+
+ author[last-name!value() = 'Bob' $and$ first-name!value() = 'Joe']
+
+ author[last-name = 'Bob' $and$ first-name = 'Joe']
+
+ price[@intl!value() = 'canada']
+
+ price[@intl = 'canada']
+
+=back
+
+=item Method: nodeType()
+
+Returns a number to indicate the type of the node. The values were based
+on the node type values in the DOM:
+
+ element 1
+ attribute 2
+ text 3
+ entity 6 (not in XQL spec)
+ PI 7
+ comment 8
+ document 9
+ doc. fragment 10 (not in XQL spec)
+ notation 11 (not in XQL spec)
+
+Note that in XQL, CDATASection nodes and EntityReference nodes also return 3,
+whereas in the DOM CDATASection returns 4 and EntityReference returns 5.
+Use the XQL+ method DOM_nodeType() to get DOM node type values.
+See the L<XML::DOM> man page for node type values of nodes not mentioned here.
+
+=item Method: nodeTypeString
+
+Returns the name of the node type in lowercase or an empty string. The
+following node types are currently supported 1 (element), 2 (attribute),
+3 (text), 7 (processing_instruction), 8 (comment), 9 (document)
+
+=item Method: nodeName()
+
+Returns the tag name for Element nodes and the attribute name of attributes.
+
+=back
+
+=head2 Collection index methods
+
+=over 4
+
+=item Method: index()
+
+Returns the index of the value within the search context (i.e. with the input
+list of the subquery.) This is not necessarily the same as the index of a
+node within its parent node. Note that the XQL spec doesn't explain it well.
+
+=over 4
+
+=item Examples:
+
+Find the first 3 degrees:
+
+ degree[index() $lt$ 3]
+
+Note that it skips over other nodes that may exist between the degree elements.
+
+Consider the following data:
+
+ <x>
+ <y/>
+ <y/>
+ </x>
+ <x>
+ <y/>
+ <y/>
+ </x>
+
+The following expression will return the first y from each x:
+
+ x/y[index() = 0]
+
+This could also be accomplished by (see Indexing into a Collection):
+
+ x/y[0]
+
+=back
+
+=item Method: end()
+
+The end() method returns true for the last element in the search context.
+Again, the XQL spec does not explain it well.
+
+=over 4
+
+=item Examples:
+
+Find the last book:
+
+ book[end()]
+
+Find the last author for each book:
+
+ book/author[end()]
+
+Find the last author from the entire set of authors of books:
+
+ (book/author)[end()]
+
+=back
+
+=back
+
+=head2 Aggregate methods
+
+=over 4
+
+=item Method: count( [QUERY] )
+
+Returns the number of values inside the search context.
+In XQL+, when the optional QUERY parameter is supplied, it returns the number of
+values returned by the QUERY.
+
+=back
+
+=head2 Namespace methods
+
+The following methods can be applied to a node to return namespace information.
+
+=over 4
+
+=item Method: baseName()
+
+Returns the local name portion of the node, excluding the prefix.
+Local names are defined only for element nodes and attribute nodes.
+The local name of an element node is the local
+portion of the node's element type name. The local name of an attribute node is
+the local portion of the node's attribute name. If a local name is not defined
+for the reference node, the method evaluates to the empty set.
+
+=item Method: namespace()
+
+Returns the URI for the namespace of the node.
+Namespace URIs are defined only for element nodes and attribute nodes.
+The namespace URI of an element node is the namespace URI associated with the
+node's element type name. The namespace URI of an attribute node is
+the namespace URI associated with the node's attribute name. If a namespace
+URI is not defined for the reference node, the method evaluates to the
+empty set.
+
+=item Method: prefix()
+
+Returns the prefix for the node. Namespace prefixes are defined only for
+element nodes and attribute nodes. The namespace prefix of an element
+node is the shortname for the namespace of the node's element type name.
+The namespace prefix of an attribute
+node is the shortname for the namespace of the node's attribute name.
+If a namespace prefix is not defined
+for the reference node, the method evaluates to the empty set.
+
+The spec states: A node's namespace prefix may be defined
+within the query expression, within the document under query, or within both
+the query expression and the document under query. If it is defined in both
+places the prefixes may not agree. In this case, the prefix assigned by
+the query expression takes precedence.
+In this implementation you cannot define the namespace for a query, so this
+can never happen.
+
+=over 4
+
+=item Examples:
+
+Find all unqualified book elements. Note that this does not return my:book
+elements:
+
+ book
+
+Find all book elements with the prefix 'my'. Note that this query does not
+return unqualified book elements:
+
+ my:book
+
+Find all book elements with a 'my' prefix that have an author subelement:
+
+ my:book[author]
+
+Find all book elements with a 'my' prefix that have an author subelement with a
+my prefix:
+
+ my:book[my:author]
+
+Find all elements with a prefix of 'my':
+
+ my:*
+
+Find all book elements from any namespace:
+
+ *:book
+
+Find any element from any namespace:
+
+ *
+
+Find the style attribute with a 'my' prefix within a book element:
+
+ book/@my:style
+
+=back
+
+All attributes of an element can be returned using @*.
+This is potentially useful for applications that treat attributes
+as fields in a record.
+
+=over 4
+
+=item Examples:
+
+Find all attributes of the current element context:
+
+ @*
+
+Find style attributes from any namespace:
+
+ @*:style
+
+Find all attributes from the 'my' namespace, including unqualified attributes on
+elements from the 'my' namespace:
+
+ @my:*
+
+=back
+
+=back
+
+=head1 Functions
+
+This section defines the functions of XQL. The spec states that:
+XQL defines two kinds of functions:
+collection functions and pure functions. Collection functions use the search
+context of the Invocation instance, while pure functions ignore the
+search context, except to evaluate the function's parameters. A collection
+function evaluates to a subset of the search context, and a pure function
+evaluates to either a constant value or to a value that depends only on the
+function's parameters.
+
+Don't worry if you don't get it. Just use them!
+
+=head2 Collection functions
+
+The collection functions provide access to the various types of nodes in a
+document. Any of these collections can be constrained and indexed.
+The collections return the set of children of the reference node meeting the
+particular restriction.
+
+=over 4
+
+=item Function: textNode()
+
+The collection of text nodes.
+
+=item Function: comment()
+
+The collection of comment nodes.
+
+=item Function: pi()
+
+The collection of processing instruction nodes.
+
+=item Function: element( [NAME] )
+
+The collection of all element nodes. If the optional text
+parameter is provided, it only returns element children
+matching that particular name.
+
+=item Function: attribute( [NAME] )
+
+The collection of all attribute nodes. If the optional text
+parameter is provided, it only returns attributes matching that
+particular name.
+
+=item Function: node()
+
+The collection of all non-attribute nodes.
+
+=over 4
+
+=item Examples:
+
+Find the second text node in each p element in the current context:
+
+ p/textNode()[1]
+
+Find the second comment anywhere in the document. See Context for details on
+setting the context to the document root:
+
+ //comment()[1]
+
+=back
+
+=back
+
+=head2 Other XQL Functions
+
+=over 4
+
+=item Function: ancestor(QUERY)
+
+Finds the nearest ancestor matching the provided query. It returns either a
+single element result or an empty set [].
+Note that this node is never the reference node itself.
+
+=over 4
+
+=item Examples:
+
+Find the nearest book ancestor of the current element:
+
+ ancestor(book)
+
+Find the nearest ancestor author element that is contained in a book element:
+
+ ancestor(book/author)
+
+=back
+
+=item Function: id(NAME)
+
+Pure function that evaluates to a set. The set contains an element node that
+has an 'id' attribute whose value is identical to the string that the Text
+parameter quotes. The element node may appear anywhere within the
+document under query. If more than one element node meets these criteria,
+the function evaluates to a set that contains the first node appearing in a
+document ordering of the nodes.
+
+=item Function: true() and false()
+
+Pure functions that each evaluate to a Boolean. "true()" evaluates to 'true',
+and "false()" evaluates to 'false'. These functions are useful in expressions
+that are constructed using entity references or variable substitution, since
+they may replace an expression found in an instance of Subquery without
+violating the syntax required by the instance of Subquery.
+They return an object of type XML::XQL::Boolean.
+
+=item Function: date(QUERY)
+
+"date" is a pure function that typecasts the value of its parameter to a set of
+dates. If the parameter matches a single string, the value of the function is a
+set containing a single date. If the parameter matches a QUERY, the value of
+the function is a set of dates, where the set contains one date for each member
+of the set to which the parameter evaluates.
+
+XQL does not define the representation of the date value, nor does it
+define how the function translates parameter values into dates.
+This implementation uses the Date::Manip module to parse dates, which accepts
+almost any imaginable format. See L<XML::XQL> to plug in your own
+Date implementation.
+
+Include the L<XML::XQL::Date> package to add the XQL date type and the date()
+function, like this:
+
+ use XML::XQL::Date;
+
+=item Perl builtin functions and other XQL+ functions
+
+XQL+ provides XQL function wrappers for most Perl builtin functions.
+It also provides other cool functions like subst(), map(), and eval() that
+allow you to modify documents and embed perl code.
+If this is still not enough, you can add your own function and methods.
+See L<XML::XQL> man page for details.
+
+=back
+
+=head1 Sequence Operators - ';' and ';;'
+
+The whitepaper 'The Design of XQL' by Jonathan Robie, which can be found
+at L<http://www.texcel.no/whitepapers/xql-design.html> describes the sequence
+operators ';;' (precedes) and ';' (immediately precedes.) Although these
+operators are not included in the XQL spec, I thought I'd add them anyway.
+
+=head2 Immediately Precedes - ';'
+
+=over 4
+
+=item Example:
+
+With the following input:
+
+ <TABLE>
+ <ROWS>
+ <TR>
+ <TD>Shady Grove</TD>
+ <TD>Aeolian</TD>
+ </TR>
+ <TR>
+ <TD>Over the River, Charlie</TD>
+ <TD>Dorian</TD>
+ </TR>
+ </ROWS>
+ </TABLE>
+
+Find the TD node that contains "Shady Grove" and the TD node that immediately
+follows it:
+
+ //(TD="Shady Grove" ; TD)
+
+=back
+
+Note that in XML::DOM there is actually a text node with whitespace between
+the two TD nodes, but those are ignored by this operator, unless the text node
+has 'xml:space' set to 'preserve'. See ??? for details.
+
+=head2 Precedes - ';;'
+
+=over 4
+
+=item Example:
+
+With the following input (from Hamlet):
+
+ <SPEECH>
+ <SPEAKER>MARCELLUS</SPEAKER>
+ <LINE>Tis gone!</LINE>
+ <STAGEDIR>Exit Ghost</STAGEDIR>
+ <LINE>We do it wrong, being so majestical,</LINE>
+ <LINE>To offer it the show of violence;</LINE>
+ <LINE>For it is, as the air, invulnerable,</LINE>
+ <LINE>And our vain blows malicious mockery.</LINE>
+ </SPEECH>
+
+Return the STAGEDIR and all the LINEs that follow it:
+
+ SPEECH//( STAGEDIR ;; LINE )
+
+Suppose an actor playing the ghost wants to know when to exit; that is, he
+wants to know who says what line just before
+he is supposed to exit. The line immediately precedes the stagedir, but the
+speaker may occur at any time before the line.
+In this query, we will use the "precedes" operator (";;") to identify a speaker
+that precedes the line somewhere within a
+speech. Our ghost can find the required information with the following query,
+which selects the speaker, the line, and the stagedir:
+
+ SPEECH//( SPEAKER ;; LINE ; STAGEDIR="Exit Ghost")
+
+=back
+
+=head1 Operator Precedence
+
+The following table lists operators in precedence order, highest precedence
+first, where operators of a given row have the same precedence.
+The table also lists the associated productions:
+
+ Production Operator(s)
+ ---------- -----------
+ Grouping ( )
+ Filter [ ]
+ Subscript [ ]
+ Bang !
+ Path / //
+ Match $match$ $no_match$ =~ !~ (XQL+ only)
+ Comparison = != < <= > >= $eq$ $ne$ $lt$ $le$ $gt$
+ $ge$ $ieq$ $ine$ $ilt$ $ile$ $igt$ $ige$
+ Intersection $intersect$
+ Union $union$ |
+ Negation $not$
+ Conjunction $and$
+ Disjunction $or$
+ Sequence ; ;;
+
+=head1 Sample XML Document - bookstore.xml
+
+This file is also stored in samples/bookstore.xml that comes with the
+XML::XQL distribution.
+
+ <?xml version='1.0'?>
+ <!-- This file represents a fragment of a book store inventory database -->
+ <bookstore specialty='novel'>
+ <book style='autobiography'>
+ <title>Seven Years in Trenton</title>
+ <author>
+ <first-name>Joe</first-name>
+ <last-name>Bob</last-name>
+ <award>Trenton Literary Review Honorable Mention</award>
+ </author>
+ <price>12</price>
+ </book>
+ <book style='textbook'>
+ <title>History of Trenton</title>
+ <author>
+ <first-name>Mary</first-name>
+ <last-name>Bob</last-name>
+ <publication>
+ Selected Short Stories of
+ <first-name>Mary</first-name> <last-name>Bob</last-name>
+ </publication>
+ </author>
+ <price>55</price>
+ </book>
+ <magazine style='glossy' frequency='monthly'>
+ <title>Tracking Trenton</title>
+ <price>2.50</price>
+ <subscription price='24' per='year'/>
+ </magazine>
+ <book style='novel' id='myfave'>
+ <title>Trenton Today, Trenton Tomorrow</title>
+ <author>
+ <first-name>Toni</first-name>
+ <last-name>Bob</last-name>
+ <degree from='Trenton U'>B.A.</degree>
+ <degree from='Harvard'>Ph.D.</degree>
+ <award>Pulizer</award>
+ <publication>Still in Trenton</publication>
+ <publication>Trenton Forever</publication>
+ </author>
+ <price intl='canada' exchange='0.7'>6.50</price>
+ <excerpt>
+ <p>It was a dark and stormy night.</p>
+ <p>But then all nights in Trenton seem dark and
+ stormy to someone who has gone through what
+ <emph>I</emph> have.</p>
+ <definition-list>
+ <term>Trenton</term>
+ <definition>misery</definition>
+ </definition-list>
+ </excerpt>
+ </book>
+ <my:book style='leather' price='29.50' xmlns:my='http://www.placeholder-name-here.com/schema/'>
+ <my:title>Who's Who in Trenton</my:title>
+ <my:author>Robert Bob</my:author>
+ </my:book>
+ </bookstore>
+
+=head1 SEE ALSO
+
+The Japanese version of this document can be found on-line at
+L<http://member.nifty.ne.jp/hippo2000/perltips/xml/xql/tutorial.htm>
+
+L<XML::XQL>, L<XML::XQL::Date>, L<XML::XQL::Query> and L<XML::XQL::DOM>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/XML/perllocal.pod Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,22 @@
+=head2 Fri Apr 23 19:59:32 2004: C<Module> L<XML::XPath|XML::XPath>
+
+=over 4
+
+=item *
+
+C<installed into: F:\perforce\build\build_sys\personal\project\pr97\os\buildtools\bldsystemtools\buildsystemtools\lib\XML>
+
+=item *
+
+C<LINKTYPE: dynamic>
+
+=item *
+
+C<VERSION: 1.13>
+
+=item *
+
+C<EXE_FILES: examples/xpath>
+
+=back
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/freezethaw/FreezeThaw.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,857 @@
+=head1 NAME
+
+FreezeThaw - converting Perl structures to strings and back.
+
+=head1 SYNOPSIS
+
+ use FreezeThaw qw(freeze thaw cmpStr safeFreeze cmpStrHard);
+ $string = freeze $data1, $data2, $data3;
+ ...
+ ($olddata1, $olddata2, $olddata3) = thaw $string;
+ if (cmpStr($olddata2,$data2) == 0) {print "OK!"}
+
+=head1 DESCRIPTION
+
+Converts data to/from stringified form, appropriate for
+saving-to/reading-from permanent storage.
+
+Deals with objects, circular lists, repeated appearence of the same
+refence. Does not deal with overloaded I<stringify> operator yet.
+
+=head1 EXPORT
+
+=over 12
+
+=item Default
+
+None.
+
+=item Exportable
+
+C<freeze thaw cmpStr cmpStrHard safeFreeze>.
+
+=back
+
+=head1 User API
+
+=over 12
+
+=item C<cmpStr>
+
+analogue of C<cmp> for data. Takes two arguments and compares them as
+separate entities.
+
+=item C<cmpStrHard>
+
+analogue of C<cmp> for data. Takes two arguments and compares them
+considered as a group.
+
+=item C<freeze>
+
+returns a string that encupsulates its arguments (considered as a
+group). C<thaw>ing this string leads to a fatal error if arguments to
+C<freeze> contained references to C<GLOB>s and C<CODE>s.
+
+=item C<safeFreeze>
+
+returns a string that encupsulates its arguments (considered as a
+group). The result is C<thaw>able in the same process. C<thaw>ing the
+result in a different process should result in a fatal error if
+arguments to C<safeFreeze> contained references to C<GLOB>s and
+C<CODE>s.
+
+=item C<thaw>
+
+takes one string argument and returns an array. The elements of the
+array are "equivalent" to arguments of the C<freeze> command that
+created the string. Can result in a fatal error (see above).
+
+=back
+
+=head1 Developer API
+
+C<FreezeThaw> C<freeze>s and C<thaw>s data blessed in some package by
+calling methods C<Freeze> and C<Thaw> in the package. The fallback
+methods are provided by the C<FreezeThaw> itself. The fallback
+C<Freeze> freezes the "content" of blessed object (from Perl point of
+view). The fallback C<Thaw> blesses the C<thaw>ed data back into the package.
+
+So the package needs to define its own methods only if the fallback
+methods will fail (for example, for a lot of data the "content" of an
+object is an address of some B<C> data). The methods are called like
+
+ $newcooky = $obj->Freeze($cooky);
+ $obj = Package->Thaw($content,$cooky);
+
+To save and restore the data the following method are applicable:
+
+ $cooky->FreezeScalar($data,$ignorePackage,$noduplicate);
+
+during Freeze()ing, and
+
+ $data = $cooky->ThawScalar;
+
+Two optional arguments $ignorePackage and $noduplicate regulate
+whether the freezing should not call the methods even if $data is a
+reference to a blessed object, and whether the data should not be
+marked as seen already even if it was seen before. The default methods
+
+ sub UNIVERSAL::Freeze {
+ my ($obj, $cooky) = (shift, shift);
+ $cooky->FreezeScalar($obj,1,1);
+ }
+
+ sub UNIVERSAL::Thaw {
+ my ($package, $cooky) = (shift, shift);
+ my $obj = $cooky->ThawScalar;
+ bless $obj, $package;
+ }
+
+call the C<FreezeScalar> method of the $cooky since the freezing
+engine will see the data the second time during this call. Indeed, it
+is the freezing engine who calls UNIVERSAL::Freeze(), and it calls it
+because it needs to freeze $obj. The above call to
+$cooky->FreezeScalar() handles the same data back to engine, but
+because flags are different, the code does not cycle.
+
+Freezing and thawing $cooky also allows the following additional methods:
+
+ $cooky->isSafe;
+
+to find out whether the current freeze was initiated by C<freeze> or
+C<safeFreeze> command. Analogous method for thaw $cooky returns
+whether the current thaw operation is considered safe (i.e., either
+does not contain cached elsewhere data, or comes from the same
+application). You can use
+
+ $cooky->makeSafe;
+
+to prohibit cached data for the duration of the rest of freezing or
+thawing of current object.
+
+Two methods
+
+ $value = $cooky->repeatedOK;
+ $cooky->noRepeated; # Now repeated are prohibited
+
+allow to find out/change the current setting for allowing repeated
+references.
+
+If you want to flush the cache of saved objects you can use
+
+ FreezeThaw->flushCache;
+
+this can invalidate some frozen string, so that thawing them will
+result in fatal error.
+
+=head2 Instantiating
+
+Sometimes, when an object from a package is recreated in presense of
+repeated references, it is not safe to recreate the internal structure
+of an object in one step. In such a situation recreation of an object
+is carried out in two steps: in the first the object is C<allocate>d,
+in the second it is C<instantiate>d.
+
+The restriction is that during the I<allocation> step you cannot use any
+reference to any Perl object that can be referenced from any other
+place. This restriction is applied since that object may not exist yet.
+
+Correspondingly, during I<instantiation> step the previosly I<allocated>
+object should be C<filled>, i.e., it can be changed in any way such
+that the references to this object remain valid.
+
+The methods are called like this:
+
+ $pre_object_ref = Package->Allocate($pre_pre_object_ref);
+ # Returns reference
+ Package->Instantiate($pre_object_ref,$cooky);
+ # Converts into reference to blessed object
+
+The reverse operations are
+
+ $object_ref->FreezeEmpty($cooky);
+ $object_ref->FreezeInstance($cooky);
+
+during these calls object can C<freezeScalar> some information (in a
+usual way) that will be used during C<Allocate> and C<Instantiate>
+calls (via C<thawScalar>). Note that the return value of
+C<FreezeEmpty> is cached during the phase of creation of uninialized
+objects. This B<must> be used like this: the return value is the
+reference to the created object, so it is not destructed until other
+objects are created, thus the frozen values of the different objects
+will not share the same references. Example of bad result:
+
+ $o1->FreezeEmpty($cooky)
+
+freezes C<{}>, and C<$o2-E<gt>FreezeEmpty($cooky)> makes the same. Now
+nobody guaranties that that these two copies of C<{}> are different,
+unless a reference to the first one is preserved during the call to
+C<$o2-E<gt>FreezeEmpty($cooky)>. If C<$o1-E<gt>FreezeEmpty($cooky)>
+returns the value of C<{}> it uses, it will be preserved by the
+engine.
+
+The helper function C<FreezeThaw::copyContents> is provided for
+simplification of instantiation. The syntax is
+
+ FreezeThaw::copyContents $to, $from;
+
+The function copies contents the object $from point to into what the
+object $to points to (including package for blessed references). Both
+arguments should be references.
+
+The default methods are provided. They do the following:
+
+=over 12
+
+=item C<FreezeEmpty>
+
+Freezes an I<empty> object of underlying type.
+
+=item C<FreezeInstance>
+
+Calls C<Freeze>.
+
+=item C<Allocate>
+
+Thaws what was frozen by C<FreezeEmpty>.
+
+=item C<Instantiate>
+
+Thaws what was frozen by C<FreezeInstance>, uses C<copyContents> to
+transfer this to the $pre_object.
+
+=back
+
+=head1 BUGS and LIMITATIONS
+
+A lot of objects are blessed in some obscure packages by XSUB
+typemaps. It is not clear how to (automatically) prevent the
+C<UNIVERSAL> methods to be called for objects in these packages.
+
+The objects which can survive freeze()/thaw() cycle must also survive a
+change of a "member" to an equal member. Say, after
+
+ $a = [a => 3];
+ $a->{b} = \ $a->{a};
+
+$a satisfies
+
+ $a->{b} == \ $a->{a}
+
+This property will be broken by freeze()/thaw(), but it is also broken by
+
+ $a->{a} = delete $a->{a};
+
+=cut
+
+require 5.002; # defined ref stuff...
+
+# Different line noise chars:
+#
+# $567| next 567 chars form a scalar
+#
+# @34| next 34 scalars form an array
+#
+# %34| next 34 scalars form a hash
+#
+# ? next scalar is a safe-stamp at beginning
+#
+# ? next scalar is a stringified data
+#
+# ! repeated array follows (after a scalar denoting array $#),
+# (possibly?) followed by instantiation array. At beginning
+#
+# <45| ordinal of element in repeated array
+#
+# * stringified glob follows
+#
+# & stringified coderef follows
+#
+# \\ stringified defererenced data follows
+#
+# / stringified REx follows
+#
+# > stringified package name follows, then frozen data
+#
+# { stringified package name follows, then allocation data
+#
+# } stringified package name follows, then instantiation data
+#
+# _ frozen form of undef
+
+
+package FreezeThaw;
+
+use Exporter;
+
+@ISA = qw(Exporter);
+$VERSION = '0.43';
+@EXPORT_OK = qw(freeze thaw cmpStr cmpStrHard safeFreeze);
+
+use strict;
+use Carp;
+
+my $lock = (reverse time) ^ $$ ^ \&freezeString; # To distingush processes
+
+use vars qw( @multiple
+ %seen_packages
+ $seen_packages
+ %seen_packages
+ %count
+ %address
+ $string
+ $unsafe
+ $noCache
+ $cooky
+ $secondpass
+ ), # Localized in freeze()
+ qw( $norepeated ), # Localized in freezeScalar()
+ qw( $uninitOK ), # Localized in thawScalar()
+ qw( @uninit ), # Localized in thaw()
+ qw($safe); # Localized in safeFreeze()
+my (%saved);
+
+my %Empty = ( ARRAY => sub {[]}, HASH => sub {{}},
+ SCALAR => sub {my $undef; \$undef},
+ REF => sub {my $undef; \$undef},
+ CODE => 1, # 1 means atomic
+ GLOB => 1,
+ Regexp => 0,
+ );
+
+
+sub flushCache {$lock ^= rand; undef %saved;}
+
+sub getref ($) {
+ my $ref = ref $_[0];
+ return $ref if not $ref or defined $Empty{$ref}; # Optimization _and_ Regexp
+ my $str;
+ if (defined &overload::StrVal) {
+ $str = overload::StrVal($_[0]);
+ } else {
+ $str = "$_[0]";
+ }
+ $ref = $1 if $str =~ /=(\w+)/;
+ $ref;
+}
+
+sub freezeString {$string .= "\$" . length($_[0]) . '|' . $_[0]}
+
+sub freezeNumber {$string .= $_[0] . '|'}
+
+sub freezeREx {$string .= '/' . length($_[0]) . '|' . $_[0]}
+
+sub thawString { # Returns list: a string and offset of rest
+ substr($string, $_[0]) =~ /^\$(\d+)\|/
+ or confess "Wrong format of frozen string: " . substr($string, $_[0]);
+ length($string) - $_[0] > length($1) + 1 + $1
+ or confess "Frozen string too short: `" .
+ substr($string, $_[0]) . "', expect " . (length($1) + 2 + $1);
+ (substr($string, $_[0] + length($1) + 2, $1), $_[0] + length($1) + 2 + $1);
+}
+
+sub thawNumber { # Returns list: a number and offset of rest
+ substr($string, $_[0]) =~ /^(\d+)\|/
+ or confess "Wrong format of frozen string: " . substr($string, $_[0]);
+ ($1, $_[0] + length($1) + 1);
+}
+
+sub _2rex ($);
+if (eval '"Regexp" eq ref qr/1/') {
+ eval 'sub _2rex ($) {my $r = shift; qr/$r/} 1' or die;
+} else {
+ eval 'sub _2rex ($) { shift } 1' or die;
+}
+
+sub thawREx { # Returns list: a REx and offset of rest
+ substr($string, $_[0]) =~ m,^/(\d+)\|,
+ or confess "Wrong format of frozen REx: " . substr($string, $_[0]);
+ length($string) - $_[0] > length($1) + 1 + $1
+ or confess "Frozen string too short: `" .
+ substr($string, $_[0]) . "', expect " . (length($1) + 2 + $1);
+ (_2rex substr($string, $_[0] + length($1) + 2, $1),
+ $_[0] + length($1) + 2 + $1);
+}
+
+sub freezeArray {
+ $string .= '@' . @{$_[0]} . '|';
+ for (@{$_[0]}) {
+ freezeScalar($_);
+ }
+}
+
+sub thawArray {
+ substr($string, $_[0]) =~ /^[\@%](\d+)\|/ # % To make it possible thaw hashes
+ or confess "Wrong format of frozen array: \n$_[0]";
+ my $count = $1;
+ my $off = $_[0] + 2 + length $count;
+ my (@res, $res);
+ while ($count and length $string > $off) {
+ ($res,$off) = thawScalar($off);
+ push(@res,$res);
+ --$count;
+ }
+ confess "Wrong length of data in thawing Array: $count left" if $count;
+ (\@res, $off);
+}
+
+sub freezeHash {
+ my @arr = sort keys %{$_[0]};
+ $string .= '%' . (2*@arr) . '|';
+ for (@arr, @{$_[0]}{@arr}) {
+ freezeScalar($_);
+ }
+}
+
+sub thawHash {
+ my ($arr, $rest) = &thawArray;
+ my %hash;
+ my $l = @$arr/2;
+ foreach (0 .. $l - 1) {
+ $hash{$arr->[$_]} = $arr->[$l + $_];
+ }
+ (\%hash,$rest);
+}
+
+# Second optional argument: ignore the package
+# Third optional one: do not check for duplicates on outer level
+
+sub freezeScalar {
+ $string .= '_', return unless defined $_[0];
+ return &freezeString unless ref $_[0];
+ my $ref = ref $_[0];
+ my $str;
+ if ($_[1] and $ref) { # Similar to getref()
+ if (defined &overload::StrVal) {
+ $str = overload::StrVal($_[0]);
+ } else {
+ $str = "$_[0]";
+ }
+ $ref = $1 if $str =~ /=(\w+)/;
+ } else {
+ $str = "$_[0]";
+ }
+ # Die if a) repeated prohibited, b) met, c) not explicitely requested to ingore.
+ confess "Repeated reference met when prohibited"
+ if $norepeated && !$_[2] && defined $count{$str};
+ if ($secondpass and !$_[2]) {
+ $string .= "<$address{$str}|", return
+ if defined $count{$str} and $count{$str} > 1;
+ } elsif (!$_[2]) {
+ # $count{$str} is defined if we have seen it on this pass.
+ $address{$str} = @multiple, push(@multiple, $_[0])
+ if defined $count{$str} and not exists $address{$str};
+ # This is for debugging and shortening thrown-away output (also
+ # internal data in arrays and hashes is not duplicated).
+ $string .= "<$address{$str}|", ++$count{$str}, return
+ if defined $count{$str};
+ ++$count{$str};
+ }
+ return &freezeArray if $ref eq 'ARRAY';
+ return &freezeHash if $ref eq 'HASH';
+ return &freezeREx if $ref eq 'Regexp' and not defined ${$_[0]};
+ $string .= "*", return &freezeString
+ if $ref eq 'GLOB' and !$safe;
+ $string .= "&", return &freezeString
+ if $ref eq 'CODE' and !$safe;
+ $string .= '\\', return &freezeScalar( $ {shift()} )
+ if $ref eq 'REF' or $ref eq 'SCALAR';
+ if ($noCache and (($ref eq 'CODE') or $ref eq 'GLOB')) {
+ confess "CODE and GLOB references prohibited now";
+ }
+ if ($safe and (($ref eq 'CODE') or $ref eq 'GLOB')) {
+ $unsafe = 1;
+ $saved{$str} = $_[0] unless defined $saved{$str};
+ $string .= "?";
+ return &freezeString;
+ }
+ $string .= '>';
+ local $norepeated = $norepeated;
+ local $noCache = $noCache;
+ freezePackage(ref $_[0]);
+ $_[0]->Freeze($cooky);
+}
+
+sub freezePackage {
+ my $packageid = $seen_packages{$_[0]};
+ if (defined $packageid) {
+ $string .= ')';
+ &freezeNumber( $packageid );
+ } else {
+ $string .= '>';
+ &freezeNumber( $seen_packages );
+ &freezeScalar( $_[0] );
+ $seen_packages{ $_[0] } = $seen_packages++;
+ }
+}
+
+sub thawPackage { # First argument: offset
+ my $key = substr($string,$_[0],1);
+ my ($get, $rest, $id);
+ ($id, $rest) = &thawNumber($_[0] + 1);
+ if ($key eq ')') {
+ $get = $seen_packages{$id};
+ } else {
+ ($get, $rest) = &thawString($rest);
+ $seen_packages{$id} = $get;
+ }
+ ($get, $rest);
+}
+
+# First argument: offset; Optional other: index in the @uninit array
+
+sub thawScalar {
+ my $key = substr($string,$_[0],1);
+ if ($key eq "\$") {&thawString}
+ elsif ($key eq '@') {&thawArray}
+ elsif ($key eq '%') {&thawHash}
+ elsif ($key eq '/') {&thawREx}
+ elsif ($key eq '\\') {
+ my ($out,$rest) = &thawScalar( $_[0]+1 ) ;
+ (\$out,$rest);
+ }
+ elsif ($key eq '_') { (undef, $_[0]+1) }
+ elsif ($key eq '&') {confess "Do not know how to thaw CODE"}
+ elsif ($key eq '*') {confess "Do not know how to thaw GLOB"}
+ elsif ($key eq '?') {
+ my ($address,$rest) = &thawScalar( $_[0]+1 ) ;
+ confess "The saved data accessed in unprotected thaw" unless $unsafe;
+ confess "The saved data disappeared somewhere"
+ unless defined $saved{$address};
+ ($saved{$address},$rest);
+ } elsif ($key eq '<') {
+ confess "Repeated data prohibited at this moment" unless $uninitOK;
+ my ($off,$end) = &thawNumber ($_[0]+1);
+ ($uninit[$off],$end);
+ } elsif ($key eq '>' or $key eq '{' or $key eq '}') {
+ my ($package,$rest) = &thawPackage( $_[0]+1 );
+ my $cooky = bless \$rest, 'FreezeThaw::TCooky';
+ local $uninitOK = $uninitOK;
+ local $unsafe = $unsafe;
+ if ($key eq '{') {
+ my $res = $package->Allocate($cooky);
+ ($res, $rest);
+ } elsif ($key eq '}') {
+ warn "Here it is undef!" unless defined $_[1];
+ $package->Instantiate($uninit[$_[1]],$cooky);
+ (undef, $rest);
+ } else {
+ ($package->Thaw($cooky),$rest);
+ }
+ } else {
+ confess "Do not know how to thaw data with code `$key'";
+ }
+}
+
+sub freezeEmpty { # Takes a type, freezes ref to empty object
+ my $e = $Empty{ref $_[0]};
+ if (ref $e) {
+ my $cache = &$e;
+ freezeScalar $cache;
+ $cache;
+ } elsif ($e) {
+ my $cache = shift;
+ freezeScalar($cache,1,1); # Atomic
+ $cache;
+ } else {
+ $string .= "{";
+ freezePackage ref $_[0];
+ $_[0]->FreezeEmpty($cooky);
+ }
+}
+
+sub freeze {
+ local @multiple;
+ local %seen_packages;
+ local $seen_packages = 0;
+ local %seen_packages;
+# local @seentypes;
+ local %count;
+ local %address;
+ local $string = 'FrT;';
+ local $unsafe;
+ local $noCache;
+ local $cooky = bless \$cooky, 'FreezeThaw::FCooky'; # Just something fake
+ local $secondpass;
+ freezeScalar(\@_);
+ if (@multiple) {
+ # Now repeated structures are enumerated with order of *second* time
+ # they appear in the what we freeze.
+ # What we want is to have them enumerated with respect to the first time
+#### $string = ''; # Start again
+#### @multiple = ();
+#### %address = ();
+#### for (keys %count) {
+#### $count{$_} = undef if $count{$_} <= 1; # As at start
+#### $count{$_} = 0 if $count{$_}; # As at start
+#### }
+#### $seen_packages = 0;
+#### %seen_packages = ();
+#### freezeScalar(\@_);
+ # Now repeated structures are enumerated with order of first time
+ # they appear in the what we freeze
+#### my $oldstring = substr $string, 4;
+ $string = 'FrT;!'; # Start again
+ $seen_packages = 0;
+ %seen_packages = (); # XXXX We reshuffle parts of the
+ # string, so the order of packages may
+ # be wrong...
+ freezeNumber($#multiple);
+ {
+ my @cache; # Force different values for different
+ # empty objects.
+ foreach (@multiple) {
+ push @cache, freezeEmpty $_;
+ }
+ }
+# for (keys %count) {
+# $count{$_} = undef
+# if !(defined $count{$_}) or $count{$_} <= 1; # As at start
+# }
+ # $string .= '@' . @multiple . '|';
+ $secondpass = 1;
+ for (@multiple) {
+ freezeScalar($_,0,1,1), next if $Empty{ref $_};
+ $string .= "}";
+ freezePackage ref $_;
+ $_->FreezeInstance($cooky);
+ }
+#### $string .= $oldstring;
+ freezeScalar(\@_);
+ }
+ return "FrT;?\$" . length($lock) . "|" . $lock . substr $string, 4
+ if $unsafe;
+ $string;
+}
+
+sub safeFreeze {
+ local $safe = 1;
+ &freeze;
+}
+
+sub copyContents { # Given two references, copies contents of the
+ # second one to the first one, provided they have
+ # the same basic type. The package is copied too.
+ my($first,$second) = @_;
+ my $ref = getref $second;
+ if ($ref eq 'SCALAR' or $ref eq 'REF') {
+ $$first = $$second;
+ } elsif ($ref eq 'ARRAY') {
+ @$first = @$second;
+ } elsif ($ref eq 'HASH') {
+ %$first = %$second;
+ } else {
+ croak "Don't know how to copyContents of type `$ref'";
+ }
+ if (ref $second ne ref $first) { # Rebless
+ # SvAMAGIC() is a property of a reference, not of a referent!
+ # Thus we cannot use $first here if $second was overloaded...
+ bless $_[0], ref $second;
+ }
+ $first;
+}
+
+sub thaw {
+ confess "thaw requires one argument" unless @_ ==1;
+ local $string = shift;
+ local %seen_packages;
+ my $initoff = 0;
+ #print STDERR "Thawing `$string'", substr ($string, 0, 4), "\n";
+ if (substr($string, 0, 4) ne 'FrT;') {
+ warn "Signature not present, continuing anyway" if $^W;
+ } else {
+ $initoff = 4;
+ }
+ local $unsafe = $initoff + (substr($string, $initoff, 1) eq "?" ? 1 : 0);
+ if ($unsafe != $initoff) {
+ my $key;
+ ($key,$unsafe) = thawScalar($unsafe);
+ confess "The lock in frozen data does not match the key"
+ unless $key eq $lock;
+ }
+ local @multiple;
+ local $uninitOK = 1; # The methods can change it.
+ my $repeated = substr($string,$unsafe,1) eq '!' ? 1 : 0;
+ my ($res, $off);
+ if ($repeated) {
+ ($res, $off) = thawNumber($repeated + $unsafe);
+ } else {
+ ($res, $off) = thawScalar($repeated + $unsafe);
+ }
+ my $cooky = bless \$off, 'FreezeThaw::TCooky';
+ if ($repeated) {
+ local @uninit;
+ my $lst = $res;
+ foreach (0..$lst) {
+ ($res, $off) = thawScalar($off, $_);
+ push(@uninit, $res);
+ }
+ my @init;
+ foreach (0..$lst) {
+ ($res, $off) = thawScalar($off, $_);
+ push(@init, $res);
+ }
+ #($init, $off) = thawScalar($off);
+ #print "Instantiating...\n";
+ #my $ref;
+ for (0..$#uninit) {
+ copyContents $uninit[$_], $init[$_] if ref $init[$_];
+ }
+ ($res, $off) = thawScalar($off);
+ }
+ croak "Extra elements in frozen structure: `" . substr($string,$off) . "'"
+ if $off != length $string;
+ return @$res;
+}
+
+sub cmpStr {
+ confess "Compare requires two arguments" unless @_ == 2;
+ freeze(shift) cmp freeze(shift);
+}
+
+sub cmpStrHard {
+ confess "Compare requires two arguments" unless @_ == 2;
+ local @multiple;
+# local @seentypes;
+ local %count;
+ local %address;
+ local $string = 'FrT;';
+ local $unsafe;
+ local $noCache;
+ local $cooky = bless \$cooky, 'FreezeThaw::FCooky'; # Just something fake
+ freezeScalar($_[0]);
+ my %cnt1 = %count;
+ freezeScalar($_[1]);
+ my %cnt2 = %count;
+ %count = ();
+ # Now all the caches are filled, delete the entries for guys which
+ # are in one argument only.
+ my ($elt, $val);
+ while (($elt, $val) = each %cnt1) {
+ $count{$elt}++ if $cnt2{$elt} > $cnt1{$elt};
+ }
+ $string = '';
+ freezeScalar($_[0]);
+ my $str1 = $string;
+ $string = '';
+ freezeScalar($_[1]);
+ $str1 cmp $string;
+}
+
+# local $string = freeze(shift,shift);
+# local $uninitOK = 1;
+# #print "$string\n";
+# my $off = 7; # Hardwired offset after @2|
+# if (substr($string,4,1) eq '!') {
+# $off = 5; # Hardwired offset after !
+# my ($uninit, $len);
+# ($len,$off) = thawScalar $off;
+# local @uninit;
+# foreach (0..$len) {
+# ($uninit,$off) = thawScalar $off, $_;
+# }
+# $off += 3; # Hardwired offset after @2|
+# }
+# croak "Unknown format of frozen array: " . substr($string,$off-3)
+# unless substr($string,$off-3,1) eq '@';
+# my ($first,$off2) = thawScalar $off;
+# my $off3;
+# ($first,$off3) = thawScalar $off2;
+# substr($string, $off, $off2-$off) cmp substr($string,$off2,$off3-$off2);
+# }
+
+sub FreezeThaw::FCooky::FreezeScalar {
+ shift;
+ &freezeScalar;
+}
+
+sub FreezeThaw::FCooky::isSafe {
+ $safe || $noCache;
+}
+
+sub FreezeThaw::FCooky::makeSafe {
+ $noCache = 1;
+}
+
+sub FreezeThaw::FCooky::repeatedOK {
+ !$norepeated;
+}
+
+sub FreezeThaw::FCooky::noRepeated {
+ $norepeated = 1;
+}
+
+sub FreezeThaw::TCooky::repeatedOK {
+ $uninitOK;
+}
+
+sub FreezeThaw::TCooky::noRepeated {
+ undef $uninitOK;
+}
+
+sub FreezeThaw::TCooky::isSafe {
+ !$unsafe;
+}
+
+sub FreezeThaw::TCooky::makeSafe {
+ undef $unsafe;
+}
+
+sub FreezeThaw::TCooky::ThawScalar {
+ my $self = shift;
+ my ($res,$off) = &thawScalar($$self);
+ $$self = $off;
+ $res;
+}
+
+sub UNIVERSAL::Freeze {
+ my ($obj, $cooky) = (shift, shift);
+ $cooky->FreezeScalar($obj,1,1);
+}
+
+sub UNIVERSAL::Thaw {
+ my ($package, $cooky) = (shift, shift);
+ my $obj = $cooky->ThawScalar;
+ bless $obj, $package;
+}
+
+sub UNIVERSAL::FreezeInstance {
+ my($obj,$cooky) = @_;
+ return if (ref $obj and ref $obj eq 'Regexp' and not defined $$obj); # Regexp
+ $obj->Freeze($cooky);
+}
+
+sub UNIVERSAL::Instantiate {
+ my($package,$pre,$cooky) = @_;
+ return if $package eq 'Regexp';
+ my $obj = $package->Thaw($cooky);
+ # SvAMAGIC() is a property of a reference, not of a referent!
+ # Thus we cannot use $pre here if $obj was overloaded...
+ copyContents $_[1], $obj;
+}
+
+sub UNIVERSAL::Allocate {
+ my($package,$cooky) = @_;
+ $cooky->ThawScalar;
+}
+
+sub UNIVERSAL::FreezeEmpty {
+ my $obj = shift;
+ my $type = getref $obj;
+ my $e = $Empty{$type};
+ if (ref $e) {
+ my $ref = &$e;
+ freezeScalar $ref;
+ $ref; # Put into cache.
+ } elsif ($e) {
+ freezeScalar($obj,1,1); # Atomic
+ undef;
+ } elsif (defined $e and not defined $$obj) { # Regexp
+ freezeREx($obj);
+ undef;
+ } else {
+ die "Do not know how to FreezeEmpty $type";
+ }
+}
+
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/lib/gpl.licence.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Binary file deprecated/buildtools/buildsystemtools/lib/src/DateManip-5.42a.tar.gz has changed
Binary file deprecated/buildtools/buildsystemtools/lib/src/FreezeThaw-0.43.tar.gz has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/removebuild.bat Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,17 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+perl -S removebuild.pl %1
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/removebuild.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,175 @@
+#!/usr/bin/perl
+
+# Copyright (c) 2002-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:
+# removebuild.pl - prepares a drive for a clean licensee build by removing
+# all buildable files from the drive.
+#
+#
+
+my ($file) = readOpts(@ARGV);
+
+exit remove($file);
+
+sub readOpts(@)
+ {
+ my (@args) = @_;
+
+ my $path = undef;
+
+ foreach my $arg (@args)
+ {
+ if ($arg =~ /^-/)
+ {
+ if ((lc($arg) eq "--help")
+ ||(lc($arg) eq "-h")
+ )
+ {
+ showHelp();
+ exit 0;
+ }
+ else
+ {
+ print STDERR "Option '$arg' not recognised.\n\n";
+ print STDERR "Try 'removebuild --help' for help.\n";
+ exit 1;
+ }
+ }
+ else
+ {
+ if (defined($path))
+ {
+ print STDERR "Removebuild accepts only one argument.\n\n";
+ print STDERR "Try 'removebuild --help' for help.\n";
+ exit 1;
+ }
+ else
+ {
+ $path = $arg;
+ }
+ }
+ }
+
+ if (!defined($path))
+ {
+ print STDERR "Removebuild must be given a list of files to remove.\n\n";
+ print STDERR "Try 'removebuild --help' for help.\n";
+ exit 1;
+ }
+
+ return ($path);
+ }
+
+sub remove($)
+ {
+ my ($file) = @_;
+
+ open(FILE, $file);
+
+ my $dir = undef;
+ my $failed = 0;
+ my $worked = 0;
+ my $hasentries = 0;
+
+ foreach my $line (<FILE>)
+ {
+ chomp($line);
+ $hasentries = 1;
+
+ if ($line =~ /^\*/)
+ {
+ if ($line =~ /^\*DIR:/)
+ {
+ $dir = $line;
+ $dir =~ s/^\*DIR:\s*//;
+
+ $dir =~ s/[\/\\]*$//; # Remove trailing \/
+ }
+ else
+ {
+ close(FILE);
+ die "'$file' is not a valid input.\n('$line' not recognised)\n";
+ }
+ }
+ else
+ {
+ if (defined($dir))
+ {
+ $line =~ s/^[\/\\]*//; # Remove preceding \/
+
+ # Attempt to delete '$dir\$line'
+
+ $line = $dir."\\".$line;
+
+ if (-e $line)
+ {
+ if (-d $line)
+ {
+ $failed = 1;
+ print STDERR "ERROR: Could not remove file '$line' because $line is a directory\n";
+ }
+ else
+ {
+ if (!unlink($line))
+ {
+ $failed = 1;
+ print STDERR "ERROR: Could not remove file '$line'. Make sure it is not write protected.\n";
+ }
+ else
+ {
+ $worked = 1;
+
+ # Remove parent dirs if now empty
+ my $empty = 1;
+ while (($line =~ /[\/\\]/) && $empty)
+ {
+ $line =~ s/[\/\\][^\/\\]*$//; # Go to parent dir
+ if (!rmdir($line))
+ {
+ # If it fails, the dir can't be empty
+ $empty = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ close(FILE);
+ die "'$file' is not a valid input.\n(DIR must be set before '$line')\n";
+ }
+ }
+ }
+
+ close(FILE);
+
+ if ($hasentries && (!$worked))
+ {
+ print STDERR "WARNING: No files listed in '$file' were found. Is the current directory correct?\n";
+ }
+
+ return $failed;
+ }
+
+sub showHelp()
+ {
+ print "removebuild [options] Filename\n";
+ print " - prepares a drive for a 'build from clean' by removing\n";
+ print " all buildable files.\n\n";
+ print " Filename - The file listing the buildable files to be removed\n\n";
+ print "Options:\n";
+ print " --help or -h - Display this message\n\n";
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/scanlog/Scanlog.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,966 @@
+# Copyright (c) 2003-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:
+# summarise an automated build log
+# documentation available in generic\tools\e32toolp\docs\scanlog.txt
+# please update the documentation when modifying this file
+#
+#
+
+package Scanlog;
+
+use strict;
+use Carp;
+
+# CheckForErrors
+#
+# Inputs
+# $line - Line of text to check
+#
+# Outputs
+# Return true for presence of error in the line
+# Return false for no error found
+#
+# Description
+# This function matches the input against a known set of Error Strings
+sub CheckForErrors
+{
+ my ($line) = @_;
+
+ # FLEXlm license server errors
+ if ($line =~ /FLEXlm error:/)
+ {
+ return 1;
+ }
+
+ # BLDMAKE ERROR: Can't find "\INTERNET\GROUP\BLD.INF"
+ # ABLD ERROR: Project Bldmake directory "\EPOC32\BUILD\APP-FRAMEWORK\UIKLAF\GROUP\" does not exist
+
+ if ($line =~ /(ABLD|BLDMAKE) ERROR:/)
+ {
+ return 1;
+ }
+
+ # "\WAPENG\GROUP\BLD.INF" FATAL ERROR(S):
+
+ if ($line =~ /FATAL ERROR\(S\):/)
+ {
+ return 1;
+ }
+
+
+ # NMAKE : fatal error U1077: 'C:\apps\DevStudio\VC\BIN\NMAKE.EXE' : return code '0x2'
+
+ if ($line =~ /fatal error U1077/)
+ {
+ return 1;
+ }
+
+ # match all falal error
+ if ($line =~ /^fatal error/i)
+ {
+ return 1;
+ }
+
+ # NMAKE : warning U4010: 'FINALCOPYFXCM' : build failed; /K specified, continuing ...
+
+ if ($line =~ /warning U4010/)
+ {
+ return 1;
+ }
+
+ # make: *** [SAVESPACECONVTOOL] Error 2
+
+ if ($line =~ /make(\.exe)?(\[\d+\])?: \*\*\* /)
+ {
+ return 1;
+ }
+
+ # make: Target `SAVESPACE' not remade because of errors.
+
+ if ($line =~ /make(\.exe)?(\[\d+\])?: .* not remade /)
+ {
+ return 1;
+ }
+
+ # "..\UCRT\Ecrt0.cpp", line 24: Error: #390: function "main" may not be called or have its address taken
+ # "EUSER\\epoc\\arm\\Uc_i64.cia", line 16: Error: A1356W: Instruction not supported on targeted CPU
+
+ if ($line =~ /"(.*)", line (\d+): (Error: +(.\d+.*?):.*)$/)
+ {
+ return 1;
+ }
+
+ # Fatal error: Internal fault: 0x5c6e (200322) in _ZN17CContactLocalView20HandleDatabaseEventLE23TContactDbObserverEvent
+
+ if ($line =~ /error: ((Internal fault):.*)$/)
+ {
+ return 1;
+ }
+
+ # Exception: STATUS_ACCESS_VIOLATION
+ # networkPrim.c
+ # 0 [main] make 2020 handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
+ # 265 [main] make 2020 open_stackdumpfile: Dumping stack trace to make.exe.stackdump
+ if ($line =~ /Exception: STATUS_ACCESS_VIOLATION/)
+ {
+ return 1;
+ }
+
+ # MSGBROWSER.WINSCW:3233: target `\EPOC32\RELEASE\WINSCW\UDEB\Z\System\Data' given more than once in the same rule.
+ if ($line =~ /target .* given more than once in the same rule/)
+ {
+ return 1;
+ }
+
+ # ERROR: <anything>
+ if ($line =~ /^ERROR: /m)
+ {
+ return 1;
+ }
+
+ # ERROR (for CDB errors)
+ if ($line =~ /^ERROR\t/)
+ {
+ return 1;
+ }
+
+ # elf2e32 : Error: E1035: Undefined Symbol blah blah blah
+ # elf2e32 : Error: E1036: Symbol blah blah blah
+ if ($line =~ /^\s*elf2e32\s*:\s*Error\s*:\s*/i)
+ {
+ return 1;
+ }
+
+ # Not already returned so return false
+ return 0;
+}
+
+# CheckForRemarks
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Warning in the line according to the warning codes
+# defined in the checkList array
+# The list is the current known EABI warnings which are considered to be
+# Remarks
+# Return false for no Warning found
+#
+# Description
+# This function matches the input against a known set of Warning Strings defined
+# in the array CheckList
+my %RVCT_checklist=(
+
+
+# Warnings to be fixed if deemed safe
+
+ "#111-D" => "statement is unreachable",
+ "#186-D" => "pointless comparison of unsigned integer with zero",
+ "#236-D" => "controlling expression is constant",
+ "#494-D" => "declaring a void parameter list with a typedef is nonstandard",
+ "C2874W" => "xxx may be used before set",
+ "C3017W" => "xxx may be used before set",
+
+# Warnings not required to be fixed, too risky
+
+ "#1293-D" => "assignment in condition",
+
+# Warnings not required to be fixed, too big a workload
+
+ "#177-D" => "variable abc was declared but never referenced",
+ "#550-D" => "variable xxx was set but never used",
+ "#830-D" => "function \"XXX::operator new(xyz)\" has no corresponding operator delete (to be called if an exception is thrown during initialization of an allocated object)",
+ "L6331W" => "No eligible global symbol matches pattern _ll_cmpeq.",
+ );
+
+sub CheckForRemarks
+{
+ my ($line) = @_;
+
+ # "..\UCRT\Ecrt0.cpp", line 12: Warning: #335-D: linkage specification is not allowed
+ # "s16c.o(.directive)", line 70: Warning: L6331W: s16c.o(.directive)(line 70, col 14) No eligible global symbol matches pattern _fsqrt.
+ if ($line =~ /".*", line \d+: Warning: +(.\d+.*?):/)
+ {
+ # Some compiler warnings about about style rather than substance. The RVCT
+ # compiler warnings are easily identified, and the RVCT_checklist above
+ # classifies the warnings present in the Symbian OS source code which are
+ # not currently considered to be violations of the "zero warnings" policy.
+ # It is the responsibility of the Master Codeline Forum to manage this list,
+ # as part of the "zero warnings" policy.
+ return defined($RVCT_checklist{$1});
+ }
+
+ # Command line warning D4025 : overriding '/O1' with '/Od'
+ if ($line =~ /Command line warning D4025 : /)
+ {
+ # This could be fixed by more subtle code in cl_win.pm
+ # which avoids putting both /O1 and /Od on the command line
+ return 1;
+ }
+
+ # REMARK:
+ if( $line =~ /^REMARK: /m)
+ {
+ return 1;
+ }
+
+ # Windows Event log warning from GNU Make - Treat as remark for the time being.
+ if ($line =~ /^EventType:\s+Error\s+Source:\s+GNU\s+Make/)
+ {
+ return 1;
+ }
+
+ # This is used convert what would be picked up as warning in to a remark, as remarks are check for first
+ # It also returns an additional value of the number of lines to slurp up to get the so the multi line
+ # warning (remark) is only seen once.
+
+ # ..\SETEL\ET_PHONE.CPP:19: warning: cannot find matching deallocation function
+ # ..\SETEL\ET_PHONE.CPP:19: warning: for 'CReqEntry'
+ if ($line =~ /:\d+: warning: cannot find matching deallocation function/)
+ {
+ return 1,1;
+ }
+
+ # fix to get scanlog catch the output of #pragma message (...) as a remark
+ #Codewarrior 3.0 doesn't output line number for #pragma message, whereas 3.1.1 outputs line number.
+ #The regexp below matches both the cases
+ if( $line =~ /((:\d+)*: note: )/)
+ {
+ return 1;
+ }
+
+ # getrel failed.
+ # Error: testtools_stat_desktop DP00391_DeveloperProduct not found
+ if( $line =~ /^Error:.+not found/)
+ {
+ return 1;
+ }
+ # Not already returned so return false
+ return 0;
+
+}
+
+# CheckForWarnings
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Warning in the line
+# Return false for no Warning found
+#
+# Description
+# This function matches the input against a known set of Warning Strings
+sub CheckForWarnings
+{
+ my ($line) = @_;
+
+ # linkfouraif.rss(25) : Warning: (047) the STRUCT that this resource is based on contains a
+
+ if ($line =~ /\\\\(.*?)\(\d+\)\s:\sWarning:\s\(\d+\)/)
+
+ {
+
+ return 1;
+ }
+
+
+ # RCOMP Warning: Unmatched enum name used as simple initialiser
+
+ if ($line =~ /Warning: Unmatched/i)
+ {
+ return 1;
+ }
+
+
+ # BLDMAKE WARNING: read-only ABLD.BAT will be overwritten
+
+ if ($line =~ /^BLDMAKE WARNING:/)
+ {
+ return 1;
+ }
+
+
+ # \FORM\GROUP\BLD.INF WARNING(S):
+ # \FORM\GROUP\BLD.INF(28) : Exported source file \form\group\tagma.rtf not found
+
+ if ($line =~ /WARNING\(S\)/)
+ {
+ return 1;
+ }
+
+ # WARNING: Can't find following headers in User or System Include Paths
+ # WARNING: Frozen .DEF file \CSTUBSHELL\BMARM\STUBRUNU.DEF not found - project not frozen
+ # WARNING: Not attempting to create any import libraries.
+ # WARNING: rls_string STRING_r_ssl_error_ssl_AlertNoRenegotiation; either has incorrect syntax or no value
+
+ if ($line =~ /^WARNING: /m)
+ {
+ return 1;
+ }
+
+ # \BIOMSG\BITSINC\BioTestUtils.inl(4) : warning C4100: 'iOperation' : unreferenced formal parameter
+
+ if ($line =~ /\(\d+\) : warning C/)
+ {
+ return 1;
+ }
+
+ # LINK : warning LNK4005: no objects used from library \EPOC32\RELEASE\WINS\UDEB\ESTOR.LIB
+
+ if ($line =~ /LINK : warning/)
+ {
+ return 1;
+ }
+
+ # ..\\..\\BAFL\\SRC\\Bacline.cpp:68: warning: value computed is not used
+
+ if ($line =~ /:\d+: warning:/)
+ {
+ return 1;
+ }
+
+ # "..\UCRT\Ecrt0.cpp", line 12: Warning: #335-D: linkage specification is not allowed
+ # "s16c.o(.directive)", line 70: Warning: L6331W: s16c.o(.directive)(line 70, col 14) No eligible global symbol matches pattern _fsqrt.
+
+ if ($line =~ /"(.*)", line (\d+): (Warning: +(.\d+.*?):.*)$/)
+ {
+ return 1;
+ }
+
+ # /../../kvm/VmEPOC/src/emuNetDebuggerTransport.c
+ # ### mwccsym2 Usage Warning:
+ # # Specified directory 'Z:/epoc32/include/libcnot' not found
+ # ... t_winscw_udeb_cw_obj_g/serialDebuggerTransport.o
+ # Linking lib ... winscw_udeb_cw_bin/tkmidp20_kvm.lib
+
+ if ($line =~ /Usage Warning:/)
+ {
+ return 1;
+ }
+ # mwld.exe: No symbols were exported
+
+ if ($line =~ /mwld.exe:/)
+ {
+ return 1;
+ }
+
+ # === target == tools\e32tools
+ # make -r -k -f "\EPOC32\BUILD\TOOLS\E32TOOLS\GROUP\TOOLS.make" SAVESPACE CFG=REL VERBOSE=-s KEEPGOING=-k
+ # nmake -nologo -x - -s -k -f "\EPOC32\BUILD\TOOLS\E32TOOLS\GROUP\ERUNTEST\TOOLS\ERUNTEST.TOOLS" REL CLEANBUILDREL
+ # Command line warning D4002 : ignoring unknown option '/Op'
+
+ if ($line =~ /^Command line warning/m)
+ {
+ return 1;
+ }
+
+ # MAKEDEF WARNING: 1 export(s) not yet Frozen:
+
+ if ($line =~ /^MAKEDEF WARNING:/m)
+ {
+ return 1;
+ }
+
+ # Comment from PETRAN which is actually a warning rather than an error
+ # ERROR: bad relocation: [00004f60] = 00000f68
+
+ if ($line =~ /ERROR: bad relocation:/)
+ {
+ return 1;
+ }
+
+ # 1 warning
+
+ if ($line =~ /^(\d+) warning/m)
+ {
+ return 1;
+ }
+
+ # Windows Event log warning from Sophos Antivirus Scan
+ if ($line =~ /^EventType:\s+Error\s+Source:\s+SweepNT/)
+ {
+ return 1;
+ }
+
+ # WARN (for CDB warnings)
+
+ if ($line =~ /^WARN\t/)
+ {
+ return 1;
+ }
+
+ #elf2e32 : Warning: W1041: Unsupported Target Type 'PLUGIN3'.
+ #Elf2e32: Warning: New Symbol _Z24ImplementationGroupProxyRi found, export(s) not yet Frozen
+ if ($line =~ /^\s*elf2e32\s*:\s*Warning\s*:\s*/i)
+ {
+ return 1;
+ }
+
+ #Can't locate FileRead.pm in @INC (@INC contains:.......
+ if ($line =~ /^Can't locate (.*) in \@INC/ )
+ {
+ return 1;
+ }
+
+ # Not already returned so return false
+ return 0;
+}
+
+# CheckForIgnore
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true if line can be ignored
+# Return false if line cannot be ignored
+#
+# Description
+# This function matches the input against a known set of Warning Strings which can be ignored
+sub CheckForIgnore
+{
+ my ($line) = @_;
+
+ # "..\\..\\..\\E32\\nkern\\arm\\Ncsched.cia", line 617: Warning: A1495E: Target of branch is a data address
+ if ($line =~ /"(.*)", line (\d+): Warning: A1495E: Target of branch is a data address/)
+ {
+ return 1;
+ }
+
+ # BLDMAKE WARNING: ARMV7 requires at least RVCT 3.1.674.
+ # It's not useful to heed this warning, as we're already on control of which platforms we're going to build
+ if ($line =~ /^BLDMAKE WARNING: ARMV\d requires at least RVCT /)
+ {
+ return 1;
+ }
+
+ # Not already returned so return false
+ return 0;
+}
+
+
+
+
+# CheckForNotBuilt
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Warning in the line
+# Return false for no Warning found
+# $iNotBuilt - Name of thing not built
+#
+# Description
+# This function matches the input against a known set of Strings for things not built
+sub CheckForNotBuilt
+{
+ my ($line) = @_;
+
+ # MISSING COMPONENT alp2csh: can't find tools\sdk_eng\alp2csh\group\bld.inf
+
+ if ($line =~ /^MISSING COMPONENT (.*):.* find (.*)$/m)
+ {
+ return (1,$2);
+ }
+
+ # MISSING: \EPOC32\RELEASE\WINS\UDEB\OPLR.DLL
+
+ if ($line =~ /^MISSING: (\S+)/m)
+ {
+ return (1,$1);
+ }
+
+ # Not already returned so return false
+ return 0;
+}
+
+# CheckForMissing
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Warning in the line
+# Return false for no Warning found
+# $iNotBuilt - Name of thing not built
+#
+# Description
+# This function matches the input against a known set of Strings for things not built
+sub CheckForMissing
+{
+ my ($line) = @_;
+
+ if ($line =~ /fatal error U1073: .* make '(.*)'/)
+ {
+ return (1,$1);
+ }
+
+ # Not already returned so return false
+ return 0;
+}
+
+# CheckForRealTimeErrors
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of a Real Time Error in the line
+# plus string detailing error (if available)
+# Return false for no Real Time Error found
+#
+# Description
+# This function matches the input against a known set of Error Strings
+# At the time of adding this subroutine, such error strings were only reported by P4GetSource.pm
+# Scripts calling this subroutine should note that, for example, lines beginning with "ERROR:" will
+# also be considered to be errors by subroutine CheckForErrors, above.
+sub CheckForRealTimeErrors
+{
+ my ($line) = @_;
+
+ if ($line =~ /^Error:\s*RealTimeBuild:\s*(.*)/mi)
+ {
+ return (1,$1); # Return True plus any other text on line
+ }
+
+ # Not already returned so return False
+ return 0;
+}
+
+
+
+# CheckForMigrationNotes
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Migration_Note in the line
+# Return false for no Migration_Note found
+#
+# Description
+# This function matches the input against a known set of Migration_Note Strings
+
+my %migration_list=(
+# Warnings to be fixed over longer period as they may indicate errors in code
+
+ "#61-D" => "integer operation result is out of range",
+ "#68-D" => "integer conversion resulted in a change of sign",
+ "#108-D" => "signed bit field of length 1",
+ "#128-D" => "loop is not reachable from preceding code",
+ "#191-D" => "type qualifier is meaningless on cast type",
+ "A1495E" => "Target of branch is a data address",
+ "A1608W" => "MOV pc,<rn> instruction used, but BX <rn> is preferred",
+ "A1745W" => "This register combination is DEPRECATED",
+ "A1764W" => "SWP instructions are deprecated in architecture ARMv6 and above",
+ "A1786W" => "This instruction using SP is deprecated in ARMv7",
+ "A1788W" => "Explicit use of PC in this instruction is deprecated",
+ "#1446-D" => "non-POD class type passed through ellipsis",
+ "#1559-D" => "dllexport/dllimport conflict with \"foo\"; dllexport assumed",
+ "#1566-D" => "dllexport/dllimport conflict with \"foo\"; dllimport/dllexport dropped"
+ );
+
+
+sub CheckForMigrationNotes
+{
+ my ($line) = @_;
+
+if ($line =~ /".*", line \d+: Warning: +(.\d+.*?):/)
+ {
+ # Some compiler warnings may indicate errors that should be fixed when a
+ # migration to a new compiler has occured. These may have been long standing
+ # issues in the OS and whilst not currently considered to be violations of the
+ #"zero warnings" policy should be fixed in any new development work.
+ # It is the responsibility of the Master Codeline Forum to manage this list.
+ return defined($migration_list{$1});
+ }
+
+
+if ($line =~ m/^MIGRATION_NOTE:\s*(.*)/i)
+ {
+ return (1,$1);
+ }
+
+if ($line =~ m/^WARNING: Working Directory: "(.*)\\sf\\app\\techview\\buildverification\\smoketest\\(.*)" Executing: "abld.bat (.*)":/i)
+ {
+ return 1;
+ }
+
+return 0;
+}
+
+
+# CheckForAdvisoryNotes
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true if the input matches against a known set of Advisory_Note strings defined in the advisory_list
+# Return false for no Advisory_Note found
+#
+# Description
+# This function matches the input against a known set of Advisory_Note Strings defined
+# in the array CheckList
+my %Advisory_checklist=(
+# Warnings categorized as advisory notes
+'M:/clean-src/os/unref/orphan/comtv\\toolkit ' => 0,
+'M:/clean-src/os/unref/orphan/comtv\\commsui ' => 0,
+'M:/clean-src/os/unref/orphan/comtv\\apps ' => 0,
+'M:/clean-src/os/unref/orphan/comtt/edg\\group ' => 0,
+'M:/clean-src/os/unref/orphan/comtt\\edg ' => 0,
+'M:/clean-src/os/unref/orphan/comgen/openenv/oetools/docs\\test ' => 0,
+'M:/clean-src/os/unref/orphan/comgen\\networking ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/tools\\baseline ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd\\tools ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/XSRproduct\\pkgdef ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/XSRproduct\\Messages ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/XSRproduct\\group ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/XSRproduct/com/symbian/sdk/productinstaller\\graphics ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/Wi-Fiproduct\\pkgdef ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/Wi-Fiproduct\\Messages ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/Wi-Fiproduct\\group ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/Wi-Fiproduct/com/symbian/sdk/productinstaller\\graphics ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/sdcard4cproduct\\pkgdef ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/sdcard4cproduct\\Messages ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/sdcard4cproduct\\group ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/sdcard4cproduct/com/symbian/sdk/productinstaller\\graphics ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/sdcard3cproduct\\pkgdef ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/sdcard3cproduct\\Messages ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/sdcard3cproduct\\group ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/sdcard3cproduct/com/symbian/sdk/productinstaller\\graphics ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/midp2.0product\\pkgdef ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/midp2.0product\\Messages ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/midp2.0product\\group ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/midp2.0product/com/symbian/sdk/productinstaller\\graphics ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/javaproduct\\pkgdef ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/javaproduct\\Messages ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/javaproduct\\group ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/javaproduct/com/symbian/sdk/productinstaller\\graphics ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/cldchiproduct\\pkgdef ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/cldchiproduct\\Messages ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/cldchiproduct\\group ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/cldchiproduct/com/symbian/sdk/productinstaller\\graphics ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/cldchi1.1product\\pkgdef ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/cldchi1.1product\\Messages ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/cldchi1.1product\\group ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/SuppKit/cldchi1.1product/com/symbian/sdk/productinstaller\\graphics ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/DevKit\\SourceDefinitions ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd/DevKit\\PackageDefinitions ' => 0,
+'M:/clean-src/os/unref/orphan/cedprd\\DevKit ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT09_Test\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT09_Test\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT09_Test\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT08_Prototype\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT08_Prototype\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT08_Prototype\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT07_Deprecated\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT07_Deprecated\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT07_Deprecated\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT06_Released\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT06_Released\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT06_Released\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT05_PubAll\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT05_PubAll\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT05_PubAll\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT04_PubPartner\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT04_PubPartner\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT04_PubPartner\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT03_IntComp\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT03_IntComp\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT03_IntComp\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT02_IntTech\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT02_IntTech\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT02_IntTech\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT01_NoAPIs\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT01_NoAPIs\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/UnitTests/PCT01_NoAPIs\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/IntegrationTests/PCT10_Integration\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/IntegrationTests/PCT10_Integration\\results ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/IntegrationTests/PCT10_Integration\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T25_All_Test\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T25_All_Test\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T24_All_Prototype\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T24_All_Prototype\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T23_All_Deprecated\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T23_All_Deprecated\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T22_All_Released\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T22_All_Released\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T21_PubAll_Test\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T21_PubAll_Test\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T20_PubAll_Proto\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T20_PubAll_Proto\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T19_PubAll_Dep\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T19_PubAll_Dep\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T18_PubAll_Rel\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T18_PubAll_Rel\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T17_PubAll_All\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T17_PubAll_All\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T16_PubPartner_Test\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T16_PubPartner_Test\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T15_PubPartner_Proto\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T15_PubPartner_Proto\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T14_PubPartner_Dep\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T14_PubPartner_Dep\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T13_PubPartner_Rel\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T13_PubPartner_Rel\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T12_PubPartner_All\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T12_PubPartner_All\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T11_IntComp_Test\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T11_IntComp_Test\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T10_IntComp_Proto\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T10_IntComp_Proto\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T09_IntComp_Dep\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T09_IntComp_Dep\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T08_IntComp_Rel\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T08_IntComp_Rel\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T07_IntComp_All\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T07_IntComp_All\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T06_IntTech_Test\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T06_IntTech_Test\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T05_IntTech_Proto\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T05_IntTech_Proto\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T04_IntTech_Dep\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T04_IntTech_Dep\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T03_IntTech_Rel\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T03_IntTech_Rel\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T02_IntTech_All\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T02_IntTech_All\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T01_Unclassified\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/TestData/Components/T01_Unclassified\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker\\TestData ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker/src\\ProgramCheckerBase ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker\\docs ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/programchecker\\bin ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT_TestLib\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT_TestLib\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC4.3\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC4.3\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC4.3\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC4.2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC4.2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC4.2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC4.1\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC4.1\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC4.1\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC3\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC3\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC3\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC2.2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC2.2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC2.2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT08.TC2.1\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT06.TC2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT06.TC2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC4\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC4\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC4\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC3\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC3\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC3\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC1\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC1\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT05.TC1\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC5.2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC5.2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC5.1\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC5.1\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC5\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC4.2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC4.2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC4.2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC4.1\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC3.2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC3.2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC3.2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC3.1\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT04.TC1\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT03.TC3\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT03.TC3\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT03.TC3\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT03.TC2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT03.TC2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT03.TC2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT03.TC1\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT02.TC3\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT02.TC3\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT02.TC3\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT02.TC2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT02.TC2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT02.TC2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT02.TC1.3\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT02.TC1.2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC5.3\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC5.3\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC5.3\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC5.2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC5.2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC5.2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC5.1\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC5.1\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC5.1\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC3.2\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC3.2\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC3.2\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC3.1\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC3.1\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC3.1\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC2.3\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC2.3\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/tests/TestData/RMT01.TC2.3\\data ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool\\tests ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/src\\XML ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool/src\\GCCBinUtils ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool\\src ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool\\sample ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool\\group ' => 0,
+'M:/clean-src/os/buildtools/srcanamdw_os/migrationtool\\docs ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os\\depcheck ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/tests/T_ImportsAnalyser\\TestData ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/tests\\T_ImportsAnalyser ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/tests/T_CapSearch\\TestData ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/tests\\T_CapSearch ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/tests/T_CapImportCheck\\TestData ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/tests\\T_CapImportCheck ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/tests/T_CapCheck\\TestData ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/tests\\T_CapCheck ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools\\src ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/sample\\ImportsAnalyser ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/sample\\CapSearch ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/sample\\CapImportCheck ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/sample/CapCheck\\Sample_XML_ECL ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/sample\\CapCheck ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools\\group ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools/docs\\Design ' => 0,
+'M:/clean-src/os/buildtools/binanamdw_os/captools\\data ' => 0,
+
+);
+
+sub CheckForAdvisoryNotes
+{
+ my ($line) = @_;
+
+ # "s16c.o(.directive)", line 70: Warning: L6331W: s16c.o(.directive)(line 70, col 14) No eligible global symbol matches pattern _fsqrt.
+ if ($line =~ /".*", line \d+: Warning: +(.\d+.*?):/)
+ {
+ # Some compiler warnings about about style rather than substance. The RVCT
+ # compiler warnings are easily identified, and the Advisory_checklist above
+ # classifies the warnings present in the Symbian OS source code which are
+ # not currently considered to be violations of the "zero warnings" policy.
+ # It is the responsibility of the Master Codeline Forum to manage this list,
+ # as part of the "zero warnings" policy.
+ return defined($Advisory_checklist{$1});
+ }
+
+ # ignore undesired codes in //EPOC/
+ if ($line =~ /ADVISORY NOTE: Missing distribution.policy.s60 file in (.*)/)
+ {
+ if (exists $Advisory_checklist{$1}){
+ return $Advisory_checklist{$1};
+ }
+ else{
+ return 1;
+ }
+ }
+
+ # Downgrade Kits errors and warnings
+ if (($line =~ /^WARNING: .+ matched against rule/i) ||
+ ($line =~ /^WARNING: .+ matched tests/i))
+ {
+ # Kits generation is not critical in MCL products and it
+ # should not be BRAG affecting.
+ return 1;
+ }
+
+ if ($line =~ /returning cat X/)
+ {
+ # Look for the phrase returning cat X. This is generated due to distribution policy file being remvoed
+
+ return 1;
+ }
+
+ if ($line =~ /ERROR.*Unable to perform a comparison using empty databases/i)
+ {
+ # Look for the phrase BC Comparision. Generates when base comparision is failed due to the unavailability of the base build.
+
+ return 1;
+ }
+
+ if ($line =~ /ERROR: Fatal exception \"execSpecialInstructions() failed with \d{1,} lines on stderr\"/i)
+ {
+ # Look for the Run variability warnings. Generates while processing the variabilities.
+
+ return 1;
+ }
+
+ if ($line =~ /WARN.*API Classifier load failed/i)
+ {
+ # Look for the classifier load warnings. Generates when unable to load the API's.
+
+ return 1;
+ }
+
+ if ($line =~ /WARNING: Envinfo overall status was not found/i)
+ {
+ # Look for the classifier load warnings. Generates when unable to load the API's.
+
+ return 1;
+ }
+
+ if ($line =~ /warning:\s*no newline at end of file/i && $line !~ /\.((rls)|(rsc)|(rss)|(rh)|(ra)|(hrh)|(rsg)|(loc)):\d{1,}:\d{1,}:\s*/i)
+ {
+ # no newline at end of file warnings are to be captured as it can create some issues with different compilers
+ # currently this will not work as remarks section is capturing this, which should not.
+ # Resource files should not be considered.
+
+ return 1;
+ }
+
+ if ($line =~ /^ADVISORY NOTE:/)
+ {
+ # For use by any advisory notes.
+
+ return 1;
+ }
+
+ if ($line =~ /^ERROR: Fatal exception \"ProcessVariability: Unable to copy .* \[Errno 13\] Permission denied: .*/)
+ {
+ # For buildrefdoc permission denied intermittent error
+
+ return 1;
+ }
+
+# This is used convert what would be picked up as warning in to a advisory note, as advisory notes are check for first
+ # It also returns an additional value of the number of lines to slurp up to get the so the multi line
+ # warning (advisorynote) is only seen once.
+
+
+
+# This is used convert what would be picked up as error in to a advisory note, as advisory notes are check for first
+ # It also returns an additional value of the number of lines to slurp up to get the so the multi line
+ # errors (advisorynote) is only seen once.
+
+}
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/scanlog/compare_summary.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,203 @@
+#
+# 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:
+#
+# usage:
+# perl compare_summary.pl new_build.summary last_build.summary > summary.summary
+#
+
+sub usage
+ {
+ print "syntax: perl compare_summary.pl new_build.summary last_build.summary\n";
+ exit 1;
+ }
+
+sub showtable
+ {
+ my $f=$_[0];
+ my $s=$_[1];
+ my %first=%$f;
+ my %second=%$s;
+
+ my %comps;
+ my $key,$n,$n2,$temp;
+
+ while ($key = each %first) {
+ $comps{$key}++;}
+ while ($key = each %second){
+ $comps{$key}++;}
+
+ foreach $key (sort keys %comps)
+ {
+ $n=$first{$key}; if ($n==0) {$n="0";}
+ $n2=$second{$key}; if ($n2==0) {$n2="0";}
+ $d=$n-$n2;
+ if ($d==0) {$d="";}
+ if ($d > 0) { $d="+$d";}
+
+ $temp=sprintf "(%s)",$n2;
+ printf "%-24.24s %-5.5s%-7.7s\t\t%s\n", $key, $n, $temp, $d;
+ }
+ }
+
+
+
+$summaryfile1=$ARGV[0];
+$summaryfile2=$ARGV[1];
+
+if (($summaryfile1 eq "") or ($summaryfile2 eq "")) { usage() };
+
+open(FILE1, "< $summaryfile1") || die ("can't open summary file: $!");
+open(FILE2, "< $summaryfile2") || die ("can't open summary file: $!");
+
+# find the start of the error summary in file 1
+while (<FILE1>)
+ {
+ if (/Total+\s+(\S+)+\s+(\d+)+\s+(\d+)/)
+ {
+ $build1time=$1;
+ $build1errors=$2;
+ $build1warnings=$3;
+ last;
+ }
+ }
+# find the start of the error summary in file 2
+while (<FILE2>)
+ {
+ if (/Total+\s+(\S+)+\s+(\d+)+\s+(\d+)/)
+ {
+ $build2time=$1;
+ $build2errors=$2;
+ $build2warnings=$3;
+ last;
+ }
+ }
+
+print "Total\t\t$build1time($build2time)\t$build1errors($build2errors)\t$build1warnings($build2warnings)\n\n";
+
+# compare builds
+$build1haserrors=0;
+$build2haserrors=0;
+
+# find the "Fatal errors" line
+$dummy=<FILE1>;$dummy=<FILE1>;
+if ($dummy =~ /Fatal Errors by Component/) { $build1haserrors=1;}
+$dummy=<FILE2>;$dummy=<FILE2>;
+if ($dummy =~ /Fatal Errors by Component/) { $build2haserrors=1;}
+
+if ($build1haserrors)
+ {
+ while (<FILE1>)
+ {
+ if (/^(\S+)+\s+(\d+)/)
+ {
+ $theerrors1{$1}="$2";
+ }
+ else
+ {
+ last;
+ }
+ }
+ }
+if ($build2haserrors)
+ {
+ while (<FILE2>)
+ {
+ if (/^(\S+)+\s+(\d+)/)
+ {
+ $theerrors2{$1}="$2";
+ }
+ else
+ {
+ last;
+ }
+ }
+ }
+
+if ($build1haserrors || $build2haserrors)
+ {
+ print "Fatal Errors by Component\n";
+ showtable(\%theerrors1, \%theerrors2);
+ print;
+ }
+
+
+# do the warnings now
+$build1haswarnings=0;
+$build2haswarnings=0;
+seek FILE1,0,0;
+seek FILE2,0,0;
+while (<FILE1>)
+ {
+ if (/Warnings by Component/)
+ {
+ $build1haswarnings=1;
+ last;
+ }
+ }
+
+while (<FILE2>)
+ {
+ if (/Warnings by Component/)
+ {
+ $build2haswarnings=1;
+ last;
+ }
+ }
+
+# compare builds
+if ($build1haswarnings || $build2haswarnings)
+ {
+
+
+if ($build1haswarnings)
+ {
+ while (<FILE1>)
+ {
+ if (/^(\S+)\s+(\d+)/)
+ {
+ $thewarnings1{$1}=$2;
+ }
+ else
+ {
+ last;
+ }
+ }
+ }
+if ($build2haswarnings)
+ {
+ while (<FILE2>)
+ {
+ if (/^(\S+)\s+(\d+)/)
+ {
+ $thewarnings2{$1}=$2;
+ }
+ else
+ {
+ last;
+ }
+ }
+ }
+
+ print "Warnings by Component\n";
+ print " this (last)\n";
+ showtable(\%thewarnings1, \%thewarnings2);
+ }
+
+
+
+
+close FILE1;
+close FILE2;
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/scanlog/complog.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,75 @@
+#
+# 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:
+#
+# summarise an automated build log
+
+if (@ARGV < 1)
+ {
+#........1.........2.........3.........4.........5.........6.........7.....
+ print <<USAGE_EOF;
+
+Usage:
+ complog component [logfile] -- extract component info from log
+
+USAGE_EOF
+ exit 1;
+ }
+
+my $component = shift @ARGV;
+my $echoing = 0;
+my $line;
+my $command;
+my $phase;
+
+while ($line=<>)
+ {
+
+ # ===-------------------------------------------------
+ # === baseline_bldfiles
+ # ===-------------------------------------------------
+ # === bldfiles started Sat Jul 24 01:38:03 1999.
+
+ if ($line =~ /^===------/)
+ {
+ $line = <>;
+ $line =~ /=== (.*)$/;
+ $command = $1;
+ <>;
+ $line = <>;
+ $line =~ /^=== (\S+) started ... ... .. (..):(..):(..)/;
+ $phase = $1;
+ next;
+ }
+
+ # === resource == gdtran 036
+
+ if ($line =~ / == ($component .*$)/)
+ {
+ $echoing = 1;
+ print "\n== $1 === $command\n";
+ next;
+ }
+ if ($line =~ /^===/)
+ {
+ $echoing = 0;
+ next;
+ }
+ if ($echoing)
+ {
+ print $line;
+ }
+
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/scanlog/htmlscanlog.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1481 @@
+# Copyright (c) 2003-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:
+#
+
+# summarise an automated build log
+use strict;
+use Getopt::Long;
+use HTML::Entities;
+use Carp;
+use FindBin; # for FindBin::Bin
+
+# Add the directory contain this perl script into the path to find modules
+use lib $FindBin::Bin;
+use Scanlog;
+
+# For Date calculations
+use lib "$FindBin::Bin/../lib"; # For running in source
+use lib "$FindBin::Bin/build/lib"; # For running in epoc32\tools
+use Date::Manip;
+
+# Set TimeZone because Date:Manip needs it set and then tell it to IGNORE the TimeZone
+&Date_Init("TZ=GMT","ConvTZ=IGNORE");
+
+# Variables
+my $line;
+my $iSlurp;
+my $PhaseStartTime;
+my %Phases;
+my %Components;
+my %Commands;
+my $component;
+my $command;
+my $phase;
+my $match_phase='';
+my %errors;
+my %warnings;
+my %remarks;
+my %migrationNotes;
+my %AdvisoryNotes;
+my %CmdErrors;
+my %CmdWarnings;
+my %CmdRemarks;
+my %CmdMigrationNotes;
+my %CmdAdvisoryNotes;
+my %missing;
+my %not_built;
+my $starttime;
+my $duration;
+my $warningcount;
+my $errorcount;
+my $remarkcount;
+my $migrationNoteCount;
+my $AdvisoryNoteCount;
+my ($iStatus, $iName);
+my %htmlColours=(
+"errors" =>"#ff0000",
+"warnings" =>"#fff000",
+"remarks" =>"#ffccff",
+"migrationNotes" =>"#ffcc99",
+"AdvisoryNotes" => "#ffa500"
+);
+# Hires Timer Variables
+my %HiResComponents;
+my %HiResCommands;
+my $HiResStartTime;
+my $HiResErrorFlag; #True if one of the Clients has not reported HiRes timing info
+
+my $Dsec;
+
+# History Variables
+my ($hostname) = "N/A";
+my ($EndTime);
+
+# Main section
+
+my ($iOutput, $iTitle, $iVerbose, $iDiff, $iWhat, $iHistory, $iClass, @iLogs) =&ProcessCommandLine();
+
+# Open Output file
+ open (HTML, ">$iOutput") or die "Couldn't open $iOutput for writing: $!\n";
+
+# Open Diff file if specified
+if ($iDiff ne '')
+{
+ open (DIFF, ">$iDiff") or die "Couldn't open $iDiff for writing: $!\n";
+}
+
+# Print HTML Header
+&PrintHTMLHeader($iTitle);
+
+
+# Parse each log File
+foreach my $iLog (@iLogs) # parses through all logs
+{
+ # Open the Log file for reading
+ unless (open (LOG, "< $iLog"))
+ { # On error, warn rather than die. Then record a "pseudo-error", which will appear in summary output file.
+ $line = "Couldn't open $iLog for reading: $!";
+ warn "$line\n";
+ $command = 'HTMLScanLog';
+ $component = 'Log Summaries';
+ $Commands{$command} = 0; # Need to define these! So assume zero seconds
+ $HiResCommands{$command} = 0; # duration for each of four variables.
+ $Components{$component} = 0; # The fact the relevant time(s) are defined
+ $HiResComponents{$component} = 0; # triggers inclusion in the applicable table.
+ do_error($iLog);
+ next;
+ }
+ # Chop $iLog just to the filename
+ $iLog =~ s/^.*\\//;
+
+ # Process the logs
+ &ProcessLog($iLog);
+ close LOG;
+}
+
+&PrintResults($iTitle);
+
+# Print HTML Footer
+&PrintHTMLFooter();
+
+# Handle the History file
+if (defined $iHistory)
+{
+ # Work out the class
+ my ($mclass) = "N/A";
+ open (MC, "< $iClass");
+ while (<MC>)
+ {
+ chomp;
+ my (@columns) = split(/,/);
+ $mclass = $columns[0] if ($columns[1] eq $hostname);
+ }
+ close (MC);
+
+ # Open and Lock the csv file
+ open(FH, "+< $iHistory") or die "can't open $iHistory: $!";
+ flock(FH, 2) or die "can't flock iHistory: $!";
+ # Read the file
+ # Reader the headers
+ my $cline = <FH>;
+ chomp($cline);
+ my (@headers) = split(/,/,$cline);
+ # Read the data
+ my (@csvdata);
+ @csvdata = <FH>;
+ # Return to the begining
+ seek(FH,0,0) or die "Seeking: $!";
+ # Print the old and new data
+ # Work if new headers are needed
+ # Use LowRes component names because they are always available
+ foreach my $component (sort {lc $a cmp lc $b} keys %Components)
+ {
+ my $compexist = 0;
+ # Itterate through the header array to see if it already exists
+ foreach my $header (@headers)
+ {
+ if ($component eq $header)
+ {
+ $compexist = 1;
+ }
+ }
+ # This component not found in the headers
+ # put the new header at the end of the header array
+ push @headers, $component if ($compexist == 0);
+ }
+ # Print the headers back out
+ print FH join(',',@headers)."\n";
+ # Print the original data
+ print FH @csvdata;
+ # Print the new data
+ foreach my $header (@headers)
+ {
+ if ($header eq 'Machine Class')
+ {
+ print FH "$mclass";
+ } elsif ($header eq 'Machine Name') {
+ print FH "$hostname";
+ } elsif ($header eq 'Title') {
+ print FH "$iTitle";
+ } elsif ($header eq 'End Time') {
+ print FH "$EndTime";
+ } elsif ($header eq 'Total Time') {
+ print FH &ConvertSeconds($duration);
+ } else {
+ # If there is a complete set of HiRes data then use that instead of the LowRes data
+ if ((defined %HiResComponents) && !$HiResErrorFlag)
+ {
+ if (exists $HiResComponents{$header})
+ {
+ print FH &ConvertSeconds($HiResComponents{$header});
+ } else {
+ print FH "";
+ }
+ } else {
+ if (exists $Components{$header})
+ {
+ print FH &ConvertSeconds($Components{$header});
+ } else {
+ print FH "";
+ }
+ }
+ }
+ # Print the , for next entry
+ print FH ",";
+ }
+ # End the entry
+ print FH "\n";
+
+ # truncate just in case the file is shorter
+ truncate(FH,tell(FH)) or die "Truncating: $!";
+ close(FH) or die "Closing: $!";
+}
+
+# DiffLog
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function Outputs lines to the diff log
+sub DiffLog()
+{
+ # Write the line to diff file if specified and not a line with Build Time dependent infomation
+ if ($iDiff ne '')
+ {
+ # Check the line for Build Time dependent infomation
+ unless (($line =~ /^=== .+ started/) || ($line =~ /^=== .+ finished/) || ($line =~ /^---/) || ($line =~ /^\+\+/))
+ {
+ print DIFF $line;
+ }
+ }
+}
+
+
+# ProcessLog
+#
+# Inputs
+# $iLog - Logfile name
+#
+# Outputs
+#
+# Description
+# This function processes the commandline
+sub ProcessLog()
+{
+ my ($iLog) = @_;
+ print "Processing: $iLog\n";
+
+ while ($line=<LOG>)
+ {
+ &DiffLog;
+
+ # Hostname is
+ # capture the hostname if available
+ if ($line =~ /^Hostname is (.*)$/)
+ {
+ $hostname = $1;
+ }
+
+ # ===-------------------------------------------------
+ # === Stage=1
+ # ===-------------------------------------------------
+ # === Stage=1 started Wed Apr 30 23:09:38 2003
+
+ if ($line =~ /^===------/)
+ {
+ $line=<LOG>;
+ &DiffLog;
+ $line=<LOG>;
+ &DiffLog;
+ $line = <LOG>;
+ &DiffLog;
+ $line =~ /^=== (.+) started (.*)/;
+ $phase = $1;
+ $PhaseStartTime =$2;
+ $match_phase=$phase;
+ $match_phase=~s-\\-\\\\-go;
+ next;
+ }
+
+ # === bldfiles finished Sat Jul 24 01:38:56 1999.
+ if ($line =~ /^=== $match_phase finished (.*)/)
+ {
+ my ($TempTime) = $1;
+ # Calculate the difference in Date/Time and Total up for Phase
+ $Phases{$phase} += &DiffDateTime($PhaseStartTime, $TempTime) ;
+ # The check to see if phase end is later than current EndTime
+ my $err;
+ # The first time a phase end is seen set $EndTime
+ if (!defined $EndTime)
+ {
+ $EndTime = $TempTime;
+ } else {
+ # Check the delta to previous EndTime value is positive
+ # Need due to multiple log file processing might not be in time order
+ my ($delta) = &DateCalc($EndTime,$TempTime,\$err);
+ die "Date Manip error" if ($err);
+ # If the delta starts with a + symbol $TempTime is later or the same as the last EndTime so set the new EndTime.
+ if ($delta =~ /^\+/)
+ {
+ $EndTime = $TempTime;
+ }
+ }
+ next;
+ }
+
+
+ # === resource == gdtran 036
+
+ if ($line =~ /=== $match_phase == (.*)$/)
+ {
+ $component = $1;
+ next;
+ }
+
+ # Find Command
+ # -- bldmake bldfiles -keepgoing
+ if ($line =~ /^-- (.*)/)
+ {
+ $command = $1;
+ next;
+ }
+
+ # Find the Command's Start time
+ # ++ Started at Sat May 03 21:09:07 2003
+ if ($line =~ /^\+\+ Started at (.*)/)
+ {
+ $starttime = $1;
+ next;
+ }
+
+ # Find the Command's End time
+ # ++ Started at Sat May 03 21:09:07 2003
+ if ($line =~ /^\+\+ Finished at (.*)/)
+ {
+ # Calculate the difference in Date/Time and Total up for Command
+ $Dsec = &DiffDateTime($starttime, $1);
+ $Commands{$command} += $Dsec;
+ # Calculate the difference in Date/Time and Total up for Component
+ $Components{$component} += $Dsec;
+ next;
+ }
+
+ # Act on a HiRes Timer unavailable statement in the log
+ # +++ HiRes Time Unavailable
+ if (($line =~ /^\+\+\+ HiRes Time Unavailable/) && !$HiResErrorFlag)
+ {
+ $HiResErrorFlag = 1;
+ print "Warning one of the clients is not sending HiRes timer Data\n";
+ print "No HiRes timings will be available\n";
+ print "Reverting to LowRes timing Data\n";
+ # Clear out Current HiRes Data
+ undef %HiResCommands;
+ undef %HiResComponents;
+ next;
+ }
+
+
+ # Find the Command's HiRes Start time
+ # +++ HiRes Start 1051993130.602050
+ if (($line =~ /^\+\+\+ HiRes Start (\S+)/) && !$HiResErrorFlag)
+ {
+ $HiResStartTime = $1;
+ next;
+ }
+
+ # Find the Command's HiRes End time
+ # +++ HiRes End 1051993193.829650
+ if (($line =~ /^\+\+\+ HiRes End (\S+)/) && !$HiResErrorFlag)
+ {
+ # Calculate the difference in Date/Time and Total up for Command
+ $HiResCommands{$command} += ($1 - $HiResStartTime);
+ # Calculate the difference in Date/Time and Total up for Component
+ $HiResComponents{$component} += ($1 - $HiResStartTime);
+ next;
+ }
+
+ # Lines to Ignore
+ ($iStatus) =&Scanlog::CheckForIgnore($line);
+ if($iStatus)
+ {
+ next;
+ }
+
+ # Advisory Notes
+ ($iStatus) =&Scanlog::CheckForAdvisoryNotes($line);
+ if ($iStatus)
+ {
+ do_AdvisoryNotes($iLog);
+ do_slurp($iSlurp);
+ next;
+ }
+
+ # Migration Notes
+ ($iStatus) = &Scanlog::CheckForMigrationNotes($line);
+ if ($iStatus)
+ {
+ do_migrationNotes($iLog);
+ next;
+ }
+
+ # Remarks
+ ($iStatus, $iSlurp) =&Scanlog::CheckForRemarks($line);
+ if ($iStatus)
+ {
+ do_remarks($iLog);
+ do_slurp($iSlurp);
+ next;
+ }
+
+ # Errors
+ ($iStatus) =&Scanlog::CheckForErrors($line);
+ if ($iStatus)
+ {
+ do_error($iLog);
+ next;
+ }
+
+
+ # Warnings
+ ($iStatus) =&Scanlog::CheckForWarnings($line);
+ if ($iStatus)
+ {
+ do_warning($iLog);
+ next;
+ }
+
+
+ # Things Not Built
+ ($iStatus, $iName) =&Scanlog::CheckForNotBuilt($line);
+ if ($iStatus)
+ {
+ do_error($iLog); # record these along with the errors
+ $not_built{$iName} = "$component";
+ next;
+ }
+
+ # Things missing
+ ($iStatus, $iName) =&Scanlog::CheckForMissing($line);
+ if ($iStatus)
+ {
+ do_error($iLog);
+ $missing{$iName} += 1;
+ next;
+ }
+
+ }
+}
+
+
+# PrintResults
+#
+# Inputs
+# $iTitle (Title for Log file)
+#
+# Outputs
+#
+# Description
+# This function prints all the data as HTML
+sub PrintResults
+{
+ my ($iTitle) = @_;
+
+ my $title;
+
+ # Print Heading of Log File
+ my $heading ="Overall";
+ print HTML qq{<h1>$iTitle</h1>\n};
+ print HTML qq{<h2>$heading</h2>\n};
+
+ # Calculate the total number of remarks messages
+ $remarkcount = 0;
+ foreach $component (sort {lc $a cmp lc $b} keys %remarks)
+ {
+ $remarkcount += scalar(@{$remarks{$component}});
+ }
+ # Calculate the Total number of errors
+ $errorcount = 0;
+ foreach $component (sort {lc $a cmp lc $b} keys %errors)
+ {
+ $errorcount += scalar(@{$errors{$component}});
+ }
+ # Calculate the total number of warnings
+ $warningcount = 0;
+ foreach $component (sort {lc $a cmp lc $b} keys %warnings)
+ {
+ $warningcount += scalar(@{$warnings{$component}});
+ }
+
+ # Calculate the total number of migration notes
+ $migrationNoteCount=0;
+ foreach $component (sort {lc $a cmp lc $b} keys %migrationNotes)
+ {
+ $migrationNoteCount += scalar(@{$migrationNotes{$component}});
+ }
+
+ # Calculate the total number of Advisory notes
+ $AdvisoryNoteCount=0;
+ foreach $component (sort {lc $a cmp lc $b} keys %AdvisoryNotes)
+ {
+ $AdvisoryNoteCount += scalar(@{$AdvisoryNotes{$component}});
+ }
+
+ # Calculate the Total Duration from Phase Data
+ $duration = 0;
+ foreach $phase (sort {lc $a cmp lc $b} keys %Phases)
+ {
+ $duration += $Phases{$phase};
+ }
+ # Start the Table
+ &StartHTMLTable();
+
+ # Print the Totals
+ &HTMLTableRow($heading,"Total", $duration, $errorcount, $warningcount, $AdvisoryNoteCount, $remarkcount, $migrationNoteCount);
+
+ # End the Table
+ print HTML qq{</table>\n};
+
+
+
+ # By Component
+ print HTML qq{<h2>By Component</h2>\n};
+
+ # Start the Table
+ $title="Component";
+ &StartHTMLTable($title);
+
+ # Print the by Component Data
+ # If there is a complete set of HiRes data then use that instead of the LowRes data
+ if ((defined %HiResComponents) && !$HiResErrorFlag)
+ {
+ foreach $component (sort {lc $a cmp lc $b} keys %HiResComponents)
+ {
+ # Calculate the number errors,warnings,advisory notes and remarks
+ my $totalerrors;
+ my $totalwarnings;
+ my $totalremarks;
+ my $totalMigrationNotes;
+ my $totalAdvisoryNotes;
+ if (!defined $remarks{$component})
+ {
+ # No Remarks were recorded, set total to zero
+ $totalremarks = 0;
+ } else {
+ $totalremarks = scalar(@{$remarks{$component}});
+ }
+ if (!defined $errors{$component})
+ {
+ # No errors were recorded, set total to zero
+ $totalerrors = 0;
+ } else {
+ $totalerrors = scalar(@{$errors{$component}});
+ }
+ if (!defined $warnings{$component})
+ {
+ # No Warnings were recorded, set total to zero
+ $totalwarnings = 0;
+ } else {
+ $totalwarnings = scalar(@{$warnings{$component}});
+ }
+
+ if (!defined $migrationNotes{$component})
+ {
+ # No MigrationNotes were recorded, set total to zero
+ $totalMigrationNotes=0;
+ }
+ else
+ {
+ $totalMigrationNotes = scalar(@{$migrationNotes{$component}});
+ }
+ if (!defined $AdvisoryNotes{$component})
+ {
+ # No AdvisoryNotes were recorded, set total to zero
+ $totalAdvisoryNotes=0;
+ }
+ else
+ {
+ $totalAdvisoryNotes = scalar(@{$AdvisoryNotes{$component}});
+ }
+
+
+ # Print the Table Row
+ &HTMLTableRow($title,$component, $HiResComponents{$component}, $totalerrors, $totalwarnings, $totalAdvisoryNotes, $totalremarks, $totalMigrationNotes);
+
+ }
+ } else {
+ foreach $component (sort {lc $a cmp lc $b} keys %Components)
+ {
+ # Calculate the number errors,warnings,advisory notes and remarks
+ my $totalerrors;
+ my $totalwarnings;
+ my $totalremarks;
+ my $totalMigrationNotes;
+ my $totalAdvisoryNotes;
+ if (!defined $remarks{$component})
+ {
+ # No Remarks was recorded, set total to zero
+ $totalremarks = 0;
+ } else {
+ $totalremarks = scalar(@{$remarks{$component}});
+ }
+ if (!defined $errors{$component})
+ {
+ # No errors were recorded, set total to zero
+ $totalerrors = 0;
+ } else {
+ $totalerrors = scalar(@{$errors{$component}});
+ }
+ if (!defined $warnings{$component})
+ {
+ # No Warnings were recorded, set total to zero
+ $totalwarnings = 0;
+ } else {
+ $totalwarnings = scalar(@{$warnings{$component}});
+ }
+
+ if (!defined $migrationNotes{$component})
+ {
+ # No MigrationNotes were recorded, set total to zero
+ $totalMigrationNotes=0;
+ }
+ else
+ {
+ $totalMigrationNotes = scalar(@{$migrationNotes{$component}});
+ }
+
+ if (!defined $AdvisoryNotes{$component})
+ {
+ # No AdvisoryNotes were recorded, set total to zero
+ $totalAdvisoryNotes=0;
+ }
+ else
+ {
+ $totalAdvisoryNotes = scalar(@{$AdvisoryNotes{$component}});
+ }
+
+
+
+ # Print the Table Row
+ &HTMLTableRow($title,$component, $Components{$component}, $totalerrors, $totalwarnings, $totalAdvisoryNotes, $totalremarks, $totalMigrationNotes);
+ }
+ }
+
+ # End the Table
+ print HTML qq{</table>\n};
+
+ # By Command
+ print HTML qq{<h2>By Command</h2>\n};
+
+ # Start the Table
+ $title="Command";
+ &StartHTMLTable($title);
+
+ # Print the by Command Data
+ # If there is a complete set of HiRes data then use that instead of the LowRes data
+ if ((defined %HiResCommands) && !$HiResErrorFlag)
+ {
+ foreach $command (sort {lc $a cmp lc $b} keys %HiResCommands)
+ {
+ # Calculate the number errors, warnings, advisory notes and remarks
+ my $totalerrors;
+ my $totalwarnings;
+ my $totalremarks;
+ my $totalMigrationNotes;
+ my $totalAdvisoryNotes;
+ if (!defined $CmdRemarks{$command})
+ {
+ # No Remarks were recorded, set total to zero
+ $totalremarks = 0;
+ } else {
+ $totalremarks = scalar(@{$CmdRemarks{$command}});
+ }
+ if (!defined $CmdErrors{$command})
+ {
+ # No errors were recorded, set total to zero
+ $totalerrors = 0;
+ } else {
+ $totalerrors = scalar(@{$CmdErrors{$command}});
+ }
+ if (!defined $CmdWarnings{$command})
+ {
+ # No Warnings were recorded, set total to zero
+ $totalwarnings = 0;
+ } else {
+ $totalwarnings = scalar(@{$CmdWarnings{$command}});
+ }
+
+ if (!defined $CmdMigrationNotes{$command})
+ {
+ # No MigrationNotes were recorded, set total to zero
+ $totalMigrationNotes=0;
+ }
+ else
+ {
+ $totalMigrationNotes = scalar(@{$CmdMigrationNotes{$command}});
+ }
+
+ if (!defined $CmdAdvisoryNotes{$command})
+ {
+ # No AdvisoryNotes were recorded, set total to zero
+ $totalAdvisoryNotes=0;
+ }
+ else
+ {
+ $totalAdvisoryNotes = scalar(@{$CmdAdvisoryNotes{$command}});
+ }
+
+
+ # Print the Table Row
+ &HTMLTableRow($title,$command, $HiResCommands{$command}, $totalerrors, $totalwarnings, $totalAdvisoryNotes, $totalremarks, $totalMigrationNotes);
+ }
+ } else {
+ foreach $command (sort {lc $a cmp lc $b} keys %Commands)
+ {
+ # Calculate the number errors,warnings,advisory notes and remarks
+ my $totalerrors;
+ my $totalwarnings;
+ my $totalremarks;
+ my $totalMigrationNotes;
+ my $totalAdvisoryNotes;
+
+ if (!defined $CmdRemarks{$command})
+ {
+ # No Remarks were recorded, set total to zero
+ $totalremarks = 0;
+ } else {
+ $totalremarks = scalar(@{$CmdRemarks{$command}});
+ }
+ if (!defined $CmdErrors{$command})
+ {
+ # No errors were recorded, set total to zero
+ $totalerrors = 0;
+ } else {
+ $totalerrors = scalar(@{$CmdErrors{$command}});
+ }
+ if (!defined $CmdWarnings{$command})
+ {
+ # No Warnings were recorded, set total to zero
+ $totalwarnings = 0;
+ } else {
+ $totalwarnings = scalar(@{$CmdWarnings{$command}});
+ }
+
+ if (!defined $CmdMigrationNotes{$command})
+ {
+ # No MigrationNotes were recorded, set total to zero
+ $totalMigrationNotes=0;
+ }
+ else
+ {
+ $totalMigrationNotes = scalar(@{$CmdMigrationNotes{$command}});
+ }
+
+ if (!defined $CmdAdvisoryNotes{$command})
+ {
+ # No AdvisoryNotes were recorded, set total to zero
+ $totalAdvisoryNotes=0;
+ }
+ else
+ {
+ $totalAdvisoryNotes = scalar(@{$CmdAdvisoryNotes{$command}});
+ }
+
+ # Print the Table Row
+ &HTMLTableRow($title,$command, $Commands{$command}, $totalerrors, $totalwarnings, $totalAdvisoryNotes, $totalremarks, $totalMigrationNotes);
+ }
+ }
+
+ # End the Table
+ print HTML qq{</table>\n};
+
+ # Print Things Missing
+ if (scalar %missing)
+ {
+ my $count = scalar keys %missing;
+ print HTML qq{<h2>Things Missing ($count)</h2>\n};
+ print HTML "Don't know how to make...\n";
+ foreach my $file (sort {lc $a cmp lc $b} keys %missing)
+ {
+ printf HTML "%d\t%s</BR>\n", $missing{$file}, $file;
+ }
+ }
+ print HTML qq{</BR>\n};
+
+ # Print Things Not Built
+ if (scalar %not_built)
+ {
+ my $count = scalar keys %not_built;
+ print HTML qq{<h2>Things Not Built ($count)</h2>\n};
+ foreach my $file (sort {lc $a cmp lc $b} keys %not_built)
+ {
+ print HTML "MISSING: $file ($not_built{$file})</BR>\n";
+ }
+ }
+
+
+ # Print the Actual Errors by Component
+ if ($iVerbose > 0)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %errors))
+ {
+ print HTML qq{<h2><a name="errorsByOverall_Total">Error Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %errors)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$errors{$component}};
+ print HTML qq{<h3><a name="errorsByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$errors{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Warning by Component
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some warnings
+ if (scalar(keys %warnings))
+ {
+ print HTML qq{<h2><a name="warningsByOverall_Total">Warning Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %warnings)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$warnings{$component}};
+ print HTML qq{<h3><a name="warningsByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$warnings{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Advisory Notes by Component
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some warnings
+ if (scalar(keys %AdvisoryNotes))
+ {
+ print HTML qq{<h2><a name="AdvisoryNotesByOverall_Total">Advisory Note Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %AdvisoryNotes)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$AdvisoryNotes{$component}};
+ print HTML qq{<h3><a name="AdvisoryNotesByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$AdvisoryNotes{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Remarks by Component
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %remarks))
+ {
+ print HTML qq{<h2><a name="remarksByOverall_Total">Remarks Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %remarks)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$remarks{$component}};
+ print HTML qq{<h3><a name="remarksByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$remarks{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Migration Notes by Component
+if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some warnings
+ if (scalar(keys %migrationNotes))
+ {
+ print HTML qq{<h2><a name="migrationNotesByOverall_Total">Migration Note Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %migrationNotes)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$migrationNotes{$component}};
+ print HTML qq{<h3><a name="migrationNotesByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$migrationNotes{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Errors by Command
+ if ($iVerbose > 0)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %CmdErrors))
+ {
+ print HTML qq{<h2>Error Details by Command</h2>\n};
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdErrors)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="errorsByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdErrors{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Warning by Command
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some warnings
+ if (scalar(keys %CmdWarnings))
+ {
+ print HTML qq{<h2>Warning Details by Command</h2>\n};
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdWarnings)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="warningsByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdWarnings{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Advisory Notes by Command
+ if ($iVerbose >1)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %CmdAdvisoryNotes))
+ {
+ print HTML qq{<h2>Advisory Note Details by Command</h2>\n};
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdAdvisoryNotes)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="AdvisoryNotesByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdAdvisoryNotes{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n}
+ }
+ }
+ }
+
+ # Print the Actual Remarks by Command
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %CmdRemarks))
+ {
+ print HTML qq{<h2>Remarks Details by Command</h2>\n};
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdRemarks)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="remarksByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdRemarks{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Migration Notes by Command
+ if ($iVerbose >1)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %CmdMigrationNotes))
+ {
+ print HTML qq{<h2>Migration Note Details by Command</h2>\n};
+
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdMigrationNotes)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="migrationNotesByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdMigrationNotes{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n}
+ }
+ }
+ }
+
+}
+
+
+# StartHTMLTable
+#
+# Inputs
+# $iC1Title (Column 1 Title)
+#
+# Outputs
+#
+# Description
+# This function prints the start of the HTML Table
+sub StartHTMLTable
+{
+ my ($iC1Title) = @_;
+
+ if ($iC1Title eq '')
+ {
+ $iC1Title = " ";
+ } else {
+ encode_entities($iC1Title);
+ }
+
+ # Start the Table
+ print HTML qq{<table border="1" cellpadding="0" cellspacing="0" width="100%">\n};
+
+ # Print the Header Row
+ print HTML qq{\t<th width="50%">$iC1Title</th>\n};
+ print HTML qq{\t<th width="15%">Time</th>\n};
+ print HTML qq{\t<th width="8%">Errors</th>\n};
+ print HTML qq{\t<th width="8%">Warnings</th>\n};
+ print HTML qq{\t<th width="8%">Advisory Notes</th>\n};
+ print HTML qq{\t<th width="8%">Remarks</th>\n};
+ print HTML qq{\t<th width="8%">Migration Notes</th>\n};
+ print HTML qq{</tr>\n};
+}
+
+# HTMLTableCell
+#
+# Inputs
+# $iType (errors,warnings,remarks,migration_notes)
+# $iCount (number of errors)
+# $iLink (empty string or linktype)
+#
+# Outputs
+# Returns HTML table data element with appropriate link & background color
+#
+# Description
+# Constructs HTML table element - used by HTMLTableRow to handle the formatting
+# of the data cells, complete with colouring and links where appropriate.
+sub HTMLTableCell
+{
+ my ($iType,$iCount,$iLink)= @_;
+ my $td = qq{td width="8%" align="center"}; # implied by the TH elements already?
+ if ($iCount != 0)
+ {
+ $td = "$td BGCOLOR=$htmlColours{$iType}";
+ }
+ if ($iLink eq "" || $iCount == 0)
+ {
+ return qq{<$td>$iCount</td>};
+ }
+ $iLink = $iType."By".$iLink;
+ return qq{<$td><a href="#$iLink">$iCount</a></td>};
+}
+
+# HTMLTableRow
+#
+# Inputs
+# $iTitle (Need to differentiate between command and component to provide correct anchors)
+# $iC1Data(Column 1 Data)
+# $iC2Data(Column 2 Data) (Time in seconds)
+# $iC3Data(Column 3 Data) (Number of errors)
+# $iC4Data(Column 4 Data) (Number of warnings)
+# $iC5Data(Column 5 Data) (Number of Advisory notes )
+# $iC6Data(Column 6 Data) (Number of remarks )
+# $iC7Data(Column 7 Data) (Number of migration notes )
+#
+# Outputs
+#
+# Description
+# This function prints a line of the HTML Table
+sub HTMLTableRow
+{
+ my ($iTitle,$iC1Data, $iC2Data, $iC3Data, $iC4Data,$iC5Data, $iC6Data, $iC7Data) = @_;
+
+ #print "$iC2Data\n";
+
+ # Convert the seconds in hh:mm:ss format
+ $iC2Data = &ConvertSeconds($iC2Data);
+
+ # HTML encode the text
+ encode_entities($iC1Data);
+ encode_entities($iC2Data);
+ encode_entities($iC3Data);
+ encode_entities($iC4Data);
+ encode_entities($iC5Data);
+ encode_entities($iC6Data);
+ encode_entities($iC7Data);
+
+ my $linkname = "$iTitle"."_"."$iC1Data";
+
+ # Print the Row, including summary in a script comment
+ print HTML qq{<tr>\n};
+ print HTML qq{<!--\t$linkname\t$iC2Data\t$iC3Data\t$iC4Data\t$iC5Data\t$iC6Data\t$iC7Data\t-->\n};
+ print HTML qq{\t<td width="50%">$iC1Data</td>\n};
+ print HTML qq{\t<td width="15%" align="center">$iC2Data</td>\n};
+
+ print HTML "\t",&HTMLTableCell("errors", $iC3Data,$linkname),"\n";
+ print HTML "\t",&HTMLTableCell("warnings",$iC4Data,$linkname),"\n";
+ print HTML "\t",&HTMLTableCell("AdvisoryNotes", $iC5Data,$linkname),"\n";
+ print HTML "\t",&HTMLTableCell("remarks", $iC6Data,$linkname),"\n";
+ print HTML "\t",&HTMLTableCell("migrationNotes", $iC7Data,$linkname),"\n";
+
+ print HTML qq{</tr>\n};
+}
+
+# ConvertSeconds
+#
+# Inputs
+# $iSeconds
+#
+# Outputs
+# $iString (seconds in hh:mm:ss)
+#
+# Description
+# This function processes the commandline
+sub ConvertSeconds
+{
+ my ($iSeconds) = @_;
+
+ my ($iString);
+ my ($ih) = int($iSeconds/3600);
+ my ($im) = int(($iSeconds-($ih*3600))/60);
+ my ($is) = $iSeconds-($ih*3600)-($im*60);
+ # Print the correct format if the data is HiRes (has a decimal point in the string)
+ if ($is =~ /\d+\.\d+/)
+ {
+ $iString = sprintf "%d:%02d:%06.3f", $ih, $im, $is;
+ } else {
+ $iString = sprintf "%d:%02d:%02d", $ih, $im, $is;
+ }
+ return $iString;
+}
+
+# ProcessCommandLine
+#
+# Inputs
+#
+# Outputs
+# $iOutput (Output filename)
+# $iVerbose (Verbose Level)
+# $iLogs (Log files to process)
+#
+# Description
+# This function processes the commandline
+
+sub ProcessCommandLine {
+ my ($iHelp, @iLogs, $iOutput, $iTitle, $iVerbose, $iDiff, $iHistory, $iClass, $iHistoryHelp);
+ GetOptions('h' => \$iHelp, 'l=s' =>\@iLogs, 'o=s' => \$iOutput, 't=s' => \$iTitle, 'v+' => \$iVerbose, 'd=s' =>\$iDiff, 'c=s' =>\$iHistory, 'm=s' =>\$iClass, 'hh' => \$iHistoryHelp);
+
+ if ($iHistoryHelp)
+ {
+ &HistoryHelp();
+ }
+
+ if (($iHelp) || (!defined @iLogs) || (!defined $iOutput))
+ {
+ Usage();
+ } elsif (-e $iOutput) {
+ die "$iOutput already exists";
+ } elsif (-e $iDiff) {
+ die "$iDiff already exists";
+ } elsif (-e $iWhat) {
+ die "$iWhat already exists";
+ }
+ foreach my $iLog (@iLogs)
+ {
+ warn "$iLog does not exist" if (! -e $iLog);
+ }
+
+ # Check the history options
+ if (defined $iHistory)
+ {
+ if (! -e $iHistory)
+ {
+ warn "$iHistory does not exist";
+ undef $iHistory;
+ }
+
+ elsif (!defined $iClass)
+ {
+ warn "No machine name to class csv file specified with -m option";
+ undef $iHistory;
+ }
+ }
+
+ # Set default title
+ if ($iTitle eq '')
+ {
+ $iTitle = "Log File Summary";
+ }
+
+ return($iOutput, $iTitle, $iVerbose, $iDiff, $iWhat, $iHistory, $iClass, @iLogs);
+}
+
+# Usage
+#
+# Output Usage Information.
+#
+
+sub Usage {
+ print <<USAGE_EOF;
+
+ Usage: Scanlog.pl [options]
+
+ options:
+
+ -h help
+ -l Log file to scan [Multiple allowed]
+ -o Output file
+ -v Increments Verbose level [Maximum Level = 2]
+ -t Title to add to the Summary
+ -d Filename for Logfile with Time Information removed [Optional]
+
+ History options [Optional]
+ -hh More help on History options and file formats
+ -c History csv to add summary to
+ -m Machine name to class csv data file [required if using -c]
+
+USAGE_EOF
+ exit 1;
+}
+
+# HistoryHelp
+#
+# Output History Help Information.
+#
+sub HistoryHelp{
+ print <<HISTORY_EOF;
+
+ History Description:
+ The History function collates the timing summary information of the
+ components from multiple builds. As the timing data varies between
+ machines of different specifications, htmlscanlog tries to identify
+ the machines hostname from the logs so it can identify which class
+ of machine it belongs to (the machine class is used to group multiple
+ machines with identical specifications). If it is not able to identify
+ a machine name (and class) it uses the first entry in the Machine name
+ to class csv.
+
+ History csv file format:
+ The csv format is for easy loading into spreadsheet programs for
+ generating charts. The first line contains the column headings, the
+ first column headings is the machine class, machine name, Title,
+ the last time entry in all the logs processed, then the
+ component names. Removed components will cause empty entries, new
+ components will be added at the end.
+
+ Machine name to class csv data file format:
+ The csv format contains two columns with no headings, first column is
+ the class name, the second is the machine name.
+
+HISTORY_EOF
+ exit 1;
+}
+
+# PrintHTMLHeader
+#
+# Inputs
+# $iTitle (Title for Log file)
+#
+# Outputs
+#
+# Description
+# This function print the HTML Header
+
+sub PrintHTMLHeader {
+ my ($iTitle) = @_;
+
+ print HTML <<HTML_EOF;
+<HTML>
+<HEAD>
+<TITLE>$iTitle</TITLE>
+</HEAD>
+<BODY BGCOLOR="FFFFFF">
+<FONT FACE="Courier New">
+HTML_EOF
+}
+
+# PrintHTMLFooter
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function print the HTML Footer
+
+sub PrintHTMLFooter {
+ print HTML <<HTML_EOF;
+</FONT>
+</BODY>
+</HTML>
+HTML_EOF
+}
+
+# DiffDateTime
+#
+# Inputs
+# $StartDateTime (Start Date/Time String)
+# $EndDateTime (End Date/Time String)
+#
+# Outputs
+# $Duration (Difference in seconds bertween the two dates/Times)
+#
+# Description
+# This function calculate the difference between to dates and times
+
+sub DiffDateTime {
+ my ($String1, $String2) = @_;
+
+ my ($err, $delta);
+
+ $delta=&DateCalc($String1,$String2,\$err);
+ if ($err)
+ {
+ print "WARNING: DiffDateTime encountered and error\n";
+ return "0";
+ } else {
+ # Convert into seconds to aid additions
+ return &Delta_Format($delta,'0',"%sh");
+ }
+}
+
+sub do_remarks()
+{
+ my ($iLog) =@_;
+ # Store remarks by Command
+ if (!defined $CmdRemarks{$command})
+ {
+ $CmdRemarks{$command} = ();
+ }
+ push @{$CmdRemarks{$command}}, "$iLog:"."$.".">$line";
+
+ # Store remarks by Component
+ if (!defined $remarks{$component})
+ {
+ $remarks{$component} = ();
+ }
+ push @{$remarks{$component}}, "$iLog:"."$.".">$line";
+}
+
+sub do_warning()
+{
+ my ($iLog) =@_;
+ # Store warning by Command
+ if (!defined $CmdWarnings{$command})
+ {
+ $CmdWarnings{$command} = ();
+ }
+ push @{$CmdWarnings{$command}}, "$iLog:"."$.".">$line";
+
+ # Store warning by Component
+ if (!defined $warnings{$component})
+ {
+ $warnings{$component} = ();
+ }
+ push @{$warnings{$component}}, "$iLog:"."$.".">$line";
+}
+
+
+sub do_migrationNotes()
+ {
+ my ($iLog)= @_;
+ # Store Migration Notes by command
+ if (!defined $CmdMigrationNotes{$command})
+ {
+ $CmdMigrationNotes{$command} = ();
+ }
+ push @{$CmdMigrationNotes{$command}}, "$iLog:"."$.".">$line";
+
+ # Store Migration Notes by Componen
+ if (!defined $migrationNotes{$component})
+ {
+ $migrationNotes{$component} = ();
+ }
+ push @{$migrationNotes{$component}}, "$iLog:"."$.".">$line";
+
+ }
+
+sub do_AdvisoryNotes()
+ {
+ my ($iLog)= @_;
+ # Store Advisory Notes by command
+ if (!defined $CmdAdvisoryNotes{$command})
+ {
+ $CmdAdvisoryNotes{$command} = ();
+ }
+ push @{$CmdAdvisoryNotes{$command}}, "$iLog:"."$.".">$line";
+
+ # Store Advisory Notes by Component
+ if (!defined $AdvisoryNotes{$component})
+ {
+ $AdvisoryNotes{$component} = ();
+ }
+ push @{$AdvisoryNotes{$component}}, "$iLog:"."$.".">$line";
+
+}
+
+sub do_error()
+{
+ my ($iLog) =@_;
+ # Store Errors by Command
+ if (!defined $CmdErrors{$command})
+ {
+ $CmdErrors{$command} = ();
+ }
+ push @{$CmdErrors{$command}}, "$iLog:"."$.".">$line";
+
+ # Store Errors by Component
+ if (!defined $errors{$component})
+ {
+ $errors{$component} = ();
+ }
+ push @{$errors{$component}}, "$iLog:"."$.".">$line";
+}
+
+# Read a number of lines in the log ignoreing the content
+sub do_slurp()
+{
+ my ($num_lines) =@_;
+ for (my $i = 0; $i < $num_lines; $i++)
+ {
+ <LOG>;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/scanlog/scanlog.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,365 @@
+# Copyright (c) 2003-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:
+# summarise an automated build log
+# documentation available in generic\tools\e32toolp\docs\scanlog.txt
+# please update the documentation when modifying this file
+# RegEx's in Scanlog Module
+#
+#
+
+use strict;
+use FindBin; # for FindBin::Bin
+
+# Add the directory contain this perl script into the path to find modules
+use lib $FindBin::Bin;
+
+use Scanlog;
+
+my $line;
+my $iSlurp;
+my $phase;
+my $match_phase='';
+my $command='???';
+my $starttime;
+my $duration;
+my $errorcount=0;
+my $component='???';
+my %errors;
+my %missing;
+my %not_built;
+my $totalduration = 0;
+my $totalerrors = 0;
+my $warningcount=0;
+my %warnings;
+my $totalwarnings = 0;
+my $remarkscount=0;
+my %remarks;
+my $totalremarks = 0;
+my $migrationnotescount=0;
+my %migrationnotes;
+my $totalmigrationnotes = 0;
+my ($iStatus, $iName);
+
+my $verbose = 0;
+my $argc = scalar(@ARGV);
+if ($argc>0 and $ARGV[0]=~/^\s*\-v\s*$/)
+ {
+ $verbose = 1;
+ shift @ARGV;
+ }
+elsif ($argc>0 and $ARGV[0]=~/^\s*\-V\s*$/)
+ {
+ $verbose = 2;
+ shift @ARGV;
+ }
+
+sub do_remarks()
+ {
+ $remarkscount += 1;
+ if (!defined $remarks{$component})
+ {
+ $remarks{$component} = ();
+ }
+ push @{$remarks{$component}}, $line;
+ }
+
+sub do_migrationnotes()
+ {
+ $migrationnotescount += 1;
+ if (!defined $migrationnotes{$component})
+ {
+ $migrationnotes{$component} = ();
+ }
+ push @{$migrationnotes{$component}}, $line;
+ }
+
+sub do_warning()
+ {
+ $warningcount += 1;
+ if (!defined $warnings{$component})
+ {
+ $warnings{$component} = ();
+ }
+ push @{$warnings{$component}}, $line;
+ }
+
+sub do_error()
+ {
+ $errorcount += 1;
+ if (!defined $errors{$component})
+ {
+ $errors{$component} = ();
+ }
+ push @{$errors{$component}}, $line;
+ }
+
+# Read a number of lines in the log ignoreing the content
+sub do_slurp
+{
+ my ($num_lines) =@_;
+ for (my $i = 0; $i < $num_lines; $i++)
+ {
+ <>;
+ }
+}
+
+sub print_command_summary($;$)
+ {
+ my ($command, $duration) = @_;
+
+ return if ($command eq '???' && $errorcount==0 && $warningcount==0 && $remarkscount==0 && $migrationnotescount==0 );
+
+ my $elapsed = '??:??:??';
+ if (defined($duration))
+ {
+ $totalduration += $duration;
+ my ($sec,$min,$hour) = gmtime($duration);
+ $elapsed = sprintf("%02d:%02d:%02d", $hour, $min, $sec);
+ }
+
+ printf "%-28s\t%s\t%6d\t%6d\t%6d\t%6d\n", $command, $elapsed, $errorcount, $warningcount, $remarkscount, $migrationnotescount;
+ $totalerrors += $errorcount;
+ $totalwarnings += $warningcount;
+ $totalremarks += $remarkscount;
+ $totalmigrationnotes += $migrationnotescount;
+ $errorcount = 0;
+ $warningcount = 0;
+ $remarkscount = 0;
+ $migrationnotescount = 0;
+ }
+
+printf "%-28s\t%-8s\t%-6s\t%-6s\t%-6s\t%-6s %s\n", 'Command', 'Time', 'Errors', 'Warning','Remarks','Migration-Notes';
+
+while ($line=<>)
+ {
+
+ # ===-------------------------------------------------
+ # === baseline_bldfiles
+ # ===-------------------------------------------------
+ # === bldfiles started Sat Jul 24 01:38:03 1999.
+
+ if ($line =~ /^===------/)
+ {
+ print_command_summary($command);
+ $line = <>;
+ $line =~ /=== (.*)$/;
+ $command = $1;
+ <>;
+ $line = <>;
+ $line =~ /^=== (.+) started ... ... .. (..):(..):(..)/;
+ $phase = $1;
+ $starttime = ($2*60 + $3)*60 + $4;
+ $match_phase=$phase;
+ $match_phase=~s-\\-\\\\-go;
+ next;
+ }
+
+ # === bldfiles finished Sat Jul 24 01:38:56 1999.
+ if ($line =~ /^=== $match_phase finished ... ... .. (..):(..):(..)/)
+ {
+ $duration = ($1*60 + $2)*60 + $3 - $starttime;
+ if ($duration < 0)
+ {
+ $duration += 24*60*60;
+ }
+
+ print_command_summary($command,$duration);
+ $command = '???';
+ $component = '???';
+ next;
+ }
+
+ # === resource == gdtran 036
+
+ if ($line =~ /=== $match_phase == (\S+)/)
+ {
+ $component = $1;
+ $component =~ /(.*)[\\]$/;
+ $component = $1;
+ next;
+ }
+
+ # Lines to Ignore
+ ($iStatus) =&Scanlog::CheckForIgnore($line);
+ if($iStatus)
+ {
+ next;
+ }
+
+ # migrationnotes
+ ($iStatus, $iSlurp) =&Scanlog::CheckForMigrationNotes($line);
+ if ($iStatus)
+ {
+ do_migrationnotes();
+ do_slurp($iSlurp);
+ next;
+ }
+ # Remarks
+ ($iStatus, $iSlurp) =&Scanlog::CheckForRemarks($line);
+ if ($iStatus)
+ {
+ do_remarks();
+ do_slurp($iSlurp);
+ next;
+ }
+ # Errors
+ ($iStatus) =&Scanlog::CheckForErrors($line);
+ if ($iStatus)
+ {
+ do_error();
+ next;
+ }
+
+ # Warnings
+ ($iStatus) =&Scanlog::CheckForWarnings($line);
+ if ($iStatus)
+ {
+ do_warning();
+ next;
+ }
+
+ # Things Not Built
+ ($iStatus, $iName) =&Scanlog::CheckForNotBuilt($line);
+ if ($iStatus)
+ {
+ do_error();
+ $not_built{$iName} = "$component";
+ next;
+ }
+
+ # Things missing
+ ($iStatus, $iName) =&Scanlog::CheckForMissing($line);
+ if ($iStatus)
+ {
+ do_error();
+ $missing{$iName} += 1;
+ next;
+ }
+
+}
+
+print_command_summary($command);
+print "\n";
+my ($sec,$min,$hour, $mday) = gmtime($totalduration);
+$hour+=($mday-1)*24; # to allow for builds taking longer than 24 hours!
+
+printf "%-28s\t%02d:%02d:%02d\t%6d\t%6d\t%6d\t%6d\n\n", "Total", $hour, $min, $sec, $totalerrors, $totalwarnings, $totalremarks, $totalmigrationnotes;
+
+if (scalar %errors)
+ {
+ print "Fatal Errors by Component\n";
+ $errorcount = 0;
+ foreach $component (sort keys %errors)
+ {
+ printf "%-16s\t%6d\n", $component, scalar(@{$errors{$component}});
+ $errorcount += scalar(@{$errors{$component}});
+ }
+ if ($verbose>0)
+ {
+ print "\nError details";
+ foreach $component (sort keys %errors)
+ {
+ print "\n----------------------------\n$component\n";
+ foreach $line (@{$errors{$component}})
+ {
+ print $line;
+ }
+ }
+ }
+ }
+
+if (scalar %missing)
+ {
+ print "\nDon't know how to make...\n";
+ foreach my $file (sort keys %missing)
+ {
+ printf "%d\t%s\n", $missing{$file}, $file;
+ }
+ }
+
+if (scalar %not_built)
+ {
+ print "\nThings not built...\n";
+ foreach my $file (sort keys %not_built)
+ {
+ print "MISSING: $file ($not_built{$file})\n";
+ }
+ print "\n\n";
+ }
+
+if (scalar %warnings)
+ {
+ print "\nWarnings by Component\n";
+ $warningcount = 0;
+ foreach $component (sort keys %warnings)
+ {
+ printf "%-16s\t%6d\n", $component, scalar @{$warnings{$component}};
+ }
+ if ($verbose>1)
+ {
+ print "\nWarning details";
+ foreach $component (sort keys %warnings)
+ {
+ print "\n----------------------------\n$component\n";
+ foreach $line (@{$warnings{$component}})
+ {
+ print $line;
+ }
+ }
+ }
+ }
+if (scalar %remarks)
+ {
+ print "\nRemarks by Component\n";
+ $remarkscount = 0;
+ foreach $component (sort keys %remarks)
+ {
+ printf "%-16s\t%6d\n", $component, scalar @{$remarks{$component}};
+ }
+ if ($verbose>1)
+ {
+ print "\nRemarks details";
+ foreach $component (sort keys %remarks)
+ {
+ print "\n----------------------------\n$component\n";
+ foreach $line (@{$remarks{$component}})
+ {
+ print $line;
+ }
+ }
+ }
+ }
+
+if (scalar %migrationnotes)
+ {
+ print "\nMigration Notes by Component\n";
+ $migrationnotescount = 0;
+ foreach $component (sort keys %migrationnotes)
+ {
+ printf "%-16s\t%6d\n", $component, scalar @{$migrationnotes{$component}};
+ }
+ if ($verbose>1)
+ {
+ print "\nMigration Notes Details";
+ foreach $component (sort keys %migrationnotes)
+ {
+ print "\n----------------------------\n$component\n";
+ foreach $line (@{$migrationnotes{$component}})
+ {
+ print $line;
+ }
+ }
+ }
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/validate_sch12_model.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,333 @@
+#
+# 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:
+#
+#! perl
+
+# Read a Schedule12 file and check the system_model items
+# against a supplied System_Definition.xml
+
+use strict;
+
+use FindBin;
+use lib ".";
+use lib "./lib";
+use lib "$FindBin::Bin";
+use lib "$FindBin::Bin/lib";
+use XML::DOM;
+use XML::DOM::ValParser;
+
+# produces the "Use of uninitialized value in concatenation (.) or string" warning
+use XML::XQL;
+use XML::XQL::DOM;
+
+# Read the command line to get the filenames
+
+sub Usage($)
+ {
+ my ($reason) = @_;
+
+ print "Usage: $reason\n" if ($reason);
+ print <<USAGE_EOF;
+
+Usage: validate_sch12_model.pl <params> [options]
+
+params:
+-s <schedule12> XML version of Schedule 12
+-m <system_model> XML version of System Model
+
+options:
+-o <whats_left> XML file showing unreferenced
+ parts of the System Model
+-r Remove matched objects from -o output
+-c <cbr_mapping> Tab separated file showing the Schedule 12
+ component for each MRP file
+
+USAGE_EOF
+ exit(1);
+ }
+
+use Getopt::Long;
+
+my $schedule12file = "Symbian_OS_v9.1_Schedule12.xml";
+my $systemmodelfile = "System_Definition.xml";
+my $whatsleftfile = "";
+my $remove = 0;
+my $cbrmappingfile = "";
+
+Usage("Bad arguments") unless GetOptions(
+ 's=s' => \$schedule12file,
+ 'm=s' => \$systemmodelfile,
+ 'o=s' => \$whatsleftfile,
+ 'r' => \$remove,
+ 'c=s' => \$cbrmappingfile);
+
+Usage("Too many arguments") if (scalar @ARGV > 0);
+Usage("Cannot find $schedule12file") if (!-f $schedule12file);
+Usage("Cannot find $systemmodelfile") if (!-f $systemmodelfile);
+
+
+# Don't print info messages
+sub my_fail
+ {
+ my $code = shift;
+ if ($code < 300)
+ {
+ XML::Checker::print_error ($code, @_);
+ }
+ }
+$XML::Checker::FAIL = \&my_fail;
+
+# Load the XML documents
+my %expat_options =
+ (
+ KeepCDATA => 1,
+ Handlers => [],
+ );
+
+my $xmlParser = new XML::DOM::ValParser(%expat_options);
+XML::DOM::ignoreReadOnly(1);
+
+my $sch12path = ".";
+my $modelpath = ".";
+$sch12path = $1 if ($schedule12file =~ /^(.+)\\[^\\]+$/);
+$modelpath = $1 if ($systemmodelfile =~ /^(.+)\\[^\\]+$/);
+$xmlParser->set_sgml_search_path($sch12path, $modelpath);
+
+my $modelXML = $xmlParser->parsefile ($systemmodelfile);
+my $sch12XML = $xmlParser->parsefile ($schedule12file);
+
+# Collect the Schedule12 entries, checking for duplicates
+
+my %sch12refs;
+my %componenttype;
+my ($sch12) = $sch12XML->getElementsByTagName("Schedule12");
+Usage("No <Schedule12> in $schedule12file ?") if (!defined $sch12);
+
+my @children = $sch12->getChildNodes;
+foreach my $child (@children)
+ {
+ next if ($child->getNodeTypeName ne "ELEMENT_NODE");
+ my $tagname = $child->getTagName;
+ next if ($tagname eq "footnote");
+ my $component = $child->getAttribute("name");
+ $componenttype{$component} = $tagname;
+
+ my @entries = $child->getElementsByTagName("system_model");
+ if (scalar @entries == 0)
+ {
+ print STDERR "No system_model entries in $component\n";
+ next;
+ }
+
+ foreach my $entry (@entries)
+ {
+ my $name = $entry->getAttribute("entry");
+ if (defined $sch12refs{$name})
+ {
+ print STDERR "$name occurs in $sch12refs{$name} and $component\n";
+ }
+ else
+ {
+ $sch12refs{$name} = $component;
+ }
+ }
+ }
+
+# Find the Schedule12 entries in the XML file
+
+my %modelnames;
+sub match_names($); # declare the prototype for recursive call
+sub match_names($)
+ {
+ my ($node) = @_;
+
+ my @children = $node->getChildNodes;
+ foreach my $child (@children)
+ {
+ if ($child->getNodeTypeName ne "ELEMENT_NODE")
+ {
+ # text and comments don't count
+ next;
+ }
+ my $tagname = $child->getTagName;
+ if ($tagname eq "unit")
+ {
+ # units are detail inside the model, so they don't count
+ next;
+ }
+ my $name = $child->getAttribute("name");
+ if ($name)
+ {
+ if (defined $modelnames{$name})
+ {
+ print STDERR "Name $name occurs more than once in the System Model\n";
+ }
+ $modelnames{$name} = $tagname;
+
+ if (defined $sch12refs{$name})
+ {
+ $child->setAttribute("MATCHED", $sch12refs{$name});
+ $modelnames{$name} = "1";
+ }
+ }
+ match_names($child);
+ }
+ }
+
+my ($model) = $modelXML->getElementsByTagName("systemModel");
+
+match_names($model);
+
+# Report on the accuracy of Schedule 12
+print STDERR "\n";
+my @allnames = ();
+my $unmatched = 0;
+foreach my $name (sort keys %sch12refs)
+ {
+ next if (defined $modelnames{$name});
+ push @allnames, "$name\t(Sch12 $sch12refs{$name})\n";
+ print STDERR "No match for $name (associated with $sch12refs{$name})\n";
+ $unmatched += 1;
+ }
+if ($unmatched == 0)
+ {
+ print STDERR "All Schedule 12 entries matched in System Model\n";
+ }
+else
+ {
+ printf STDERR "%d Schedule 12 entry references not matched (from a total of %d)\n", $unmatched, scalar keys %sch12refs;
+ }
+
+# Remove the matched elements to leave the unmatched parts,
+# and accumulate the MRP files for each Sch12 component
+
+my %sch12bymrp;
+my %locationbymrp;
+
+sub list_mrps($$$); # declare the prototype for recursive call
+sub list_mrps($$$)
+ {
+ my ($node,$location,$sch12name) = @_;
+ my @children = $node->getChildNodes;
+ my $nodename = $node->getAttribute("name");
+
+ my $sublocation = $nodename;
+ $sublocation = "$location/$nodename" if ($location ne "");
+
+ foreach my $child (@children)
+ {
+ if ($child->getNodeTypeName ne "ELEMENT_NODE")
+ {
+ # text and comments don't count
+ next;
+ }
+ my $tagname = $child->getTagName;
+ if ($tagname eq "unit" || $tagname eq "package" || $tagname eq "prebuilt")
+ {
+ # these elements have the mrp information, but no substructure
+ my $mrp = $child->getAttribute("mrp");
+ $mrp = $1 if ($mrp =~ /\\([^\\]+)\.mrp$/i);
+ $sch12bymrp{$mrp} = $sch12name;
+ $locationbymrp{$mrp} = "$location\t$nodename";
+ next;
+ }
+ my $submatch = $child->getAttribute("MATCHED");
+ if ($submatch)
+ {
+ list_mrps($child,$sublocation,$submatch);
+ }
+ else
+ {
+ list_mrps($child,$sublocation,$sch12name);
+ }
+ }
+ }
+
+sub delete_matched($$); # declare the prototype for recursive call
+sub delete_matched($$)
+ {
+ my ($node, $location) = @_;
+ my $nodename = $node->getAttribute("name");
+
+ my $sublocation = $nodename;
+ $sublocation = "$location/$nodename" if ($location ne "");
+
+ my @children = $node->getChildNodes;
+ return 0 if (scalar @children == 0);
+ my $now_empty = 1;
+ foreach my $child (@children)
+ {
+ if ($child->getNodeTypeName ne "ELEMENT_NODE")
+ {
+ # text and comments don't count
+ next;
+ }
+ my $sch12name = $child->getAttribute("MATCHED");
+ if ($sch12name)
+ {
+ list_mrps($child, $sublocation, $sch12name);
+ $node->removeChild($child) if ($remove);
+ }
+ else
+ {
+ if (delete_matched($child,$sublocation) == 1)
+ {
+ # Child was empty and can be removed
+ $node->removeChild($child) if ($remove);
+ }
+ else
+ {
+ list_mrps($child, $sublocation, "*UNREFERENCED*");
+ $now_empty = 0; # something left in due to this child
+ }
+ }
+ }
+ return $now_empty;
+ }
+
+# scan the tagged model, recording various details as a side-effect
+
+my $allgone = delete_matched($model,"");
+
+if ($whatsleftfile ne "")
+ {
+ if ($allgone)
+ {
+ print STDERR "System Model is completely covered by Schedule 12\n";
+ }
+ else
+ {
+ $modelXML->normalize;
+ $modelXML->printToFile($whatsleftfile);
+ print STDERR "Remains of System Model written to $whatsleftfile\n";
+ }
+ }
+
+if ($cbrmappingfile ne "")
+ {
+ $componenttype{"*UNREFERENCED*"} = "??";
+ open CBRMAP, ">$cbrmappingfile" or die("Unable to write to $cbrmappingfile: $!\n");
+ foreach my $mrp (sort keys %sch12bymrp)
+ {
+ my $component = $sch12bymrp{$mrp};
+ my $comptype = $componenttype{$component};
+ my $location = $locationbymrp{$mrp};
+ print CBRMAP "$mrp\t$location\t$component\t$comptype\n";
+ }
+ close CBRMAP;
+ print STDERR "MRP -> Schedule 12 mapping written to $cbrmappingfile\n";
+ }
+
+exit 0;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/commonbldutils/group/bld.inf Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,23 @@
+// Copyright (c) 2003-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:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+
+..\sbsv2htmlscanlog\sbsv2htmlscanlog.pl \epoc32\tools\sbsv2htmlscanlog.pl
+..\sbsv2htmlscanlog\sbsv2scanlog.pm \epoc32\tools\sbsv2scanlog.pm
+
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/commonbldutils/group/tools_commonbldutils.mrp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,26 @@
+#
+# 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:
+#
+
+component tools_commonbldutils
+
+source \sf\os\buildtools\bldsystemtools\commonbldutils\
+exports \sf\os\buildtools\bldsystemtools\commonbldutils\group
+
+ipr T
+
+notes_source \component_defs\release.src
+
+
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/commonbldutils/sbsv2htmlscanlog/sbsv2htmlscanlog.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,1367 @@
+# Copyright (c) 2003-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:
+#
+
+# summarise an automated build log
+use strict;
+use Getopt::Long;
+use HTML::Entities;
+use Carp;
+use File::stat;
+use FindBin; # for FindBin::Bin
+
+# Add the directory contain this perl script into the path to find modules
+use lib $FindBin::Bin;
+use sbsv2scanlog;
+
+# For Date calculations
+use lib "$FindBin::Bin/../lib"; # For running in source
+use lib "$FindBin::Bin/build/lib"; # For running in epoc32\tools
+
+use XML::Parser;
+
+# Variables
+my $line;
+my $iSlurp;
+my %Components;
+my %Commands;
+my $component;
+my $command;
+my %errors;
+my %warnings;
+my %remarks;
+my %migrationNotes;
+my %AdvisoryNotes;
+my %CmdErrors;
+my %CmdWarnings;
+my %CmdRemarks;
+my %CmdMigrationNotes;
+my %CmdAdvisoryNotes;
+my %missing;
+my %not_built;
+my $starttime;
+my $duration;
+my $currentfiletime;
+my $warningcount;
+my $errorcount;
+my $remarkcount;
+my $migrationNoteCount;
+my $AdvisoryNoteCount;
+my ($iStatus, $iName);
+my $warningmigrated;
+my %htmlColours=(
+"errors" =>"#ff0000",
+"warnings" =>"#fff000",
+"remarks" =>"#ffccff",
+"migrationNotes" =>"#ffcc99",
+"AdvisoryNotes" => "#ffa500"
+);
+my $MigrateNextExitCode = 0;
+my $inRecipe = 0;
+my $RetryInProgress = 0;
+
+# Package variables - these can also be accessed the from package "SubHandlers"
+use vars qw($component $command %Components %Commands);
+our $iLog;
+
+my $Dsec;
+
+# Main section
+
+my ($iOutput, $iTitle, $iVerbose, @iLogs) =&ProcessCommandLine();
+
+# Open Output file
+ open (HTML, ">$iOutput") or die "Couldn't open $iOutput for writing: $!\n";
+
+
+# Parse each log File
+foreach $iLog (@iLogs) # parses through all logs
+{
+ # Check the log file exists
+ if (-e $iLog)
+ {
+ # Process the logs
+ &ProcessLog();
+ } else {
+ print "WARNING: $iLog does not exist\n";
+ }
+
+
+}
+
+&PrintResults($iTitle);
+
+# Print HTML Footer
+&PrintHTMLFooter();
+
+
+# ProcessLog
+#
+# Inputs
+# $iLog - Logfile name
+#
+# Outputs
+#
+# Description
+# This function processes the commandline
+sub ProcessLog()
+{
+ #Clear current file time as starting processing a new log
+ $currentfiletime = 0;
+
+ print "Processing: $iLog\n";
+
+ my $iParser = XML::Parser->new(Style => 'Subs', Pkg => 'MySubs' , ErrorContext => 2,
+ Handlers => {Char => \&char_handler});
+
+ # Supply the XML Parser the data source
+ eval {
+ $iParser->parsefile($iLog);
+ };
+
+ #Set current component and command to special values to record log processing errors/warnings/etc
+ $component = 'sbsv2scanlog';
+ $command = 'sbsv2scanlog';
+
+ #Check for parse errors
+ if ($@)
+ {
+ #Generate error in log as the file time stamps are duff
+ &do_error($iLog, "No_linenumer", "XML Parse error:$@");
+ $Components{$component} = '0';
+ $Commands{$command} ='0';
+ }
+
+ # Calculate the Total Duration
+ # $currentfiletime is set from the info tags at the end of the log.
+ $duration += $currentfiletime;
+
+ #Clear current component and command
+ $component = '';
+ $command = '';
+}
+
+
+# PrintResults
+#
+# Inputs
+# $iTitle (Title for Log file)
+#
+# Outputs
+#
+# Description
+# This function prints all the data as HTML
+sub PrintResults
+{
+ my ($iTitle) = @_;
+
+ my $title;
+
+ # Print Heading of Log File
+ my $heading ="Overall";
+ print HTML qq{<h1>$iTitle</h1>\n};
+ print HTML qq{<h2>$heading</h2>\n};
+
+ # Calculate the total number of remarks messages
+ $remarkcount = 0;
+ foreach $component (sort {lc $a cmp lc $b} keys %remarks)
+ {
+ $remarkcount += scalar(@{$remarks{$component}});
+ }
+ # Calculate the Total number of errors
+ $errorcount = 0;
+ foreach $component (sort {lc $a cmp lc $b} keys %errors)
+ {
+ $errorcount += scalar(@{$errors{$component}});
+ }
+ # Calculate the total number of warnings
+ $warningcount = 0;
+ foreach $component (sort {lc $a cmp lc $b} keys %warnings)
+ {
+ $warningcount += scalar(@{$warnings{$component}});
+ }
+
+ # Calculate the total number of migration notes
+ $migrationNoteCount=0;
+ foreach $component (sort {lc $a cmp lc $b} keys %migrationNotes)
+ {
+ $migrationNoteCount += scalar(@{$migrationNotes{$component}});
+ }
+
+ # Calculate the total number of Advisory notes
+ $AdvisoryNoteCount=0;
+ foreach $component (sort {lc $a cmp lc $b} keys %AdvisoryNotes)
+ {
+ $AdvisoryNoteCount += scalar(@{$AdvisoryNotes{$component}});
+ }
+
+ # Start the Table
+ &StartHTMLTable();
+
+ # Print the Totals
+ &HTMLTableRow($heading,"Total", $duration, $errorcount, $warningcount, $AdvisoryNoteCount, $remarkcount, $migrationNoteCount);
+
+ # End the Table
+ print HTML qq{</table>\n};
+
+
+
+ # By Component
+ print HTML qq{<h2>By Component</h2>\n};
+
+ # Start the Table
+ $title="Component";
+ &StartHTMLTable($title);
+
+ # Print the by Component Data
+ foreach $component (sort {lc $a cmp lc $b} keys %Components)
+ {
+ # Calculate the number errors and warnings
+ my $totalerrors;
+ my $totalwarnings;
+ my $totalremarks;
+ my $totalMigrationNotes;
+ my $totalAdvisoryNotes;
+ if (!defined $remarks{$component})
+ {
+ # No Remarks were recorded, set total to zero
+ $totalremarks = 0;
+ } else {
+ $totalremarks = scalar(@{$remarks{$component}});
+ }
+ if (!defined $errors{$component})
+ {
+ # No errors were recorded, set total to zero
+ $totalerrors = 0;
+ } else {
+ $totalerrors = scalar(@{$errors{$component}});
+ }
+ if (!defined $warnings{$component})
+ {
+ # No Warnings were recorded, set total to zero
+ $totalwarnings = 0;
+ } else {
+ $totalwarnings = scalar(@{$warnings{$component}});
+ }
+
+ if (!defined $migrationNotes{$component})
+ {
+ # No MigrationNotes were recorded, set total to zero
+ $totalMigrationNotes=0;
+ }
+ else
+ {
+ $totalMigrationNotes = scalar(@{$migrationNotes{$component}});
+ }
+
+ if (!defined $AdvisoryNotes{$component})
+ {
+ # No AdvisoryNotes were recorded, set total to zero
+ $totalAdvisoryNotes=0;
+ }
+ else
+ {
+ $totalAdvisoryNotes = scalar(@{$AdvisoryNotes{$component}});
+ }
+
+
+
+ # Print the Table Row
+ &HTMLTableRow($title,$component, $Components{$component}, $totalerrors, $totalwarnings, $totalAdvisoryNotes,$totalremarks, $totalMigrationNotes);
+
+ }
+
+ # End the Table
+ print HTML qq{</table>\n};
+
+ # By Command
+ print HTML qq{<h2>By Command</h2>\n};
+
+ # Start the Table
+ $title="Command";
+ &StartHTMLTable($title);
+
+ # Print the by Command Data
+ foreach $command (sort {lc $a cmp lc $b} keys %Commands)
+ {
+ # Calculate the number errors, warnings and remarks
+ my $totalerrors;
+ my $totalwarnings;
+ my $totalremarks;
+ my $totalMigrationNotes;
+ my $totalAdvisoryNotes;
+ if (!defined $CmdRemarks{$command})
+ {
+ # No Remarks were recorded, set total to zero
+ $totalremarks = 0;
+ } else {
+ $totalremarks = scalar(@{$CmdRemarks{$command}});
+ }
+ if (!defined $CmdErrors{$command})
+ {
+ # No errors were recorded, set total to zero
+ $totalerrors = 0;
+ } else {
+ $totalerrors = scalar(@{$CmdErrors{$command}});
+ }
+ if (!defined $CmdWarnings{$command})
+ {
+ # No Warnings were recorded, set total to zero
+ $totalwarnings = 0;
+ } else {
+ $totalwarnings = scalar(@{$CmdWarnings{$command}});
+ }
+
+ if (!defined $CmdMigrationNotes{$command})
+ {
+ # No MigrationNotes were recorded, set total to zero
+ $totalMigrationNotes=0;
+ }
+ else
+ {
+ $totalMigrationNotes = scalar(@{$CmdMigrationNotes{$command}});
+ }
+
+ if (!defined $CmdAdvisoryNotes{$command})
+ {
+ # No AdvisoryNotes were recorded, set total to zero
+ $totalAdvisoryNotes=0;
+ }
+ else
+ {
+ $totalAdvisoryNotes = scalar(@{$CmdAdvisoryNotes{$command}});
+ }
+
+ # Print the Table Row
+ &HTMLTableRow($title,$command, $Commands{$command}, $totalerrors, $totalwarnings, $totalAdvisoryNotes, $totalremarks, $totalMigrationNotes);
+ }
+
+
+ # End the Table
+ print HTML qq{</table>\n};
+
+ # Print Things Missing
+ if (scalar %missing)
+ {
+ my $count = scalar keys %missing;
+ print HTML qq{<h2>Things Missing ($count)</h2>\n};
+ print HTML "Don't know how to make...\n";
+ foreach my $file (sort {lc $a cmp lc $b} keys %missing)
+ {
+ printf HTML "%d\t%s</BR>\n", $missing{$file}, $file;
+ }
+ }
+ print HTML qq{</BR>\n};
+
+ # Print Things Not Built
+ if (scalar %not_built)
+ {
+ my $count = scalar keys %not_built;
+ print HTML qq{<h2>Things Not Built ($count)</h2>\n};
+ foreach my $file (sort {lc $a cmp lc $b} keys %not_built)
+ {
+ print HTML "MISSING: $file ($not_built{$file})</BR>\n";
+ }
+ }
+
+
+ # Print the Actual Errors by Component
+ if ($iVerbose > 0)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %errors))
+ {
+ print HTML qq{<h2><a name="errorsByOverall_Total">Error Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %errors)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$errors{$component}};
+ print HTML qq{<h3><a name="errorsByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$errors{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Warning by Component
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some warnings
+ if (scalar(keys %warnings))
+ {
+ print HTML qq{<h2><a name="warningsByOverall_Total">Warning Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %warnings)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$warnings{$component}};
+ print HTML qq{<h3><a name="warningsByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$warnings{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Advisory Notes by Component
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some warnings
+ if (scalar(keys %AdvisoryNotes))
+ {
+ print HTML qq{<h2><a name="AdvisoryNotesByOverall_Total">Advisory Note Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %AdvisoryNotes)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$AdvisoryNotes{$component}};
+ print HTML qq{<h3><a name="AdvisoryNotesByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$AdvisoryNotes{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Remarks by Component
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %remarks))
+ {
+ print HTML qq{<h2><a name="remarksByOverall_Total">Remarks Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %remarks)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$remarks{$component}};
+ print HTML qq{<h3><a name="remarksByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$remarks{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Migration Notes by Component
+if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some warnings
+ if (scalar(keys %migrationNotes))
+ {
+ print HTML qq{<h2><a name="migrationNotesByOverall_Total">Migration Note Details by Component</a></h2>\n};
+ foreach $component (sort {lc $a cmp lc $b} keys %migrationNotes)
+ {
+ my ($HTML) = $component;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ my $count = scalar @{$migrationNotes{$component}};
+ print HTML qq{<h3><a name="migrationNotesByComponent_$HTML">$HTML</a> ($count)</h3>\n};
+ foreach $line (@{$migrationNotes{$component}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Errors by Command
+ if ($iVerbose > 0)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %CmdErrors))
+ {
+ print HTML qq{<h2>Error Details by Command</h2>\n};
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdErrors)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="errorsByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdErrors{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Warning by Command
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some warnings
+ if (scalar(keys %CmdWarnings))
+ {
+ print HTML qq{<h2>Warning Details by Command</h2>\n};
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdWarnings)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="warningsByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdWarnings{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Advisory Notes by Command
+ if ($iVerbose >1)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %CmdAdvisoryNotes))
+ {
+ print HTML qq{<h2>Advisory Note Details by Command</h2>\n};
+
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdAdvisoryNotes)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="AdvisoryNotesByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdAdvisoryNotes{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n}
+ }
+ }
+ }
+
+ # Print the Actual Remarks by Command
+ if ($iVerbose > 1)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %CmdRemarks))
+ {
+ print HTML qq{<h2>Remarks Details by Command</h2>\n};
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdRemarks)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="remarksByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdRemarks{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n};
+ }
+ }
+ }
+
+ # Print the Actual Migration Notes by Command
+ if ($iVerbose >1)
+ {
+ # Only Print the header if there are some errors
+ if (scalar(keys %CmdMigrationNotes))
+ {
+ print HTML qq{<h2>Migration Note Details by Command</h2>\n};
+
+ foreach $command (sort {lc $a cmp lc $b} keys %CmdMigrationNotes)
+ {
+ my ($HTML) = $command;
+ $HTML =~ s/\s+$//;
+ encode_entities($HTML);
+ print HTML qq{<h3><a name="migrationNotesByCommand_$HTML">$HTML</a></h3>\n};
+ foreach $line (@{$CmdMigrationNotes{$command}})
+ {
+ encode_entities($line);
+ print HTML $line.qq{</BR>};
+ }
+ print HTML qq{</BR>\n}
+ }
+ }
+ }
+
+
+}
+
+
+# StartHTMLTable
+#
+# Inputs
+# $iC1Title (Column 1 Title)
+#
+# Outputs
+#
+# Description
+# This function prints the start of the HTML Table
+sub StartHTMLTable
+{
+ my ($iC1Title) = @_;
+
+ if ($iC1Title eq '')
+ {
+ $iC1Title = " ";
+ } else {
+ encode_entities($iC1Title);
+ }
+
+ # Start the Table
+ print HTML qq{<table border="1" cellpadding="0" cellspacing="0" width="100%">\n};
+
+ # Print the Header Row
+ print HTML qq{<tr>\n};
+ print HTML qq{\t<th width="50%">$iC1Title</th>\n};
+ print HTML qq{\t<th width="15%">Time</th>\n};
+ print HTML qq{\t<th width="8%">Errors</th>\n};
+ print HTML qq{\t<th width="8%">Warnings</th>\n};
+ print HTML qq{\t<th width="8%">Advisory Notes</th>\n};
+ print HTML qq{\t<th width="8%">Remarks</th>\n};
+ print HTML qq{\t<th width="8%">Migration Notes</th>\n};
+
+ print HTML qq{</tr>\n};
+}
+
+# HTMLTableCell
+#
+# Inputs
+# $iType (errors,warnings,remarks,migration_notes)
+# $iCount (number of errors)
+# $iLink (empty string or linktype)
+#
+# Outputs
+# Returns HTML table data element with appropriate link & background color
+#
+# Description
+# Constructs HTML table element - used by HTMLTableRow to handle the formatting
+# of the data cells, complete with colouring and links where appropriate.
+sub HTMLTableCell
+{
+ my ($iType,$iCount,$iLink)= @_;
+ my $td = qq{td width="8%" align="center"}; # implied by the TH elements already?
+ if ($iCount != 0)
+ {
+ $td = "$td BGCOLOR=$htmlColours{$iType}";
+ }
+ if ($iLink eq "" || $iCount == 0)
+ {
+ return qq{<$td>$iCount</td>};
+ }
+ $iLink = $iType."By".$iLink;
+ return qq{<$td><a href="#$iLink">$iCount</a></td>};
+}
+
+# HTMLTableRow
+#
+# Inputs
+# $iTitle (Need to differentiate between command and component to provide correct anchors)
+# $iC1Data(Column 1 Data)
+# $iC2Data(Column 2 Data) (Time in seconds)
+# $iC3Data(Column 3 Data) (Number of errors)
+# $iC4Data(Column 4 Data) (Number of warnings)
+# $iC5Data(Column 5 Data) (Number of Advisory notes )
+# $iC6Data(Column 6 Data) (Number of remarks )
+# $iC7Data(Column 7 Data) (Number of migration notes )
+#
+# Outputs
+#
+# Description
+# This function prints a line of the HTML Table
+sub HTMLTableRow
+{
+ my ($iTitle,$iC1Data, $iC2Data, $iC3Data, $iC4Data,$iC5Data, $iC6Data, $iC7Data) = @_;
+
+ #print "$iC2Data\n";
+
+ # Convert the seconds in hh:mm:ss format
+ $iC2Data = &ConvertSeconds($iC2Data);
+
+ # HTML encode the text
+ encode_entities($iC1Data);
+ encode_entities($iC2Data);
+ encode_entities($iC3Data);
+ encode_entities($iC4Data);
+ encode_entities($iC5Data);
+ encode_entities($iC6Data);
+ encode_entities($iC7Data);
+
+ my $linkname = "$iTitle"."_"."$iC1Data";
+
+ # Print the Row, including summary in a script comment
+ print HTML qq{<tr>\n};
+ print HTML qq{<!--\t$linkname\t$iC2Data\t$iC3Data\t$iC4Data\t$iC5Data\t$iC6Data\t$iC7Data\t-->\n};
+ print HTML qq{\t<td width="50%">$iC1Data</td>\n};
+ print HTML qq{\t<td width="15%" align="center">$iC2Data</td>\n};
+
+ print HTML "\t",&HTMLTableCell("errors", $iC3Data,$linkname),"\n";
+ print HTML "\t",&HTMLTableCell("warnings",$iC4Data,$linkname),"\n";
+ print HTML "\t",&HTMLTableCell("AdvisoryNotes", $iC5Data,$linkname),"\n";
+ print HTML "\t",&HTMLTableCell("remarks", $iC6Data,$linkname),"\n";
+ print HTML "\t",&HTMLTableCell("migrationNotes", $iC7Data,$linkname),"\n";
+
+
+ print HTML qq{</tr>\n};
+}
+
+# ConvertSeconds
+#
+# Inputs
+# $iSeconds
+#
+# Outputs
+# $iString (seconds in hh:mm:ss)
+#
+# Description
+# This function processes the commandline
+sub ConvertSeconds
+{
+ my ($iSeconds) = @_;
+
+ my ($iString);
+ my ($ih) = int($iSeconds/3600);
+ my ($im) = int(($iSeconds-($ih*3600))/60);
+ my ($is) = $iSeconds-($ih*3600)-($im*60);
+ # Print the correct format if the data is HiRes (has a decimal point in the string)
+ if ($is =~ /\d+\.\d+/)
+ {
+ $iString = sprintf "%d:%02d:%06.3f", $ih, $im, $is;
+ } else {
+ $iString = sprintf "%d:%02d:%02d", $ih, $im, $is;
+ }
+ return $iString;
+}
+
+# ProcessCommandLine
+#
+# Inputs
+#
+# Outputs
+# $iOutput (Output filename)
+# $iVerbose (Verbose Level)
+# $iLogs (Log files to process)
+#
+# Description
+# This function processes the commandline
+
+sub ProcessCommandLine {
+ my ($iHelp, @iLogs, $iOutput, $iTitle, $iVerbose);
+ GetOptions('h' => \$iHelp, 'l=s' =>\@iLogs, 'o=s' => \$iOutput, 't=s' => \$iTitle, 'v+' => \$iVerbose);
+
+ if (($iHelp) || (!defined @iLogs) || (!defined $iOutput))
+ {
+ Usage();
+ } elsif (-e $iOutput) {
+ die "$iOutput already exists";
+ }
+
+ foreach my $iLog (@iLogs)
+ {
+ warn "$iLog does not exist" if (! -e $iLog);
+ }
+
+ # Set default title
+ if ($iTitle eq '')
+ {
+ $iTitle = "Log File Summary";
+ }
+
+ return($iOutput, $iTitle, $iVerbose, @iLogs);
+}
+
+# Usage
+#
+# Output Usage Information.
+#
+
+sub Usage {
+ print <<USAGE_EOF;
+
+ Usage: Scanlog.pl [options]
+
+ options:
+
+ -h help
+ -l Log file to scan [Multiple allowed]
+ -o Output file
+ -v Increments Verbose level [Maximum Level = 2]
+ -t Title to add to the Summary
+
+USAGE_EOF
+ exit 1;
+}
+
+# PrintHTMLHeader
+#
+# Inputs
+# $iTitle (Title for Log file)
+#
+# Outputs
+#
+# Description
+# This function print the HTML Header
+
+sub PrintHTMLHeader {
+ my ($iTitle) = @_;
+
+ print HTML <<HTML_EOF;
+<HTML>
+<HEAD>
+<TITLE>$iTitle</TITLE>
+</HEAD>
+<BODY BGCOLOR="FFFFFF">
+<FONT FACE="Courier New">
+HTML_EOF
+}
+
+# PrintHTMLFooter
+#
+# Inputs
+#
+# Outputs
+#
+# Description
+# This function print the HTML Footer
+
+sub PrintHTMLFooter {
+ print HTML <<HTML_EOF;
+</FONT>
+</BODY>
+</HTML>
+HTML_EOF
+}
+
+sub do_remarks()
+{
+ my ($iLog, $iLineNumber, $line)= @_;
+ # Store remarks by Command
+ if (!defined $CmdRemarks{$command})
+ {
+ $CmdRemarks{$command} = ();
+ }
+ push @{$CmdRemarks{$command}}, "$iLog:$iLineNumber>$line";
+
+ # Store remarks by Component
+ if (!defined $remarks{$component})
+ {
+ $remarks{$component} = ();
+ }
+ push @{$remarks{$component}}, "$iLog:$iLineNumber>$line";
+}
+
+sub do_warning()
+{
+ my ($iLog, $iLineNumber, $line)= @_;
+ # Store warning by Command
+ if (!defined $CmdWarnings{$command})
+ {
+ $CmdWarnings{$command} = ();
+ }
+ push @{$CmdWarnings{$command}}, "$iLog:$iLineNumber>$line";
+
+ # Store warning by Component
+ if (!defined $warnings{$component})
+ {
+ $warnings{$component} = ();
+ }
+ push @{$warnings{$component}}, "$iLog:$iLineNumber>$line";
+}
+
+
+sub do_migrationNotes()
+ {
+ my ($iLog, $iLineNumber, $line)= @_;
+ # Store Migration Notes by command
+ if (!defined $CmdMigrationNotes{$command})
+ {
+ $CmdMigrationNotes{$command} = ();
+ }
+ push @{$CmdMigrationNotes{$command}}, "$iLog:$iLineNumber>$line";
+
+ # Store Migration Notes by Component
+ if (!defined $migrationNotes{$component})
+ {
+ $migrationNotes{$component} = ();
+ }
+ push @{$migrationNotes{$component}}, "$iLog:$iLineNumber>$line";
+
+ }
+
+sub do_AdvisoryNotes()
+ {
+ my ($iLog, $iLineNumber, $line)= @_;
+ # Store Advisory Notes by command
+ if (!defined $CmdAdvisoryNotes{$command})
+ {
+ $CmdAdvisoryNotes{$command} = ();
+ }
+ push @{$CmdAdvisoryNotes{$command}}, "$iLog:$iLineNumber>$line";
+
+ # Store Advisory Notes by Component
+ if (!defined $AdvisoryNotes{$component})
+ {
+ $AdvisoryNotes{$component} = ();
+ }
+ push @{$AdvisoryNotes{$component}}, "$iLog:$iLineNumber>$line";
+
+}
+
+
+sub do_error()
+{
+ my ($iLog, $iLineNumber, $line)= @_;
+ # Store Errors by Command
+ if (!defined $CmdErrors{$command})
+ {
+ $CmdErrors{$command} = ();
+ }
+ push @{$CmdErrors{$command}}, "$iLog:$iLineNumber>$line";
+
+ # Store Errors by Component
+ if (!defined $errors{$component})
+ {
+ $errors{$component} = ();
+ }
+ push @{$errors{$component}}, "$iLog:$iLineNumber>$line";
+}
+
+# Read a number of lines in the log ignoreing the content
+sub do_slurp()
+{
+ my ($num_lines) =@_;
+ for (my $i = 0; $i < $num_lines; $i++)
+ {
+ ;
+ }
+}
+
+sub char_handler
+{
+ my ($iExpat, $data) = @_;
+ my ($iStatus);
+
+ # Now Buffer it up for context data
+ $iExpat->{cdata_buffer} .= $data;
+
+ #Delay parsing until end of line is found or close xml tag or end of recipe
+ return if ($inRecipe);
+ if (!($data =~ /\n$/))
+ {
+ #Put in the line buffer until the rest of the line comes in or an element end causes a parseline call
+ $iExpat->{line_buffer} .= $data;
+ return;
+ } else {
+ #line ends in a \n
+ #Add the $data to buffer(normally empty) and parse
+ &parseline($iExpat,$iExpat->{line_buffer}.$data);
+ #Empty the line buffer
+ $iExpat->{line_buffer} ='';
+ }
+}
+
+sub parseline
+{
+ my ($iExpat, $data,$iLineNumber) = @_;
+ if (!($iLineNumber =~ /\d+/))
+ {
+ #If no linenumber is passed the set to the current line in the parse
+ $iLineNumber = $iExpat->current_line;
+ }
+ my $CheckForComponentExitCodesToMigrate = 0;
+
+ #Set some defaults if $component and $command are empty
+ if ($component eq '')
+ {
+ $component = "anonymous component";
+ $Components{$component} = '0';
+
+ }
+ if ($command eq '')
+ {
+ $command = "anonymous command";
+ $Commands{$command} ='0';
+ }
+
+ # Lines to Ignore
+ $iStatus =&sbsv2scanlog::CheckForIgnore($data);
+ if($iStatus)
+ {
+ return;
+ }
+
+ # AdvisoryNotes
+ ($iStatus) =&sbsv2scanlog::CheckForAdvisoryNotes($data);
+ if ($iStatus)
+ {
+ if ($RetryInProgress)
+ {
+ #A retry is in progress so downgrade to a remark
+ &do_remarks($iLog, $iLineNumber, $data);
+ return;
+ } else {
+ &do_AdvisoryNotes($iLog, $iLineNumber, $data);
+ return;
+ }
+ }
+
+
+ #CheckForComponentExitCodesToMigrate
+ $CheckForComponentExitCodesToMigrate = &sbsv2scanlog::CheckForComponentExitCodesToMigrate($data,$component);
+ if ($CheckForComponentExitCodesToMigrate )
+ {
+ $MigrateNextExitCode = 1;
+ }
+
+ # Migration Notes
+ $iStatus = &sbsv2scanlog::CheckForMigrationNotes($data,$component);
+ if ($iStatus)
+ {
+ if ($RetryInProgress)
+ {
+ #A retry is in progress so downgrade to a remark
+ &do_remarks($iLog, $iLineNumber, $data);
+ return;
+ } else {
+ &do_migrationNotes($iLog, $iLineNumber, $data);
+ #Setup global $warningmigrated flag so warning_ function can ignore the warning element that this migration note was in
+ $warningmigrated = 1;
+ return;
+ }
+ }
+
+ # Remarks
+ ($iStatus) =&sbsv2scanlog::CheckForRemarks($data);
+ if ($iStatus)
+ {
+ &do_remarks($iLog, $iLineNumber, $data);
+ return;
+ }
+
+ # Errors
+ ($iStatus) =&sbsv2scanlog::CheckForErrors($data);
+ if ($iStatus)
+ {
+ if ($RetryInProgress)
+ {
+ #A retry is in progress so downgrade to a remark
+ &do_remarks($iLog, $iLineNumber, $data);
+ return;
+ } else {
+ &do_error($iLog, $iLineNumber, $data);
+ return;
+ }
+ }
+
+
+ # Warnings
+ ($iStatus) =&sbsv2scanlog::CheckForWarnings($data);
+ if ($iStatus)
+ {
+ if ($RetryInProgress)
+ {
+ #A retry is in progress so downgrade to a remark
+ &do_remarks($iLog, $iLineNumber, $data);
+ return;
+ } else {
+ &do_warning($iLog, $iLineNumber, $data);
+ return;
+ }
+ }
+ return;
+}
+
+{
+ package MySubs;
+ # recipe
+ #
+ # Inputs
+ #
+ # Outputs
+ #
+ # Description
+ # This function handles the recipe tag in the XML
+ sub recipe
+ {
+ my $iExpat = shift; my $iElement = shift;
+
+ #empty cdata buffer
+ $iExpat->{cdata_buffer} = '';
+
+ #Set global flag to change char data handling to the end of the recipe
+ #So that errors/warnings/migration notes can be down grade to remarks
+ #if a retry is signalled
+ $inRecipe = 1;
+
+ my (%iAttr);
+
+ # Read the attributes
+ while (@_) {
+ my $iAtt = shift;
+ my $iVal = shift;
+ $iAttr{$iAtt} = $iVal;
+ }
+
+ #print "recipe name =".$iAttr{'name'}."\n";
+ if ($iAttr{'component'} ne '')
+ {
+ $component = $iAttr{'component'};
+ } else {
+ #Try using the bld.inf as unique component identifier
+ $component = $iAttr{'bldinf'};
+ }
+
+ $command = $iAttr{'name'}." ".$iAttr{'platform'};
+ }
+
+ sub recipe_
+ {
+ my $iExpat = shift;
+
+ #Handle all recipe text that was inside this element
+
+ #Split the multiline cdata_buffer in to single lines
+ my @lines = split /\n/,$iExpat->{cdata_buffer};
+ for (my $buffnum = 0 ; $buffnum < scalar (@lines); $buffnum++)
+ {
+ #Parse each line
+
+ #Calculate the actual line number subtracking status and time element lines (2) and position in array from end
+ my $linenum = ($iExpat->current_line) - 2 - (scalar (@lines) - $buffnum);
+ &main::parseline($iExpat, $lines[$buffnum],$linenum);
+ }
+
+ #Clear $inRecipe flag
+ $inRecipe = 0;
+
+ #Clear $RetryInProgress flag as a retry cannot out live a recipe
+ $RetryInProgress = 0;
+
+ #Clear all data set by recipe start
+ $component = '';
+ $command = '';
+
+ #empty cdata buffer
+ $iExpat->{cdata_buffer} = '';
+ }
+
+ sub time
+ {
+ my $iExpat = shift; my $iElement = shift;
+
+ my (%iAttr);
+
+ # Read the attributes
+ while (@_) {
+ my $iAtt = shift;
+ my $iVal = shift;
+ $iAttr{$iAtt} = $iVal;
+ }
+
+ #Elapsed time and Total up for Command
+ $Commands{$command} += $iAttr{'elapsed'};
+ #Elapsed time and Total up for Component
+ $Components{$component} += $iAttr{'elapsed'};
+ }
+
+ sub time_
+ {
+ #Do nothing
+ }
+
+ sub info
+ {
+ my $iExpat = shift; my $iElement = shift;
+ #empty cdata buffer
+ $iExpat->{cdata_buffer} = '';
+
+ $component = 'SBS: Info';
+ $command = 'SBS: Info';
+ $Components{$component} = '0';
+ $Commands{$command} ='0';
+ }
+
+ sub info_
+ {
+ my $iExpat = shift; my $iElement = shift;
+
+ #Handle any unhandle text that was inside this element
+ if ($iExpat->{line_buffer} =~ /.+/)
+ {
+ &main::parseline($iExpat, $iExpat->{line_buffer});
+ $iExpat->{line_buffer} ='';
+ }
+
+ #Clear all data set by info start
+ $component = '';
+ $command = '';
+ if ($iExpat->{cdata_buffer} =~ /Run time (.*?) seconds/)
+ {
+ ($currentfiletime) =$1;
+ }
+
+ #empty cdata buffer
+ $iExpat->{cdata_buffer} = '';
+ }
+
+ sub warning
+ {
+ my $iExpat = shift; my $iElement = shift;
+ #empty cdata buffer
+ $iExpat->{cdata_buffer} = '';
+ #reset $warningmigrated flag
+ $warningmigrated = 0;
+
+ $component = 'SBS: Warning';
+ $command = 'SBS: Warning';
+ $Components{$component} = '0';
+ $Commands{$command} ='0';
+ }
+
+ sub warning_
+ {
+ my $iExpat = shift; my $iElement = shift;
+
+ #Handle any unhandle text that was inside this element
+ if ($iExpat->{line_buffer} =~ /.+/)
+ {
+ &main::parseline($iExpat, $iExpat->{line_buffer});
+ $iExpat->{line_buffer} ='';
+ }
+
+ my ($iLineNumber) = $iExpat->current_line;
+
+ if ($warningmigrated != 1)
+ {
+ #Record error in its own right for the error xml element
+ &main::do_warning($iLog, $iLineNumber, $iExpat->{cdata_buffer});
+ }
+
+ #Clear all data set by info start
+ $component = '';
+ $command = '';
+
+ #empty cdata buffer
+ $iExpat->{cdata_buffer} = '';
+ }
+
+ sub error
+ {
+ my $iExpat = shift; my $iElement = shift;
+ #empty cdata buffer
+ $iExpat->{cdata_buffer} = '';
+
+ #Set generic component and command names so that these don't get allocated to a empty component
+ $component = 'SBS: Error';
+ $command = 'SBS: Error';
+ $Components{$component} = '0';
+ $Commands{$command} ='0';
+ }
+
+ sub error_
+ {
+ my $iExpat = shift; my $iElement = shift;
+
+ #Handle any unhandle text that was inside this element
+ if ($iExpat->{line_buffer} =~ /.+/)
+ {
+ &main::parseline($iExpat, $iExpat->{line_buffer});
+ $iExpat->{line_buffer} ='';
+ }
+
+ my ($iLineNumber) = $iExpat->current_line;
+
+ #Record error in its own right for the error xml element
+ &main::do_error($iLog, $iLineNumber, $iExpat->{cdata_buffer});
+
+ #Clear all data set by info start
+ $component = '';
+ $command = '';
+
+ #empty cdata buffer
+ $iExpat->{cdata_buffer} = '';
+ }
+
+ sub status
+ {
+ my $iExpat = shift; my $iElement = shift;
+
+ my (%iAttr);
+
+ # Read the attributes
+ while (@_) {
+ my $iAtt = shift;
+ my $iVal = shift;
+ $iAttr{$iAtt} = $iVal;
+ }
+
+ my ($iLineNumber) = $iExpat->current_line;
+
+ if ($iAttr{'exit'} eq 'retry')
+ {
+ $RetryInProgress = 1;
+ #Record retry as a remark
+ &main::do_remarks($iLog, $iLineNumber, "$component retried on $command with ".$iAttr{'code'});
+ return;
+ } elsif ($iAttr{'exit'} ne 'ok') {
+ #Record as migration note for non ok exit because a previous line has triggered this flag
+ if ($MigrateNextExitCode)
+ {
+ &main::do_migrationNotes($iLog, $iLineNumber, "$component failed on $command with ".$iAttr{'code'});
+ } else {
+ #Record error in its own right for the non 'ok' exit status
+ &main::do_error($iLog, $iLineNumber, "$component failed on $command with ".$iAttr{'code'});
+ }
+ }
+
+ #Resest the Migrate exit code flag because a previous line has triggered this flag
+ $MigrateNextExitCode =0;
+ }
+
+ sub status_
+ {
+ my $iExpat = shift; my $iElement = shift;
+ # Nothing to do
+ }
+
+ sub debug
+ {
+ my $iExpat = shift; my $iElement = shift;
+ # Nothing to do
+ }
+
+ sub debug_
+ {
+ my $iExpat = shift; my $iElement = shift;
+ # Nothing to do
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/commonbldutils/sbsv2htmlscanlog/sbsv2scanlog.pm Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,320 @@
+#!perl -w
+# Copyright (c) 2003-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:
+# summarise an automated build log
+# documentation available in generic\tools\e32toolp\docs\scanlog.txt
+# please update the documentation when modifying this file
+#
+#
+
+package sbsv2scanlog;
+
+use strict;
+use Carp;
+use FindBin; # for FindBin::Bin
+
+use lib "$FindBin::Bin/../../tools/build/scanlog"; # For running in source
+use lib "$FindBin::Bin"; # For running in \tools
+
+use Scanlog;
+
+# CheckForErrors
+#
+# Inputs
+# $line - Line of text to check
+#
+# Outputs
+# Return true for presence of error in the line
+# Return false for no error found
+#
+# Description
+# This function matches the input against a known set of Error Strings
+sub CheckForErrors
+{
+ my ($line) = @_;
+
+
+ # Check Original scanlog rules
+ return &Scanlog::CheckForErrors($line);
+
+ # Not already returned so return false
+ return 0;
+}
+
+# CheckForRemarks
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Warning in the line according to the warning codes
+# defined in the checkList array
+# The list is the current known EABI warnings which are considered to be
+# Remarks
+# Return false for no Warning found
+#
+# Description
+# This function matches the input against a known set of Warning Strings defined
+# in the array CheckList
+sub CheckForRemarks
+{
+ my ($line) = @_;
+
+ #/sf/app/messaging/email/pop3andsmtpmtm/clientmtms/group/imcm.rls:36:54: warning: no newline at end of file
+ if ($line =~ /:\d+:\d+: warning: no newline at end of file/)
+ {
+ return 1;
+ }
+
+ # Check Original scanlog rules
+ return &Scanlog::CheckForRemarks($line);
+
+
+ # Not already returned so return false
+ return 0;
+
+}
+
+# CheckForWarnings
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Warning in the line
+# Return false for no Warning found
+#
+# Description
+# This function matches the input against a known set of Warning Strings
+sub CheckForWarnings
+{
+ my ($line) = @_;
+
+ # Check Original scanlog rules
+ return &Scanlog::CheckForWarnings($line);
+
+ # Not already returned so return false
+ return 0;
+}
+
+# CheckForIgnore
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true if line can be ignored
+# Return false if line cannot be ignored
+#
+# Description
+# This function matches the input against a known set of Warning Strings which can be ignored
+sub CheckForIgnore
+{
+ my ($line) = @_;
+
+ # Check Original scanlog rules
+ return &Scanlog::CheckForIgnore($line);
+
+ # Not already returned so return false
+ return 0;
+}
+
+
+
+
+# CheckForNotBuilt
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Warning in the line
+# Return false for no Warning found
+# $iNotBuilt - Name of thing not built
+#
+# Description
+# This function matches the input against a known set of Strings for things not built
+sub CheckForNotBuilt
+{
+ my ($line) = @_;
+
+ # Check Original scanlog rules
+ return &Scanlog::CheckForNotBuilt($line);
+
+ # Not already returned so return false
+ return 0;
+}
+
+# CheckForMissing
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Warning in the line
+# Return false for no Warning found
+# $iNotBuilt - Name of thing not built
+#
+# Description
+# This function matches the input against a known set of Strings for things not built
+sub CheckForMissing
+{
+ my ($line) = @_;
+
+ # Check Original scanlog rules
+ return &Scanlog::CheckForMissing($line);
+
+ # Not already returned so return false
+ return 0;
+}
+
+# CheckForRealTimeErrors
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of a Real Time Error in the line
+# plus string detailing error (if available)
+# Return false for no Real Time Error found
+#
+# Description
+# This function matches the input against a known set of Error Strings
+# At the time of adding this subroutine, such error strings were only reported by P4GetSource.pm
+# Scripts calling this subroutine should note that, for example, lines beginning with "ERROR:" will
+# also be considered to be errors by subroutine CheckForErrors, above.
+sub CheckForRealTimeErrors
+{
+ my ($line) = @_;
+
+ # Check Original scanlog rules
+ return &Scanlog::CheckForRealTimeErrors($line);
+
+ # Not already returned so return False
+ return 0;
+}
+
+
+
+# CheckForMigrationNotes
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true for presence of Migration_Note in the line
+# Return false for no Migration_Note found
+#
+# Description
+# This function matches the input against a known set of Migration_Note Strings
+sub CheckForMigrationNotes
+{
+ my ($line,$component) = @_;
+
+ if ($component =~ /STLPORT/i)
+ {
+ # ../../src/iostream.cpp:164: warning: 'result' might be used uninitialized in this function
+ if ($line =~ /:\d+: warning:.*?might be used uninitialized in this function/)
+ {
+ return 1;
+ }
+ }
+
+ #cpp: file.h:48:8: warning: extra tokens at end of #endif directive
+ if ($line =~ /:\d+:\d+: warning: extra tokens at end of #endif directive/)
+ {
+ return 1;
+ }
+
+ #raptor/lib/flm/export.flm:56: warning: overriding commands for target `S:/epoc32/rom/include/midp20_installer.iby'
+ if ($line =~ /:\d+: warning: overriding commands for target/)
+ {
+ return 1;
+ }
+
+ #raptor/lib/flm/export.flm:56: warning: ignoring old commands for target `S:/epoc32/rom/include/midp20_installer.iby'
+ if ($line =~ /:\d+: warning: ignoring old commands for target/)
+ {
+ return 1;
+ }
+
+ #\sf\app\techview\techviewplat\techviewuiklaf\resource\eikcoctl.rls(38) : Warning: (003) rls item redefined.
+ if ($line =~ /\(\d+\)\s+: Warning: (003) rls item redefined/)
+ {
+ return 1;
+ }
+
+ # Check Original scanlog rules
+ return &Scanlog::CheckForMigrationNotes($line);
+
+ # Not already returned so return False
+ return 0;
+}
+
+# CheckForComponentExitCodesToMigrate
+#
+# Inputs
+# $iLine - Line of text to check
+# $component - Current Component
+#
+# Outputs
+# Return true for to ignore this special component error
+# Return false for to not ignore this special component error
+#
+# Description
+# This function matches the input against a known set of Components and Strings to ignore the later non zero exit code of.
+sub CheckForComponentExitCodesToMigrate
+{
+ my ($line,$component) = @_;
+
+ if ($component =~ /Integrator ARM1136 Core Module/ || $component =~ /OMAP H2 BSP|omaph2bsp/ )
+ {
+ # M://epoc32/tools/makefile_templates/base/bootstrap.mk:213: *** missing `endef', unterminated `define'. Stop.
+ # if ($line =~ /\/epoc32\/tools\/makefile_templates\/base\/bootstrap\.mk:\d+: \*\*\* missing `endef', unterminated `define'\. Stop\./)
+ if ($line =~ /\/epoc32\/tools\/makefile_templates\/base\/bootstrap\.mk:\d+: \*\*\* multiple target patterns\. Stop\./)
+ {
+ return 1;
+ }
+ #/bin/sh: make: command not found
+ if ($line =~ /\/bin\/sh: make: command not found/)
+ {
+ return 1;
+ }
+ } else {
+ return 0;
+ }
+}
+
+# CheckForAdvisoryNotes
+#
+# Inputs
+# $iLine - Line of text to check
+#
+# Outputs
+# Return true if line can be ignored
+# Return false if line cannot be ignored
+#
+# Description
+# This function matches the input against a known set of Strings
+sub CheckForAdvisoryNotes
+{
+ my ($line) = @_;
+
+ # Check Original scanlog rules
+ return &Scanlog::CheckForAdvisoryNotes($line);
+
+ # Not already returned so return false
+ return 0;
+}
+1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/group/bld.inf Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,26 @@
+// 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:
+//
+
+PRJ_PLATFORMS
+TOOLS
+
+PRJ_EXPORTS
+..\perl\epoc.bat \epoc32\tools\epoc.bat
+..\perl\epoc.pl \epoc32\tools\epoc.pl
+..\perl\eshell.bat \epoc32\tools\eshell.bat
+..\perl\eshell.pl \epoc32\tools\eshell.pl
+..\perl\console.ini \epoc32\data\console.ini
+..\perl\console.bmp \epoc32\data\console.bmp
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/group/location.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,6 @@
+The content of emulator_launcher is:
+
+perl Perl scripts and batch files for all tools.
+group Information and build files.
+test Sample build.info files.
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/group/release.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,6 @@
+Made by JonC 14/05/01
+
+Introduction of emulator_launcher component for the 6.1 SDKs i.e. these are the stub launchers
+that were present on the 6.0 SDKs, together with a new launcher for pepoc.
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/group/todo.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,7 @@
+Todo for :
+
+
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/group/tools_sdk_eng_emulator_launcher.history.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<relnotes name="EMULATOR_LAUNCHER">
+ <purpose>
+ </purpose>
+</relnotes>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/group/tools_sdk_eng_emulator_launcher.mrp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,32 @@
+#
+# 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:
+#
+
+component tools_sdk_eng_emulator_launcher
+source \sf\os\buildtools\misccomponents\emulatorlauncher
+binary \sf\os\buildtools\misccomponents\emulatorlauncher\group all
+exports \sf\os\buildtools\misccomponents\emulatorlauncher\group
+notes_source \component_defs\release.src
+
+#Intermediate files for tools target
+#binary \epoc32\release\tools\rel\pjava.exe
+#binary \epoc32\release\tools\rel\pjava_g.exe
+#binary \epoc32\release\tools\rel\pappletviewer.exe
+#binary \epoc32\release\tools\rel\pappletviewer_g.exe
+
+
+
+ipr T
+
Binary file deprecated/buildtools/emulatorlauncher/perl/console.bmp has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/perl/console.ini Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,31 @@
+# Copyright (c) 1997-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:
+#
+
+ScreenWidth 640
+ScreenHeight 240
+
+PhysicalScreenWidth 0
+PhysicalScreenHeight 0
+
+fasciabitmap console.bmp
+
+ScreenOffsetX 0
+ScreenOffsetY 0
+
+
+# could be decreased to reflect the amount of memory available on Brutus
+MegabytesOfFreeMemory 16
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/perl/epoc.bat Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+@echo off
+
+rem Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem Emulator Launcher
+rem
+rem
+
+perl -S epoc.pl %1 %2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/perl/epoc.pl Mon Oct 18 10:23:52 2010 +0100
@@ -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
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/perl/eshell.bat Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+@echo off
+
+rem Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem Eshell Launcher
+rem
+rem
+
+perl -S eshell.pl %1 %2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/perl/eshell.pl Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,170 @@
+# 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:
+# Eshell Launcher
+# 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)
+ {
+ &launchEshell("udeb","winscw");
+ exit(0);
+ }
+
+if($numArgs > 2)
+ {
+ &printHelp;
+ die "ERROR: Too many arguments.\n";
+ }
+
+if($numArgs == 1)
+ {
+ if(lc($ARGV[0]) eq "-rel")
+ {
+ &launchEshell("urel","winscw");
+ exit(0);
+ }
+
+ if(lc($ARGV[0]) eq "-wins")
+ {
+ &launchEshell("udeb", "wins");
+ exit(0);
+ }
+
+ if(lc($ARGV[0]) eq "-winscw")
+ {
+ &launchEshell("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")
+ {
+ &launchEshell("urel","wins");
+ exit(0);
+ }
+
+ if (lc($ARGV[1]) eq "-winscw")
+ {
+ &launchEshell("urel","winscw");
+ exit(0);
+ }
+ }
+
+ if (lc($ARGV[0]) eq "-winscw")
+ {
+ if (lc($ARGV[1] eq "-rel"))
+ {
+ &launchEshell("urel","winscw");
+ exit(0);
+ }
+ }
+
+ if (lc($ARGV[0]) eq "-wins")
+ {
+ if (lc($ARGV[1] eq "-rel"))
+ {
+ &launchEshell("urel","wins");
+ exit(0);
+ }
+ }
+ }
+
+# Error, unknown argument.
+&printHelp;
+die "ERROR: Unknown argument " . "\"" . $ARGV[0] . "\".\n";
+
+sub launchEshell
+{
+ my ($type,$win) = @_;
+ $epocroot = &getEpocroot;
+ $drive = &getDrive;
+ $emu = $drive . $epocroot . "epoc32" . "\\"
+ . "release\\" . $win . "\\" . $type . "\\" . "eshell.exe";
+ -e $emu ||
+ die "ERROR: File \"$emu\" not found.\n\n" .
+ "The EPOCROOT environment variable does not identify\n" .
+ "a valid eshell 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";
+
+ #add the stuff to use the console
+ $emu.=" -MConsole --";
+
+ # If the execute is successful, this never returns.
+ exec($emu) || die "Failed to execute eshell \"$emu\": $!";
+}
+
+sub printHelp
+{
+ print "Eshell Launcher\n";
+ print "Syntax :\teshell [-rel] [-wins|-winscw] [-help]\n";
+ print "(no options)\tLaunch active winscw debug eshell\n";
+ print "-rel\t\tLaunch active release eshell\n";
+ print "-wins\t\tLaunch active wins eshell\n";
+ print "-winscw\t\tLaunch active winscw eshell\n";
+ print "-help\t\tOutput this help message\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;
+ if($wd =~ /^([a-zA-Z]:)/) {
+ $drive = $1;
+ } else {
+ # Perhaps we're on a machine that has no drives.
+ $drive = "";
+ }
+ return $drive;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/src/RunPerl.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,80 @@
+// 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:
+// RunPerl.cpp : Defines the entry point for the console application.
+//
+//
+
+
+#include <stdlib.h>
+#include <string.h>
+
+void main(int argc, char* argv[])
+ {
+
+ char** args = new char*[argc+3];
+ int index = 0;
+
+ char* p = argv[0];
+ int pl = strlen(p);
+ if((pl >= 4) &&
+ (*(p+pl-4)=='.') &&
+ (*(p+pl-3)=='e' || *(p+pl-3)=='E') &&
+ (*(p+pl-2)=='x' || *(p+pl-2)=='X') &&
+ (*(p+pl-1)=='e' || *(p+pl-1)=='E'))
+ *(p+pl-4)='\0';
+ char* cmd = new char[strlen(p)+4];
+ strcpy(cmd,p);
+ strcat(cmd,".pl");
+
+ args[index++] = "perl";
+ args[index++] = "-S";
+ args[index++] = cmd;
+
+ for(int i=1; i<argc; i++)
+ {
+ args[index++] = argv[i];
+ }
+
+ args[index] = NULL;
+
+ int sz = 0;
+
+ for(i=0; args[i]; i++)
+ {
+ sz += strlen(args[i]) + 3;
+ }
+
+ char *s = new char[sz];
+ strcpy(s,args[0]);
+ strcat(s," ");
+ strcat(s,args[1]);
+ strcat(s," ");
+ strcat(s,args[2]);
+
+ for(i=3; args[i]; i++)
+ {
+ strcat(s," \"");
+ strcat(s,args[i]);
+ strcat(s,"\"");
+ }
+
+ int r = system(s);
+
+ delete[] s;
+ delete[] args;
+ delete[] cmd;
+
+ exit (r);
+ }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/test/BuildInfo.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,5 @@
+DeviceFamily Crystal
+DeviceFamilyRev 0x610
+ManufacturerSoftwareRev 0x620
+ManufacturerSoftwareBuild 123
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/test/BuildInfo1.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,3 @@
+DeviceFamily 2
+DeviceFamilyRev 0x600
+ManufacturerSoftwareBuild Quartz London_Candidate3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/test/BuildInfo2.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,3 @@
+DeviceFamily 0
+DeviceFamilyRev 0x600
+ManufacturerSoftwareBuild Crystal COAK
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/emulatorlauncher/test/BuildInfo3.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,3 @@
+DeviceFamily 0
+DeviceFamilyRev 0x600
+ManufacturerSoftwareBuild Crystal COAKGEN002
Binary file deprecated/buildtools/romkiteka2/config/featreg_default.cfg has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/group/bld.inf Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,96 @@
+/*
+* 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:
+*
+*/
+
+/**
+@file
+
+@SYMPurpose Tool for building ROMs
+*/
+
+PRJ_EXPORTS
+
+
+../include/DEBUG.IBY /epoc32/rom/include/ //
+../include/EPOCBASE.IBY /epoc32/rom/include/ //
+../include/HEADER.IBY /epoc32/rom/include/ //
+../include/MESON.IBY /epoc32/rom/include/ //
+../include/OBEYFILE.IBY /epoc32/rom/include/ //
+../include/ESHELL.IBY /epoc32/rom/include/ //
+
+../include/bldinfo.hby /epoc32/rom/include/ //
+
+../tools/configpaging/configpaging.cfg /epoc32/rom/configpaging/configpaging.cfg
+../tools/configpaging/configpaging_stressed.cfg /epoc32/rom/configpaging/configpaging_stressed.cfg
+../tools/configpaging/configpaging_recommended.cfg /epoc32/rom/configpaging/configpaging_recommended.cfg
+
+#if defined(SYMBIAN_FEATURE_MANAGER)
+../include/featuredatabase.xml /epoc32/rom/include/featuredatabase.xml
+../tools/featuredatabase.dtd /epoc32/tools/featuredatabase.dtd
+#else
+../include/feature.iby /epoc32/rom/include/
+../include/featureUIDs.h /epoc32/include/
+
+// file for setting default feature registry configuration
+../config/featreg_default.cfg /epoc32/data/config/ //
+
+// feature definitions for ROM building tools
+../include/featureUIDs.xml /epoc32/rom/include/ //
+#endif
+
+// OBY file that allows you to build a rom with useful kernel tracing enabled
+../include/kerneltrace.oby /epoc32/rom/include/ //
+
+// OBY(s) for configuring platsec
+../include/PlatSecDisabledCapsX.oby /epoc32/rom/include/ //
+../include/PlatSec.oby /epoc32/rom/include/ //
+
+// OBY(s) for configuring demand paging
+../include/pagedrom.oby /epoc32/rom/include/ //
+../include/pagedrom_stressed.oby /epoc32/rom/include/ //
+../include/pagedrom_functional.oby /epoc32/rom/include/ //
+
+// IBY file for setting all removable features
+../include/RemovableFeatures.iby /epoc32/rom/include/ //
+
+// DTD files
+../tools/imageContent.dtd /epoc32/tools/imagecontent.dtd
+../tools/cdf.dtd /epoc32/tools/cdf.dtd
+../tools/featureuids.dtd /epoc32/tools/featureuids.dtd
+
+// OBY file that builds a substantial Text Shell rom with no UI dependency
+../include/textshell.oby /epoc32/rom/include/textshell.oby
+
+// OBY file that builds a substantial Text Shell rom with no UI dependency and works with the Chassis build for BATS testing
+../include/textshell_Chassis_BATS.oby /epoc32/rom/include/textshell_Chassis_BATS.oby
+../include/textshell_naviengine_smp.oby /epoc32/rom/include/textshell_naviengine_smp.oby
+
+#if defined(SYMBIAN_FEATURE_MANAGER)
+PRJ_PLATFORMS
+TOOLS2
+
+// extension makefile for invoking features tool
+PRJ_EXTENSIONS
+
+start extension tools/features
+
+option FEAT_DATABASE $(EPOCROOT)epoc32/rom/include/featuredatabase.xml
+option FEAT_HEADER_PATH $(EPOCROOT)epoc32/include
+option FEAT_IBY_PATH $(EPOCROOT)epoc32/rom/include
+option FEAT_DAT_PATH $(EPOCROOT)epoc32/data/config
+
+end
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/group/release.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,31 @@
+version 3.15.1
+================
+(Made by Marvin Shi 15/01/2010)
+ 1. DEF143368 Changes to omxilcompref.iby cause errors in rombuild for textshell roms.
+Version is unchanged
+================
+(Made by Zheng Shen, 24/08/2009)
+ 1. REQ12628 Tools codeline refactoring for SymTB9.2
+ Platform indenpendent tools are removed from MCL.
+
+Version 3.15.0
+================
+(Made by Zhi Dou, 31/07/2009)
+ 1. REQ12562 Byte-pair compression update
+
+Version 3.14.0
+================
+(Made by Zhi Dou, 23/07/2009)
+ 1. REQ12561 BUILDROM performance improvement
+
+Version 3.13.0
+================
+(Made by Zhi Dou, 20/07/2009)
+ 1. REQ13110 HCR file in ROM (ROMBUILD)
+ 2. REQ13111 HCR file in a separate NAND partition (ROFSBUILD)
+
+Version 3.12.38
+================
+(Made by Zhi Dou, 10/07/2009)
+ 1. PDEF139677 breaks textshell builds (RAM-ROM)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/group/tools_romkit.history.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<relnotes name="ROMKIT_EKA2">
+ <purpose>
+ </purpose>
+
+ <minorchange revision="022">
+ Product Usability: Add information needed by interpretsis to rofs logs (CR1296, MS3.6)
+ </minorchange>
+
+ <defect number="DEF116405" title="Buildrom has a new compulsory argument which breaks backwards compatibility" revision="021">
+ Buildrom has a new compulsory argument which breaks backwards compatibility
+ </defect>
+
+ <minorchange revision="039">
+ Rom Tools Usability enhancements (PREQ1858, MS3.2)
+ </minorchange>
+
+ <defect number="DEF117647" title="buildrom usage does not list '-I' option." revision="038">
+ buildrom usage does not list "-I" option.
+ </defect>
+
+ <defect number="DEF117023" title="features.pl generates featureuids.h header file in the wrong case." revision="037">
+ features.pl generates featureuids.h header file in the wrong case.
+ </defect>
+
+ <defect number="DEF116837" title="Component RomKit is not case-consistent on Linux filesystem." revision="036">
+ Component RomKit is not case-consistent on Linux filesystem.
+ </defect>
+
+ <defect number="DEF115977" title="Option -p doesnt work for buildrom" revision="035">
+ Option -p doesnt work for buildrom
+ </defect>
+
+ <defect number="DEF115640" title="Buildrom doesn't work when run in the root directory" revision="034">
+ Buildrom doesn't work when run in the root directory
+ </defect>
+
+ <defect number="PDEF115346" title="DP: Alias errors in efficient_rom_paging" revision="033">
+ DP: Alias errors in efficient_rom_paging
+ </defect>
+
+ <defect number="DEF113086" title="Obsolete XML attribute "support", in "defaultfeaturerange"element of FM XML" revision="032">
+ Obsolete XML attribute 'support', in 'defaultfeaturerange'element of FM XML
+ </defect>
+
+ <defect number="PDEF115145" title="Patchdata requires map file" revision="031">
+ Patchdata requires map file
+ </defect>
+
+ <defect number="PDEF114978" title="Symbian rompatching patches incorrect values if patchable data is not defined" revision="030">
+ Symbian rompatching patches incorrect values if patchable data is not defined
+ </defect>
+
+ <defect number="DEF115172" title="Buildrom should complain on not supplying "-fm" option" revision="029">
+ Buildrom should complain on not supplying "-fm" option
+ </defect>
+
+ <defect number="DEF113536" title="features.pl does not allow a feature to be excluded from a feature set's IBY" revision="028">
+ features.pl does not allow a feature to be excluded from a feature set's IBY
+ </defect>
+
+ <defect number="DEF114807" title="Features tool help information is displayed twice with error message" revision="027">
+ Features tool help information is displayed twice with error message
+ </defect>
+
+ <defect number="DEF113508" title="ROMBUILD getting invoked twice" revision="026">
+ ROMBUILD getting invoked twice
+ </defect>
+
+ <defect number="DEF113140" title="Buildrom fails with error 'Use the keyword 'romsize' ' for extension ROFS image" revision="025">
+ Buildrom fails with error 'Use the keyword 'romsize' ' for extension ROFS image
+ </defect>
+
+ <defect number="DEF111921" title="Invocation of the spi tool fails with -d option" revision="024">
+ Invocation of the spi tool fails with -d option
+ </defect>
+
+ <defect number="DEF113506" title="RomKit FeatReg generation incorrectly optimises feature entries out of CFG files" revision="023">
+ RomKit FeatReg generation incorrectly optimises feature entries out of CFG files
+ </defect>
+
+ <defect number="INC112458" title="buildrom.pm defect when compression type is not specified." revision="022">
+ buildrom.pm defect when compression type is not specified.
+ </defect>
+
+ <defect number="DEF112560" title="Two defects in buildrom UDA image creation." revision="021">
+ Two defects in buildrom UDA image creation.
+ </defect>
+
+ <defect number="DEF095016" title="Renaming default language files is in a conflict with the NearestLanguageFile()" revision="020">
+ Renaming default language files is in a conflict with the NearestLanguageFile()
+ </defect>
+
+ <defect number="PDEF109724" title="Rombuild/Rofsbuild should warn if dll or exe is located outside standard paths" revision="019">
+ Rombuild/Rofsbuild should warn if dll or exe is located outside standard paths
+ </defect>
+
+ <minorchange revision="018">
+ Feature Manager run-time enhancements (PREQ1645)
+ </minorchange>
+
+ <defect number="PDEF111221" title="ROM patching fails if ARMV5 is not specified in caps in ABI_DIR macro" revision="017">
+ ROM patching fails if ARMV5 is not specified in caps in ABI_DIR macro
+ </defect>
+
+ <defect number="DEF111787" title="Buildrom is failing if hide statement is specified in the iby/oby file" revision="016">
+ Buildrom is failing if hide statement is specified in the iby/oby file
+ </defect>
+
+ <defect number="DEF110497" title="buildrom doesn't work for ARMV6" revision="015">
+ buildrom doesn't work for ARMV6
+ </defect>
+
+ <minorchange revision="014">
+ Feature Manager supporting tool enhancements (PREQ1801, MS3.1)
+ </minorchange>
+
+ <defect number="PDEF110043" title="patchdata option handles incorrectly negative values" revision="013">
+ patchdata option handles incorrectly negative values
+ </defect>
+
+ <defect number="DEF111340" title="DP: Code paging is not used for ROFS code" revision="012">
+ Enabled the USE_CODE_PAGING and CODE_PAGING_FROM_ROFS flags and disabled the EFFICIENT_ROM_PAGING flag (which is not needed for mainly code paged ROMs).
+ </defect>
+
+ <defect number="DEF110618" title="Build rom command is failing to create the image with -f option " revision="011">
+ Build rom command is failing to create the image with -f option .
+ </defect>
+
+ <defect number="DEF106861" title="Specifying a compression method in buildrom doesn't work" revision="010">
+ Specifying a compression method in buildrom doesn't work.
+ </defect>
+
+ <defect number="DEF109247" title="Rombuild can ignore the compress option for the core image" revision="009">
+ Rombuild can ignore the compress option for the core image.
+ </defect>
+
+ <defect number="DEF108413" title="Not possible to have hierarchies of BSF files" revision="008">
+ Not possible to have hierarchies of BSF files.
+ </defect>
+
+ <minorchange revision="007">
+ Generation of data drive image (PREQ1230, MS3.1)
+ </minorchange>
+
+ <defect number="DEF100399" title="ABIV2: BSF files do not work properly for BPABI platforms" revision="006">
+ ABIV2: BSF files do not work properly for BPABI platforms.
+ </defect>
+
+ <minorchange revision="005">
+ EC021 changes to longeng have removed the static dependency on cntmodel, so textshell.oby
+ no longer needs workarounds to avoid pulling in cntmodel.
+ </minorchange>
+
+ <minorchange revision="004">
+ Add textshell.oby, which creates a text shell ROM that has no dependency on the UI layer, and is intended for testing hardware adaptation APIs.
+ </minorchange>
+
+ <defect number="PDEF098786" title="Symbol file is always generated" revision="003">
+ Adding a new option to buildrom so that Symbol file will not be generated if the new option is specified
+ </defect>
+
+ <defect number="DEF099432" title=""abld -checksource" should differentiate between USERINCLUDE and SYSTEMINCLUDE" revision="002">
+ "-I-" added between the USERINCLUDE and SYSTEMINCLUDE paths that are picked up from the MAKMAKE front-end and listed to CPP
+ </defect>
+
+ <defect number="DEF099989" title="DP: [TBAS] Duplication ERROR while building the Default DP ROM image on TBAS2589" revision="001">
+ Change efficient_rom_paing.pm so that ’hide’ and ’rename’ keywords are supported.
+ </defect>
+</relnotes>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/group/tools_romkit.mrp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,26 @@
+#
+# 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:
+#
+
+component tools_romkit
+source \sf\os\buildtools\imgtools_os\romkiteka2
+binary \sf\os\buildtools\imgtools_os\romkiteka2\group all
+exports \sf\os\buildtools\imgtools_os\romkiteka2\group
+
+notes_source \component_defs\release.src
+
+
+ipr T
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/DEBUG.IBY Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,28 @@
+/*
+* 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:
+*
+*/
+#ifndef __DEBUG_IBY__
+#define __DEBUG_IBY__
+
+REM Additional things in System\Samples
+REM Use "Re-install sample files" in the RefUI shell Tools menu
+
+
+#ifdef _DEBUG
+#include <obeyfile.iby> // top-level OBY file in \System\Samples
+#endif
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/EPOCBASE.IBY Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,94 @@
+/*
+* 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:
+*
+*/
+#ifndef __EPOCBASE_IBY__
+#define __EPOCBASE_IBY__
+
+REM EPOCBASE.IBY Basic OS Support
+
+#include <header.iby> /* ROM header definitions */
+#include <base.iby> /* The lowest-level of the operating system */
+
+#include <c32.iby> /* standard Sockets components */
+#include <ecuart.iby> /* standard Sockets components */
+#include <esock.iby> /* standard Sockets components */
+#include <irda.iby> /* standard Sockets components */
+#include <bluetooth.iby> /* standard Sockets components */
+
+#include <gdi.iby> /* standard Graphics components */
+#include <fntstore.iby> /* standard Graphics components */
+#include <fbserv.iby> /* standard Graphics components */
+#include <bitgdi.iby> /* standard Graphics components */
+#include <wserv.iby> /* standard Graphics components */
+
+#include <apparc.iby> /* Application architecture DLLs */
+#include <emime.iby> /* Mime recognition */
+#include <meson.iby> /* standard Meson components */
+
+#include <fepbase.iby> /* Front end processor base classes */
+#include <printers.iby> /* Printer drivers */
+
+/* Generic Multimedia Components */
+#include <mmf.iby> /* Multimedia Framework */
+#include <mmcommon.iby> /* Shared multimedia components */
+#include <imageconversion.iby> /* Image conversion library */
+#include <mdf.iby> /* Media Device Framework */
+#include <devvideo.iby> /* devvideo generic */
+#include <asr.iby> /* speech recognition */
+#include <ecam.iby> /* Camera API */
+
+#include <sysagent.iby> /* System Agent client and server */
+
+#include <network.iby>
+
+#include <stdlib.iby> /* Standard C Library */
+
+#include <securitycommonutils.iby>
+#include <caf.iby>
+#include <ups.iby>
+
+#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+#include <scr.iby>
+#endif
+
+#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT
+#include <ssma.iby> /*System State Management Architecture*/
+#include <ssplugins.iby> /*System State Management Plugins*/
+
+#else
+// System starter is included by default. To build a rom
+// which will use start.exe instead of sysstart.exe use the
+// -D_NOSYSSTART option with buildrom.
+
+#ifndef _NOSYSSTART
+#include <sysstart.iby> /* System Starter */
+#endif
+
+#endif // SYMBIAN_SYSTEM_STATE_MANAGEMENT
+
+
+
+#include <openenv.iby>
+#include <ezlib.iby>
+
+#include <sql.iby> /* SQL database*/
+#include <dbms.iby> /* Legacy Non-SQL database support */
+
+#ifdef SYMBIAN_EUSERHL
+#include <euserhl.iby> /*Generic usability library*/
+#endif
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/ESHELL.IBY Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,26 @@
+/*
+* 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:
+*
+*/
+
+#ifndef __ESHELL_IBY__
+#define __ESHELL_IBY__
+
+file=ABI_DIR\DEBUG_DIR\eshell.exe \sys\bin\EShell.exe HEAPMAX(0x20000)
+
+REM For the benefit of base\f32\etshell
+data=ZPRIVATE\10003a3f\APPS\eshell_reg.rsc Private\10003a3f\Apps\eshell_reg.rsc
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/HEADER.IBY Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,181 @@
+/*
+* 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:
+*
+*/
+#ifndef __HEADER_IBY__
+#define __HEADER_IBY__
+
+unicode
+
+romsize=0x##ROMMEGS##00000
+time=ROMDATE 12:00:00
+
+#ifdef CDMA
+define CDMA_SUFFIX _cdma
+#else
+define CDMA_SUFFIX ## // nothing
+#endif
+
+#ifdef _NAND
+define NAND_SUFFIX .nand
+#else
+define NAND_SUFFIX ## // nothing
+#endif
+
+#if (defined _NAND2 || defined _ONENAND)
+define NAND_SUFFIX .nand
+#endif
+
+#ifdef SYMBIAN_FEATURE_MANAGER
+defaultfeaturedb = epoc32\rom\include\featuredatabase.xml
+#endif
+
+romname=##VARIANT##_##BUILDNO##LANGID##.##OBEYFILE##CDMA_SUFFIX##NAND_SUFFIX.IMG
+
+#ifdef _NAND
+ECHO Preparing NAND core image with associated ROFS image
+
+#ifndef _ROFS_SIZE
+#define _ROFS_SIZE 32000000 // 32 Meg default
+#endif
+define ROFS_SIZE _ROFS_SIZE
+
+compress
+rom_image 1 rofs size=ROFS_SIZE non-xip compress
+
+#endif
+
+
+#if (defined _NAND2 || defined _ONENAND)
+ECHO Preparing NAND core image with associated ROFS image
+
+#ifndef _ROFS_SIZE
+#define _ROFS_SIZE 32000000 // 32 Meg default
+#endif
+define ROFS_SIZE _ROFS_SIZE
+
+compress
+rom_image 1 rofs size=ROFS_SIZE non-xip compress
+
+#endif
+
+REM ROM version number
+
+version=##VERSION##(##BUILDNO##)
+
+#ifdef _FULL_DEBUG
+#ifndef _DEBUG
+#define _DEBUG // _FULL_DEBUG implies _DEBUG
+#endif
+define BUILD_DIR udeb
+#else
+define BUILD_DIR urel
+#endif
+
+#ifdef _DEBUG
+define DEBUG_DIR udeb
+#else
+define DEBUG_DIR urel
+#endif
+
+#ifndef _EABI
+# ifdef _ARM4
+# define _EABI ARM4
+ ECHO Defaulting to ARM4
+# elif defined(_ARMV5)
+# define _EABI ARMV5
+ ECHO Defaulting to ARMV5
+# elif defined _X86GCC
+# define _EABI x86gcc
+# endif
+#endif
+
+# ifdef _PLAT
+# undef _EABI
+# define _EABI _PLAT
+ ECHO Defaulting to _EABI
+# endif
+
+# ifdef _GCCE
+# undef _EABI
+# define _EABI GCCE
+# elif defined(ABIV2) || defined(ABIv2)
+# undef _EABI
+# define _EABI ARMV5_ABIV2
+# endif
+
+// This is to include ABIV2 specific runtime libraries. This inclusion
+// in other obey files depends on the definition of RVCT
+#ifdef _GCCE
+# define RVCT
+#endif
+
+define ABI_DIR EPOCROOT##epoc32\release\##_EABI
+
+#ifndef _KABI
+#define _KABI _EABI
+#endif
+
+define KERNEL_DIR EPOCROOT##epoc32\release\##_KABI
+
+define DATAZ_ EPOCROOT##epoc32\data\Z
+define ZSYSTEM DATAZ_\System
+define ZPRIVATE DATAZ_\Private
+define ZRESOURCE DATAZ_\Resource
+
+define DATAC_ EPOCROOT##epoc32\data\C
+define CSYSTEM DATAC_\System
+
+// default location of executables
+define SYSTEM_BINDIR System\Libs // will be Sys\Bin for Secure platform
+
+
+// Support for ECOM_PLUGIN
+// Format is ECOM_PLUGIN(<DLL Name>,<Resource File Name>)
+// e.g. ECOM_PLUGIN(foo.dll,12345abc.rsc)
+
+define ECOM_RSC_DIR Resource\Plugins
+define ECOM_BIN_DIR Sys\Bin
+
+
+// __ECOM_PLUGIN(emulator directory, file rom dir, dataz_, resource rom dir, filename, resource filename)
+#define ECOM_PLUGIN(file,resource) __ECOM_PLUGIN(ABI_DIR\BUILD_DIR,ECOM_BIN_DIR,DATAZ_,ECOM_RSC_DIR,file,file)
+#define ECOM_PLUGIN_UDEB(file,resource) __ECOM_PLUGIN(ABI_DIR\UDEB,ECOM_BIN_DIR,DATAZ_,ECOM_RSC_DIR,file,file)
+
+// Support for HIDE_ECOM_PLUGIN
+// Format is HIDE_ECOM_PLUGIN(<DLL Name>,<Resource File Name>)
+// e.g. HIDE_ECOM_PLUGIN(foo.dll,12345abc.rsc)
+
+// _HIDE__ECOM_PLUGIN(emulator directory, file rom dir, dataz_, resource rom dir, filename, resource filename)
+#define HIDE_ECOM_PLUGIN(file,resource) _HIDE__ECOM_PLUGIN(ABI_DIR\BUILD_DIR,ECOM_BIN_DIR,DATAZ_,ECOM_RSC_DIR,file,file)
+#define HIDE_ECOM_PLUGIN_UDEB(file,resource) _HIDE__ECOM_PLUGIN(ABI_DIR\UDEB,ECOM_BIN_DIR,DATAZ_,ECOM_RSC_DIR,file,file)
+
+#ifdef SYMBIAN_ROM_STATIC_PLUGIN_INFORMATION
+ enable_spi
+#else
+ disable_spi
+#endif
+
+// Secure platform setting - use PlatSec.oby to turn diagnostics on
+PlatSecDiagnostics OFF
+PlatSecEnforcement ON
+PlatSecEnforceSysBin ON
+PlatSecProcessIsolation ON
+
+#include <symbian_os_romdefs.hby>
+
+#include "feature.iby"
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/MESON.IBY Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,82 @@
+/*
+* 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:
+*
+*/
+#ifndef __MESON_IBY__
+#define __MESON_IBY__
+
+REM Store, Etext, Form, Grid, Clock, Print, AlarmServer, WorldServer, Bafl, Egul, Cone, Dial, BmpAnim
+
+/* Store */
+#include "Store.iby"
+
+/* Etext */
+#include "EText.iby"
+
+/* Form */
+#include "Form.iby"
+
+
+/* Clock */
+file=ABI_DIR\BUILD_DIR\clock.dll System\Libs\Clock.dll
+file=ABI_DIR\BUILD_DIR\clocka.dll System\Libs\ClockA.dll
+
+/* Pwrcli */
+#include "PwrCli.iby"
+
+/* Bafl */
+#include "Bafl.iby"
+
+/* Cone */
+#include "cone.iby"
+
+/* NumberConversion */
+#include "NumberConversion.iby"
+
+/* EGUL */
+#include <egul.iby>
+
+/* Dial */
+#include <dial.iby>
+
+/* BmpAnim */
+
+/* Feature Management run-time */
+#ifdef SYMBIAN_FEATURE_MANAGER
+
+// Include both old and new components when Feature Manager enabled
+#include "featmgr.iby"
+#include "featreg.iby"
+
+#else
+
+// Include only the original Feature Registry otherwise
+#include "featreg.iby"
+#ifndef ROM_FEATURE_MANAGEMENT
+/* Provide a default configuration file for the feature registry */
+data=EPOCROOT##epoc32\data\config\featreg_default.cfg private\102744CA\featreg.cfg
+#endif
+
+#endif
+
+/* Central Repository*/
+/* The inclusion of central repository in all Cedar ROMs is currently being
+ investigated by the Tech Lead for Symbian OS 9.0.
+
+ When the issue has been fully clarified it is likely that the inclusion
+ will be removed from 8.1b using an appropriate configuration macro */
+#include "centralrepository.iby"
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/OBEYFILE.IBY Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,29 @@
+/*
+* 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:
+*
+*/
+
+#ifndef __OBEYFILE_IBY__
+#define __OBEYFILE_IBY__
+
+REM Include the top-level OBY file in the ROM, as an audit trail...
+REM You do not want this in production ROMs!
+
+section2 data=EPOCROOT##epoc32\rom\include\##OBEYFILE##.oby System\Samples\DESIRED_ABI##_##OBEYFILE##
+
+REM Provides build number information to the emulator/ROM.
+data=EPOCROOT##epoc32\data\buildinfo.txt System\Data\buildinfo.txt
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/PlatSec.oby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+/*
+* 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:
+*
+*/
+
+ROM_IMAGE[0] {
+PlatSecDiagnostics ON
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/PlatSecDisabledCapsX.oby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+/*
+* 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:
+*
+*/
+
+#ifndef __PLATSEC_DISABLED_CAPS__
+#error "__PLATSEC_DISABLED_CAPS__ must be defined"
+#endif
+PlatSecDisabledCaps __PLATSEC_DISABLED_CAPS__
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/RemovableFeatures.iby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,46 @@
+// Copyright (c) 2005-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:
+//
+
+#ifndef __REMOVABLEFEATURES_IBY__
+#define __REMOVABLEFEATURES_IBY__
+
+#define SYMBIAN_EXCLUDE_FAX
+#undef __UPNP_PRINT_FRAMEWORK
+#undef __MMC
+#define SYMBIAN_EXCLUDE_RTP_RTCP
+#define SYMBIAN_EXCLUDE_PC_CONNECTIVITY_EXCEPT_SECURE_BACKUP
+#undef __IRDA
+#undef __BT
+#define SYMBIAN_EXCLUDE_OBEX
+#undef __USB
+#define SYMBIAN_EXCLUDE_DRM_AGENT_PLUGINS
+#undef __IPSEC
+#define SYMBIAN_EXCLUDE_QOS_PROTPLUGINS
+#undef __DHCP
+#define SYMBIAN_EXCLUDE_MOBILEIP
+#define SYMBIAN_EXCLUDE_LOCATION
+#define SYMBIAN_EXCLUDE_SIP
+#define SYMBIAN_EXCLUDE_OFFLINE_MODE
+#undef __MTP_PROTOCOL_SUPPORT
+#undef __VIBRA
+#undef __SERIES60_AMBIENT_LIGHT_SENSOR
+#undef __COVER_DISPLAY
+#undef __SERIES60_KEYPAD_NO_SLIDER
+#define SYMBIAN_EXCLUDE_LOCATION_MANAGEMENT
+#undef __CS_VIDEO_TELEPHONY
+#undef __COMMON_TSY__EMERGENCY_CALLS_ENABLED_IN_OFFLINE_MODE
+#undef __DRIVE_MODE
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/bldinfo.hby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,7 @@
+REM bldinfo.hby
+REM
+REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+
+REM Build information data file
+
+data=EPOCROOT##epoc32\data\BuildInfo.txt System\Data\BuildInfo.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/feature.iby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,164 @@
+/*
+* 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:
+*
+*/
+#ifndef __FEATURE_IBY__
+#define __FEATURE_IBY__
+
+
+#ifdef SYMBIAN_EXCLUDE_FAX
+EXCLUDE_FEATURE Fax
+#else
+FEATURE Fax
+#endif
+
+#ifndef __UPNP_PRINT_FRAMEWORK
+EXCLUDE_FEATURE Print
+#else
+FEATURE Print
+#endif
+
+
+#ifndef __BT
+EXCLUDE_FEATURE Bluetooth
+#else
+FEATURE Bluetooth
+#endif
+
+
+#ifndef __IRDA
+EXCLUDE_FEATURE Infrared
+#else
+FEATURE Infrared
+#endif
+
+
+#ifndef __MMC
+EXCLUDE_FEATURE Mmc
+#else
+FEATURE Mmc
+#endif
+
+
+#ifndef __USB
+EXCLUDE_FEATURE Usb
+#else
+FEATURE Usb
+#endif
+
+
+#ifdef SYMBIAN_EXCLUDE_OBEX
+EXCLUDE_FEATURE Obex
+#else
+FEATURE Obex
+#endif
+
+
+#ifdef SYMBIAN_EXCLUDE_RTP_RTCP
+EXCLUDE_FEATURE RtpRtcp
+#else
+FEATURE RtpRtcp
+#endif
+
+
+#ifdef SYMBIAN_EXCLUDE_SIP
+EXCLUDE_FEATURE Sip
+#else
+FEATURE Sip
+#endif
+
+
+#ifdef SYMBIAN_EXCLUDE_QOS_PROTPLUGINS
+EXCLUDE_FEATURE IPQos
+EXCLUDE_FEATURE NetworkQos
+#else
+FEATURE IPQos
+FEATURE NetworkQos
+#endif
+
+
+#ifndef __IPSEC
+EXCLUDE_FEATURE IPSec
+#else
+FEATURE IPSec
+#endif
+
+
+
+#ifndef __DHCP
+EXCLUDE_FEATURE Dhcp
+#else
+FEATURE Dhcp
+#endif
+
+
+
+#ifdef SYMBIAN_EXCLUDE_PC_CONNECTIVITY_EXCEPT_SECURE_BACKUP
+EXCLUDE_FEATURE Connectivity
+#else
+FEATURE Connectivity
+#endif
+
+
+#ifndef __MTP_PROTOCOL_SUPPORT
+EXCLUDE_FEATURE MTP
+#else
+FEATURE MTP
+#endif
+
+
+#ifndef __VIBRA
+EXCLUDE_FEATURE Vibra
+#else
+FEATURE Vibra
+#endif
+
+#ifndef __SERIES60_AMBIENT_LIGHT_SENSOR
+EXCLUDE_FEATURE AmbientLightSensor
+#else
+FEATURE AmbientLightSensor
+#endif
+
+#ifndef __COVER_DISPLAY
+EXCLUDE_FEATURE CoverDisplay
+#else
+FEATURE CoverDisplay
+#endif
+
+#ifndef __SERIES60_KEYPAD_NO_SLIDER
+EXCLUDE_FEATURE KeypadNoSlider
+#else
+FEATURE KeypadNoSlider
+#endif
+
+#ifndef __CS_VIDEO_TELEPHONY
+EXCLUDE_FEATURE CsVideoTelephony
+#else
+FEATURE CsVideoTelephony
+#endif
+
+#ifndef __COMMON_TSY__EMERGENCY_CALLS_ENABLED_IN_OFFLINE_MODE
+EXCLUDE_FEATURE EmergencyCallsEnabledInOfflineMode
+#else
+FEATURE EmergencyCallsEnabledInOfflineMode
+#endif
+
+#ifndef __DRIVE_MODE
+EXCLUDE_FEATURE DriveModeCanRestrictMtCalls
+#else
+FEATURE DriveModeCanRestrictMtCalls
+#endif
+
+#endif // __FEATURE_IBY__
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/featureUIDs.h Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,62 @@
+// Copyright (c) 2005-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:
+// Feature UID allocations for all Symbian OS platforms
+// This file is managed by the System Design Authority (sda@symbian.com)
+// To allocate a new feature UID, please email the SDA
+// The following UID ranges are allocated for features
+// that default to reporting "feature present"
+// 0x10279806 - 0x10281805
+// All other UIDs default to reporting "feature not present"
+//
+//
+
+/**
+ @publishedAll
+ @released
+*/
+namespace NFeature
+ {
+ // default present
+ const TUid KFax = {0x10279806};
+ const TUid KPrint = {0x10279807};
+ const TUid KBluetooth = {0x10279808};
+ const TUid KInfrared = {0x10279809};
+ const TUid KMmc = {0x1027980a};
+ const TUid KUsb = {0x1027980b};
+ const TUid KObex = {0x1027980c};
+ const TUid KRtpRtcp = {0x1027980d};
+ const TUid KSip = {0x1027980f};
+ const TUid KOmaDataSync = {0x10279810};
+ const TUid KOmaDeviceManagement = {0x10279811};
+ const TUid KIPQoS = {0x10279812};
+ const TUid KNetworkQoS = {0x10279813};
+ const TUid KIPSec = {0x10279814};
+ const TUid KDhcp = {0x10279815};
+ const TUid KConnectivity = {0x10279816}; // PC Connectivity
+ const TUid KMTP = {0x10279817};
+
+ // default not-present
+ const TUid KLocation = {0x10281818};
+ const TUid KMobileIP = {0x10281819};
+ const TUid KOfflineMode = {0x1028181A};
+ const TUid KDRM = {0x1028181B};
+ const TUid KOmaDsHostServers = {0x10282663};
+ const TUid KVibra = {0x102835AE};
+ const TUid KAmbientLightSensor = {0x102835AF};
+ const TUid KCoverDisplay = {0x102835B0};
+ const TUid KKeypadNoSlider = {0x102835B1};
+ const TUid KCsVideoTelephony = {0x10285A22};
+ const TUid KEmergencyCallsEnabledInOfflineMode = {0x10285A23};
+ const TUid KDriveModeCanRestrictMtCalls = {0x10285A24};
+ }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/featureUIDs.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!DOCTYPE featureuids SYSTEM "featureuids.dtd">
+
+<!--
+ Copyright (c) 2005-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:
+ This file is managed by the System Design Authority (sda@symbian.com)
+ To allocate a new feature UID, please email the SDA
+
+-->
+
+
+
+<featureuids>
+ <features>
+ <!-- default present -->
+ <feature name="Fax" uid="0x10279806"/>
+ <feature name="Print" uid="0x10279807"/>
+ <feature name="Bluetooth" uid="0x10279808"/>
+ <feature name="Infrared" uid="0x10279809"/>
+ <feature name="Mmc" uid="0x1027980A"/>
+ <feature name="Usb" uid="0x1027980B"/>
+ <feature name="Obex" uid="0x1027980C"/>
+ <feature name="RtpRtcp" uid="0x1027980D"/>
+ <feature name="Sip" uid="0x1027980F"/>
+ <feature name="IPQoS" uid="0x10279812"/>
+ <feature name="NetworkQoS" uid="0x10279813"/>
+ <feature name="IPSec" uid="0x10279814"/>
+ <feature name="Dhcp" uid="0x10279815"/>
+ <feature name="Connectivity" uid="0x10279816"/>
+ <feature name="MTP" uid="0x10279817"/>
+ <!-- default not present -->
+ <feature name="Location" uid="0x10281818"/>
+ <feature name="MobileIP" uid="0x10281819"/>
+ <feature name="OfflineMode" uid="0x1028181a"/>
+ <feature name="DRM" uid="0x1028181b"/>
+ <feature name="Vibra" uid="0x102835AE"/>
+ <feature name="AmbientLightSensor" uid="0x102835AF"/>
+ <feature name="CoverDisplay" uid="0x102835B0"/>
+ <feature name="KeypadNoSlider" uid="0x102835B1"/>
+ <feature name="CsVideoTelephony" uid="0x10285A22"/>
+ <feature name="EmergencyCallsEnabledInOfflineMode" uid="0x10285A23"/>
+ <feature name="DriveModeCanRestrictMtCalls" uid="0x10285A24"/>
+ </features>
+
+ <default>
+ <!-- The following UID range is reserved for default present features -->
+ <range min="0x10279806" max="0x10281805" support="include"/>
+ </default>
+</featureuids>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/featuredatabase.xml Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,153 @@
+<?xml version="1.0"?>
+<!DOCTYPE featuredatabase SYSTEM "featuredatabase.dtd">
+
+<!--
+ Copyright (c) 2005-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:
+ This file is managed by the System Design Authority (sda@symbian.com)
+ To allocate a new feature UID, please email the SDA
+
+-->
+
+
+
+<featuredatabase>
+ <featureset ibyname="feature.iby" hfilename="featureuids.h" namespace="NFeature">
+ <hfileheader interfacestatus="@released" interfacevisibility="@publishedAll">
+ // featureUIDs.h
+ //
+ // Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
+ //
+ // Feature UID allocations for all Symbian OS platforms
+ //
+ // This file is managed by the System Design Authority (sda@symbian.com)
+ // To allocate a new feature UID, please email the SDA
+ //
+ // The following UID ranges are allocated for features
+ // that default to reporting "feature present"
+ // 0x10279806 - 0x10281805
+ //
+ // All other UIDs default to reporting "feature not present"
+ //
+ </hfileheader>
+
+ <feature name="Fax" statusflags="0x00000001" uid="0x10279806">
+ <hrhmacro exclude="SYMBIAN_EXCLUDE_FAX"/>
+ </feature>
+ <feature name="Print" statusflags="0x00000001" uid="0x000005FF">
+ <hrhmacro include="__UPNP_PRINT_FRAMEWORK"/>
+ </feature>
+ <feature name="Bluetooth" statusflags="0x00000001" uid="0x0000000C">
+ <hrhmacro include="__BT"/>
+ </feature>
+ <feature name="Infrared" statusflags="0x00000001" uid="0x0000000B">
+ <hrhmacro include="__IRDA"/>
+ </feature>
+ <feature name="Mmc" statusflags="0x00000001" uid="0x00000001">
+ <hrhmacro include="__MMC"/>
+ </feature>
+ <feature name="Usb" statusflags="0x00000001" uid="0x0000000D">
+ <hrhmacro include="__USB"/>
+ </feature>
+ <feature name="Obex" statusflags="0x00000001" uid="0x1027980C">
+ <hrhmacro exclude="SYMBIAN_EXCLUDE_OBEX"/>
+ </feature>
+ <feature name="RtpRtcp" statusflags="0x00000001" uid="0x1027980D">
+ <hrhmacro exclude="SYMBIAN_EXCLUDE_RTP_RTCP"/>
+ </feature>
+ <feature name="Sip" statusflags="0x00000001" uid="0x1027980F">
+ <hrhmacro exclude="SYMBIAN_EXCLUDE_SIP"/>
+ </feature>
+ <feature name="IPQoS" statusflags="0x00000001" uid="0x10279812">
+ <hrhmacro exclude="SYMBIAN_EXCLUDE_QOS_PROTPLUGINS"/>
+ </feature>
+ <feature name="NetworkQoS" statusflags="0x00000001" uid="0x10279813">
+ <hrhmacro exclude="SYMBIAN_EXCLUDE_QOS_PROTPLUGINS"/>
+ </feature>
+ <feature name="IPSec" statusflags="0x00000001" uid="0x00000066">
+ <hrhmacro include="__IPSEC"/>
+ </feature>
+ <feature name="Dhcp" statusflags="0x00000001" uid="0x0000006B">
+ <hrhmacro include="__DHCP"/>
+ </feature>
+ <feature name="Connectivity" statusflags="0x00000001" uid="0x10279816">
+ <hrhmacro exclude="SYMBIAN_EXCLUDE_PC_CONNECTIVITY_EXCEPT_SECURE_BACKUP"/>
+ </feature>
+ <feature name="MTP" statusflags="0x00000001" uid="0x000001F8">
+ <hrhmacro include="__MTP_PROTOCOL_SUPPORT"/>
+ </feature>
+ <feature name="Location" statusflags="0x00000001" uid="0x00000072"></feature>
+ <feature name="MobileIP" statusflags="0x00000001" uid="0x10281819"></feature>
+ <feature name="OfflineMode" statusflags="0x00000001" uid="0x00000007"></feature>
+ <feature name="DRM" statusflags="0x00000001" uid="0x0000005B"></feature>
+ <feature name="Vibra" statusflags="0x00000001" uid="0x0000019B">
+ <hrhmacro include="__VIBRA"/>
+ </feature>
+ <feature name="AmbientLightSensor" statusflags="0x00000001" uid="0x000005F9">
+ <hrhmacro include="__SERIES60_AMBIENT_LIGHT_SENSOR"/>
+ </feature>
+ <feature name="CoverDisplay" statusflags="0x00000001" uid="0x00000003">
+ <hrhmacro include="__COVER_DISPLAY"/>
+ </feature>
+ <feature name="KeypadNoSlider" statusflags="0x00000001" uid="0x000003F5">
+ <hrhmacro include="__SERIES60_KEYPAD_NO_SLIDER"/>
+ </feature>
+ <feature name="LocationManagement" statusflags="0x00000001" uid="0x10279818">
+ <hrhmacro exclude="SYMBIAN_EXCLUDE_LOCATION_MANAGEMENT"/>
+ </feature>
+ <feature name="LocationAPIVariant2" statusflags="0x00000000" uid="0x10285D69">
+ <hrhmacro include="SYMBIAN_INCLUDE_LOCATION_API_VARIANT2"/>
+ </feature>
+ <feature name="BluetoothGPSPositioningPlugin" statusflags="0x00000000" uid="0x0000007A">
+ <hrhmacro include="__BLUETOOTHGPSPSY"/>
+ </feature>
+ <feature name="DefaultPositioningPlugin" statusflags="0x00000000" uid="0x10285D6B">
+ <hrhmacro include="SYMBIAN_INCLUDE_DEFAULT_PM"/>
+ </feature>
+ <feature name="SimulationPositioningPlugin" statusflags="0x00000000" uid="0x10285D6C">
+ <hrhmacro include="SYMBIAN_INCLUDE_SIMULATION_PM"/>
+ </feature>
+ <feature name="LocationPrivacyRequestAPIs" statusflags="0x00000000" uid="0x102859F2">
+ <hrhmacro include="SYMBIAN_INCLUDE_LOCATION_PRIVACY_REQUEST_APIS"/>
+ </feature>
+ <feature name="LocationAdvancedDialog" statusflags="0x00000000" uid="0x102859F3">
+ <hrhmacro include="SYMBIAN_INCLUDE_LOCATION_ADVANCED_DIALOG"/>
+ </feature>
+ <feature name="CsVideoTelephony" statusflags="0x00000001" uid="0x00000059">
+ <hrhmacro include="__CS_VIDEO_TELEPHONY"/>
+ </feature>
+ <feature name="EmergencyCallsEnabledInOfflineMode" statusflags="0x00000001" uid="0x00000126">
+ <hrhmacro include="__COMMON_TSY__EMERGENCY_CALLS_ENABLED_IN_OFFLINE_MODE"/>
+ </feature>
+ <feature name="DriveModeCanRestrictMtCalls" statusflags="0x00000001" uid="0x00000584">
+ <hrhmacro include="__DRIVE_MODE"/>
+ </feature>
+ <feature name="FmTx" statusflags="0x00000001" uid="0x000006A9">
+ <hrhmacro include="FF_FMTX"/>
+ </feature>
+ <!-- PREQ 2051 - Variation Support - Start -->
+ <feature name="Libxml2" statusflags="0x00000001" uid="0x10286747">
+ <hrhmacro infeaturesetiby="no" exclude="SYMBIAN_EXCLUDE_LIBXML2"/>
+ </feature>
+ <feature name="Libxml2SAXParser" statusflags="0x00000001" uid="0x10286707">
+ <hrhmacro infeaturesetiby="no" exclude="SYMBIAN_EXCLUDE_LIBXML2_SAX_CPARSER_PLUGIN"/>
+ </feature>
+ <feature name="Libxml2DOMXPathAPI" statusflags="0x00000001" uid="0x10286727">
+ <hrhmacro infeaturesetiby="no" exclude="SYMBIAN_EXCLUDE_LIBXML2_DOM_XPATH_API"/>
+ </feature>
+ <!-- PREQ 2051 - Variation Support - End -->
+ </featureset>
+
+ <defaultfeaturerange higheruid="0x10281805" loweruid="0x10279806"></defaultfeaturerange>
+</featuredatabase>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/kerneltrace.oby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,20 @@
+/*
+* 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:
+*
+*/
+
+#define _DEBUG
+kerneltrace=0x00080000
+romname=##VARIANT##_##BUILDNO##LANGID##.kerneltrace.IMG
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/pagedrom.oby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,71 @@
+/*
+* 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:
+*
+*/
+#if !defined PAGED_ROM
+#define PAGED_ROM
+#endif
+
+#if !defined EFFICIENT_ROM_PAGING
+// Uncomment next line if efficient rom paging is wanted.
+//#define EFFICIENT_ROM_PAGING
+#endif
+
+#if !defined USE_CODE_PAGING
+// Uncomment next line if code paging is wanted
+#define USE_CODE_PAGING
+#endif
+
+#if !defined USE_DATA_PAGING
+// Uncomment next line if Writable Data Paging is wanted.
+//#define USE_DATA_PAGING
+#endif
+
+#if !defined CODE_PAGING_FROM_ROFS
+// Uncomment next line if code paging from primary rofs is wanted
+#define CODE_PAGING_FROM_ROFS
+#endif
+
+
+// uncomment next line if device DP configuration wanted
+externaltool=configpaging
+
+#if defined EFFICIENT_ROM_PAGING
+externaltool=efficient_rom_paging
+#endif
+
+ROM_IMAGE[0] {
+// Min Max Young/Old NAND page read NAND page read
+// live live page ratio delay CPU overhead
+// pages pages (microseconds) (microseconds)
+//
+demandpagingconfig 256 512 3 0 0
+
+pagingoverride defaultpaged
+
+#if defined USE_CODE_PAGING
+codepagingpolicy defaultpaged
+#endif
+
+#if defined USE_DATA_PAGING
+datapagingpolicy defaultpaged
+#endif
+}
+
+#if defined CODE_PAGING_FROM_ROFS
+ROM_IMAGE[1] {
+pagingoverride defaultpaged
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/pagedrom_functional.oby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,71 @@
+/*
+* 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:
+*
+*/
+#if !defined PAGED_ROM
+#define PAGED_ROM
+#endif
+
+#if !defined EFFICIENT_ROM_PAGING
+// Uncomment next line if efficient rom paging is wanted.
+//#define EFFICIENT_ROM_PAGING
+#endif
+
+#if !defined USE_CODE_PAGING
+// Uncomment next line if code paging is wanted
+#define USE_CODE_PAGING
+#endif
+
+#if !defined USE_DATA_PAGING
+// Uncomment next line if Writable Data Paging is wanted.
+//#define USE_DATA_PAGING
+#endif
+
+#if !defined CODE_PAGING_FROM_ROFS
+// Uncomment next line if code paging from primary rofs is wanted
+#define CODE_PAGING_FROM_ROFS
+#endif
+
+
+// uncomment next line if device DP configuration wanted
+//externaltool=configpaging
+
+#if defined EFFICIENT_ROM_PAGING
+externaltool=efficient_rom_paging
+#endif
+
+ROM_IMAGE[0] {
+// Min Max Young/Old NAND page read NAND page read
+// live live page ratio delay CPU overhead
+// pages pages (microseconds) (microseconds)
+//
+demandpagingconfig 64 128 3 0 0
+
+pagingoverride defaultpaged
+
+#if defined USE_CODE_PAGING
+codepagingpolicy defaultpaged
+#endif
+
+#if defined USE_DATA_PAGING
+datapagingpolicy defaultpaged
+#endif
+}
+
+#if defined CODE_PAGING_FROM_ROFS
+ROM_IMAGE[1] {
+pagingoverride defaultpaged
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/pagedrom_stressed.oby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,71 @@
+/*
+* 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:
+*
+*/
+#if !defined PAGED_ROM
+#define PAGED_ROM
+#endif
+
+#if !defined EFFICIENT_ROM_PAGING
+// Uncomment next line if efficient rom paging is wanted.
+//#define EFFICIENT_ROM_PAGING
+#endif
+
+#if !defined USE_CODE_PAGING
+// Uncomment next line if code paging is wanted
+#define USE_CODE_PAGING
+#endif
+
+#if !defined USE_DATA_PAGING
+// Uncomment next line if Writable Data Paging is wanted.
+//#define USE_DATA_PAGING
+#endif
+
+#if !defined CODE_PAGING_FROM_ROFS
+// Uncomment next line if code paging from primary rofs is wanted
+#define CODE_PAGING_FROM_ROFS
+#endif
+
+
+// uncomment next line if device DP configuration wanted
+externaltool=configpaging:configpaging_stressed.cfg
+
+#if defined EFFICIENT_ROM_PAGING
+externaltool=efficient_rom_paging
+#endif
+
+ROM_IMAGE[0] {
+// Min Max Young/Old NAND page read NAND page read
+// live live page ratio delay CPU overhead
+// pages pages (microseconds) (microseconds)
+//
+demandpagingconfig 128 128 3 0 0
+
+pagingoverride defaultpaged
+
+#if defined USE_CODE_PAGING
+codepagingpolicy defaultpaged
+#endif
+
+#if defined USE_DATA_PAGING
+datapagingpolicy defaultpaged
+#endif
+}
+
+#if defined CODE_PAGING_FROM_ROFS
+ROM_IMAGE[1] {
+pagingoverride defaultpaged
+}
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/textshell.oby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,210 @@
+#ifndef __TEXTSHELL_OBY__
+#define __TEXTSHELL_OBY__
+
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This OBY File is used to build Text Shell ROM Images.
+//
+//
+
+define OBEYFILE TextShell
+define ROMDATE ##TODAY##
+
+#define NO_METROTRK_APP // don't want metrotrk application
+#define HAS_ETHERNET // include etherDrv, ether802, DHCP
+#define SYMBIAN_EXCLUDE_FAX
+#undef __IPSEC
+#define SYMBIAN_EXCLUDE_OBEX
+#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT
+#define _SSMSTARTUPMODE 1 //for ssma boot up.
+#else
+#define _STARTUPMODE1 // for sysstart.iby
+#endif
+
+#define __MMC
+#define __COVER_DISPLAY
+#define __IRDA
+#define __BT
+#define __USB
+#define __CS_VIDEO_TELEPHONY
+#define __DHCP
+#define __COMMON_TSY__EMERGENCY_CALLS_ENABLED_IN_OFFLINE_MODE
+#define __VIBRA
+#define __MTP_PROTOCOL_SUPPORT
+#define __SERIES60_KEYPAD_NO_SLIDER
+#define __DRIVE_MODE
+#define __SERIES60_AMBIENT_LIGHT_SENSOR
+#define __UPNP_PRINT_FRAMEWORK
+#define FF_FMTX
+
+// The following 3 macros need to be removed once LibXML2 is depended
+// by any of the component in textshell image.
+#define SYMBIAN_EXCLUDE_LIBXML2
+#define SYMBIAN_EXCLUDE_LIBXML2_SAX_CPARSER_PLUGIN
+#define SYMBIAN_EXCLUDE_LIBXML2_DOM_XPATH_API
+
+// Various workarounds to avoid dependencies on UIKON
+
+#define __TLS_IBY__ // exclude TLS
+#define __TLSPROVIDER_IBY__ // exclude TLSPROVIDER
+#define __OBEXPROTOCOL_IBY__ // exclude obex.dll etc
+#define __WLANEAPMETHODS_IBY__ // exclude eap_tls.msy & friends
+//
+
+#include <header.iby> /* ROM header definitions */
+#include <base.iby> /* The lowest-level of the operating system */
+
+#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT
+
+#include <ssma.iby> /*System State Management Architecture*/
+#include <ssplugins.iby> /*System State Management Plugins*/
+
+//Include SSM optional components to enable teams to build a plain textshell rom (on the lines of DEF128306),
+//following removal of h4_textshell_rom.oby.
+#include <amastart.iby>
+#include <aplp.iby>
+#include <shma.iby>
+#include <ssrefplugins.iby>
+#else
+#include <sysstart.iby>
+#include <sysstartconfig.iby>
+#endif // SYMBIAN_SYSTEM_STATE_MANAGEMENT
+
+#include <debug.iby>
+file=ABI_DIR\DEBUG_DIR\RUNTESTS.EXE sys\bin\RUNTESTS.EXE
+
+
+file=ABI_DIR\DEBUG_DIR\EDISP.DLL sys\bin\EDISP.DLL
+
+
+#ifdef FULL_WINDOWSERVER
+ ERROR TextShell ROMs currently require the Text window server //#include <wserv.iby>
+#else
+ file=ABI_DIR\DEBUG_DIR\ewsrv.EXE sys\bin\EWSRV.EXE fixed
+ file=ABI_DIR\DEBUG_DIR\ECONS.DLL sys\bin\ECONS.DLL
+#endif
+
+#include <eshell.iby>
+
+#if !defined(FULL_WINDOWSERVER)
+#include <graphics_textshell.iby>
+#endif
+
+#include <centralrepository.iby>
+ file=ABI_DIR\BUILD_DIR\abclient.dll sys\bin\abclient.dll
+
+#include <crypto.iby>
+
+#include <c32.iby>
+#include <ecuart.iby>
+#include <irda.iby>
+#include <bluetooth.iby>
+#include <stdlib.iby>
+#include <gdi.iby>
+#include <fntstore.iby>
+#include <fbserv.iby>
+#include <bitgdi.iby>
+#include <iculayoutengine.iby>
+#include <freetype.iby>
+#include <opengles.iby>
+
+#include <printers.iby>
+
+// include enough multimedia components to keep cone happy. includes symbian optional, reference and replacable components
+#include <mmf.iby>
+#include <mmcommon.iby>
+#include <mdf.iby>
+#include <devvideo.iby>
+#include <devsound_pluginsupport.iby>
+#include <devsound_refplugin.iby>
+#ifdef SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+#include <acf.iby>
+#include <a3fdevsound.iby>
+#include <acl.iby>
+#include <devsoundadaptationinfo.iby>
+#include <refacladaptation.iby>
+#include <refmmrc.iby>
+#include <a3fserverstart.iby>
+#endif // SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+
+#include <traces.iby>
+#include <mmf_plugin.iby>
+#include <omxilcompref.iby>
+#include <omxilcomp.iby>
+#include <omxilcore.iby>
+
+ #include <inetprotutil.iby> /* needed for mmfcontrollerframework.dll */
+ #include <caf.iby> /* needed for mediaclientutils.dll */
+
+
+#include <sysagent.iby>
+
+#include <network.iby>
+ #include <dial.iby> // needed by commsdat
+
+#include <etel.iby>
+#include <smsstack.iby>
+
+#include <etelmm.iby>
+#include <etelpckt.iby>
+#include <mmtsy.iby>
+#include <etelsat.iby>
+#include <sysawatcher.iby>
+
+#include <bafl.iby>
+#include <ecom.iby>
+#include <store.iby>
+#include <dbms.iby>
+#include <pwrcli.iby>
+#include <xml.iby>
+#include <ups.iby>
+#include <securitycommonutils.iby>
+
+/* Feature Management run-time */
+#ifdef SYMBIAN_FEATURE_MANAGER
+
+// Include both old and new components when Feature Manager enabled
+#include <featmgr.iby>
+#include <featreg.iby>
+
+#else
+
+// Include only the original Feature Registry otherwise
+#include <featreg.iby>
+#ifndef ROM_FEATURE_MANAGEMENT
+/* Provide a default configuration file for the feature registry */
+data=EPOCROOT##epoc32\data\config\featreg_default.cfg private\102744CA\featreg.cfg
+#endif
+#endif
+
+#include <testexecute.iby> // Test Execute framework
+
+// Major unwanted extras needed to make the image link correctly
+
+#ifndef __APPARC_IBY__
+REM Satisfy unwanted references to appgrfx.dll
+#include <apparc.iby> /* Application architecture DLLs */
+ #include <emime.iby> /* Mime recognition */
+#endif
+
+#ifndef __CONE_IBY__
+REM Satisfy unwanted reference to cone.dll, usually for CCoeEnv::Static()
+#include <cone.iby>
+ file=ABI_DIR\BUILD_DIR\viewcli.dll sys\bin\viewcli.dll
+ file=ABI_DIR\BUILD_DIR\viewsrv.dll sys\bin\viewsrv.dll
+ #include <egul.iby>
+ #include <numberconversion.iby>
+#endif
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/textshell_Chassis_BATS.oby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,204 @@
+#ifndef __TEXTSHELL_OBY__
+#define __TEXTSHELL_OBY__
+
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This OBY File is used to build Text Shell ROM Images.
+//
+//
+
+define OBEYFILE TextShell
+define ROMDATE ##TODAY##
+
+// Undefine things in global System Include that stops the SymTB textshell rom from working.
+#undef USE_CUSTOM_MMC_PARTITION
+#undef SYMBIAN_EXCLUDE_SCDV
+#undef SYMBIAN_EXCLUDE_KEYMAP
+
+// undef __BT to only get the client side dlls which should be present even if bluetooth hardware not present or not working.
+#undef __BT
+
+#define NO_METROTRK_APP // don't want metrotrk application
+#define HAS_ETHERNET // include etherDrv, ether802, DHCP
+#define SYMBIAN_EXCLUDE_FAX
+#undef __IPSEC
+#define SYMBIAN_EXCLUDE_OBEX
+#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT
+#define _SSMSTARTUPMODE 1 //for ssma boot up.
+#else
+#define _STARTUPMODE1 // for sysstart.iby
+#endif
+
+// The following 3 macros need to be removed once LibXML2 is depended
+// by any of the component in textshell image.
+#define SYMBIAN_EXCLUDE_LIBXML2
+#define SYMBIAN_EXCLUDE_LIBXML2_SAX_CPARSER_PLUGIN
+#define SYMBIAN_EXCLUDE_LIBXML2_DOM_XPATH_API
+
+// Various workarounds to avoid dependencies on UIKON
+
+#define __TLS_IBY__ // exclude TLS
+#define __TLSPROVIDER_IBY__ // exclude TLSPROVIDER
+#define __OBEXPROTOCOL_IBY__ // exclude obex.dll etc
+#define __WLANEAPMETHODS_IBY__ // exclude eap_tls.msy & friends
+//
+
+#include <header.iby> /* ROM header definitions */
+#include <base.iby> /* The lowest-level of the operating system */
+
+#ifdef SYMBIAN_SYSTEM_STATE_MANAGEMENT
+
+#include <ssma.iby> /*System State Management Architecture*/
+#include <ssplugins.iby> /*System State Management Plugins*/
+
+//Include SSM optional components to enable teams to build a plain textshell rom (on the lines of DEF128306),
+//following removal of h4_textshell_rom.oby.
+#include <amastart.iby>
+#include <aplp.iby>
+#include <shma.iby>
+#include <ssrefplugins.iby>
+#include <core/os/platformenv.iby>
+#include <core/os/ssmmapperutility.iby>
+#else
+#include <sysstart.iby>
+#include <sysstartconfig.iby>
+#endif // SYMBIAN_SYSTEM_STATE_MANAGEMENT
+
+#include <debug.iby>
+file=ABI_DIR\DEBUG_DIR\RUNTESTS.EXE sys\bin\RUNTESTS.EXE
+
+
+file=ABI_DIR\DEBUG_DIR\EDISP.DLL sys\bin\EDISP.DLL
+
+
+#ifdef FULL_WINDOWSERVER
+ ERROR TextShell ROMs currently require the Text window server //#include <wserv.iby>
+#else
+ file=ABI_DIR\DEBUG_DIR\ewsrv.EXE sys\bin\EWSRV.EXE fixed
+ file=ABI_DIR\DEBUG_DIR\ECONS.DLL sys\bin\ECONS.DLL
+#endif
+
+#include <eshell.iby>
+
+#if !defined(FULL_WINDOWSERVER)
+#include <graphics_textshell.iby>
+#endif
+
+#include <centralrepository.iby>
+ file=ABI_DIR\BUILD_DIR\abclient.dll sys\bin\abclient.dll
+
+#include <crypto.iby>
+
+#include <c32.iby>
+#include <ecuart.iby>
+#include <irda.iby>
+#include <bluetooth.iby>
+#include <stdlib.iby>
+#include <gdi.iby>
+#include <fntstore.iby>
+#include <fbserv.iby>
+#include <bitgdi.iby>
+#include <iculayoutengine.iby>
+#include <freetype.iby>
+#include <opengles.iby>
+
+#include <printers.iby>
+
+// include enough multimedia components to keep cone happy. includes symbian optional, reference and replacable components
+//#include <mmf.iby>
+//#include <mmcommon.iby>
+//#include <mdf.iby>
+//#include <devvideo.iby>
+//#include <devsound_pluginsupport.iby>
+//#include <devsound_refplugin.iby>
+//#ifdef SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+//#include <acf.iby>
+//#include <a3fdevsound.iby>
+//#include <acl.iby>
+//#include <devsoundadaptationinfo.iby>
+//#include <refacladaptation.iby>
+//#include <refmmrc.iby>
+//#include <a3fserverstart.iby>
+//#endif // SYMBIAN_MULTIMEDIA_A3FDEVSOUND
+
+#include <traces.iby>
+//#include <mmf_plugin.iby>
+//#include <omxilcompref.iby>
+//#include <omxilcomp.iby>
+//#include <omxilcore.iby>
+
+ #include <inetprotutil.iby> /* needed for mmfcontrollerframework.dll */
+ #include <caf.iby> /* needed for mediaclientutils.dll */
+
+
+#include <sysagent.iby>
+
+#include <network.iby>
+ #include <dial.iby> // needed by commsdat
+
+#include <etel.iby>
+#include <smsstack.iby>
+
+#include <etelmm.iby>
+#include <etelpckt.iby>
+#include <mmtsy.iby>
+#include <etelsat.iby>
+#include <sysawatcher.iby>
+
+#include <bafl.iby>
+#include <ecom.iby>
+#include <store.iby>
+#include <dbms.iby>
+#include <pwrcli.iby>
+#include <xml.iby>
+#include <ups.iby>
+#include <securitycommonutils.iby>
+
+/* Feature Management run-time */
+#ifdef SYMBIAN_FEATURE_MANAGER
+
+// Include both old and new components when Feature Manager enabled
+#include <featmgr.iby>
+#include <featreg.iby>
+
+#else
+
+// Include only the original Feature Registry otherwise
+#include <featreg.iby>
+#ifndef ROM_FEATURE_MANAGEMENT
+/* Provide a default configuration file for the feature registry */
+data=EPOCROOT##epoc32\data\config\featreg_default.cfg private\102744CA\featreg.cfg
+#endif
+#endif
+
+#include <testexecute.iby> // Test Execute framework
+
+// Major unwanted extras needed to make the image link correctly
+
+#ifndef __APPARC_IBY__
+REM Satisfy unwanted references to appgrfx.dll
+#include <apparc.iby> /* Application architecture DLLs */
+ #include <emime.iby> /* Mime recognition */
+#endif
+
+//#ifndef __CONE_IBY__
+REM Satisfy unwanted reference to cone.dll, usually for CCoeEnv::Static()
+//#include <cone.iby>
+// file=ABI_DIR\BUILD_DIR\viewcli.dll sys\bin\viewcli.dll
+// file=ABI_DIR\BUILD_DIR\viewsrv.dll sys\bin\viewsrv.dll
+// #include <egul.iby>
+// #include <numberconversion.iby>
+//#endif
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/include/textshell_naviengine_smp.oby Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,21 @@
+// Copyright (c) 2007-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:
+// This OBY File is used to build Text Shell NaviEngine SMP ROM Images.
+//
+//
+
+#define SMP
+#include <naviengine.oby>
+#include <textshell_Chassis_bats.oby>
+#include <platsec.oby>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/tools/cdf.dtd Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,46 @@
+<!ELEMENT component (localisation?,file+)>
+<!ATTLIST component id CDATA #REQUIRED >
+
+<!ELEMENT file (source, destination,
+ localisation?, options? ,
+ features?, dynamicDependencies?)>
+<!ATTLIST file
+ id CDATA #REQUIRED
+ customisable (true|false) #IMPLIED
+ addressable (xip|nonxip|dontcare) #IMPLIED
+ compress (unchanged|compress|uncompress) #IMPLIED
+ type (normal|bitmap|compressedbitmap|autobitmap|aif|plugin) #IMPLIED
+ plugin_name CDATA #IMPLIED>
+
+<!ELEMENT source (#PCDATA)>
+<!ELEMENT destination (#PCDATA)>
+<!ELEMENT features (supports?,prevents?)>
+<!ELEMENT supports (feature+)>
+<!ELEMENT prevents (feature+)>
+
+<!ELEMENT feature EMPTY>
+<!ATTLIST feature uid CDATA #IMPLIED
+ name CDATA #IMPLIED>
+
+<!ELEMENT dynamicDependencies (depend+)>
+<!ELEMENT depend (#PCDATA)>
+<!ELEMENT localisation (default, language*)>
+<!ELEMENT default (#PCDATA)>
+<!ELEMENT language (#PCDATA)>
+<!ELEMENT options ((multilinguify | stack | heapmin |
+ heapmax | fixed | priority |
+ uid1 | uid2 | uid3 |
+ dll | dlldatatop )+)>
+
+<!ELEMENT multilinguify (#PCDATA)>
+
+<!ELEMENT stack (#PCDATA)>
+<!ELEMENT heapmin (#PCDATA)>
+<!ELEMENT heapmax (#PCDATA)>
+<!ELEMENT fixed (#PCDATA)>
+<!ELEMENT priority (#PCDATA)>
+<!ELEMENT uid1 (#PCDATA)>
+<!ELEMENT uid2 (#PCDATA)>
+<!ELEMENT uid3 (#PCDATA)>
+<!ELEMENT dll (#PCDATA)>
+<!ELEMENT dlldatatop (#PCDATA)>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/tools/configpaging/configpaging.cfg Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,27 @@
+#
+# System config v1.0
+#
+
+#
+# To set the default setting use:
+# defaultpaged
+# Or
+# defaultunpaged
+#
+# This will override the paged/unpaged flags in executables and any paged/unpaged attributes in iby files.
+# Do not use a default setting if the existing paged/unpaged flags/attributes are to be respected.
+#
+# To mark executables as not pageable use:
+# <executable regex> unpaged
+# Or
+# unpaged:
+# <executable regex>
+# <executable regex>
+#
+# To include other configuration files within this configuration file use:
+# include "<includefile>"
+#
+# Included files will be processed before the remaining lines of the parent file are processed. Included files
+# can themselves include other other files.
+
+include "configpaging_recommended.cfg"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/tools/configpaging/configpaging_recommended.cfg Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,144 @@
+#
+# This file contains those files that are recommended to be unpaged to maintain performance
+# in demand paging ROMs.
+#
+# unpaged - recommended
+#
+unpaged:
+animation.dll
+animationserver.dll
+animationshared.dll
+animators.dll
+bmpanim.dll
+bmpansrv.dll
+clocka.dll
+cone.dll
+gfxtrans.dll
+gfxtransadapter.dll
+domainpolicy2.dll
+sysstart.exe
+viewcli.dll
+viewsrv.dll
+domaincli.dll
+domainpolicy.dll
+domainsrv.exe
+exstart.dll
+e32strt.exe
+elocl.01
+elocl.02
+elocl.03
+elocl.04
+elocl.05
+elocl.10
+elocl.18
+elocl.19
+elocl.29
+elocl.31
+elocl.32
+elocl.sc
+elocl.loc
+_h4hrp_e32strt.exe
+_h4hrp_e32strt_me.exe
+remconavrcpstatusconverter.dll
+remconstatusapi.dll
+btcomm.csy
+btextnotifiers.dll
+hciproxy.dll
+btmanserver.exe
+bnep.drv
+panagt.agt
+panhelper.dll
+remconextapi1.dll
+sdpagent.dll
+sdpdatabase.dll
+sdpserver.exe
+mrouteragent.agt
+linebreak.dll
+iculayoutengine.dll
+libgles_cm.dll
+egldisplayproperty.dll
+remotegc.dll
+infra-red.prt
+ircomm.csy
+irda.dll
+irdialbca.dll
+irtranp.dll
+msgs.dll
+watcher.exe
+deflatecomp.dll
+sdpcodec.dll
+sigcomp.dll
+sipclient.dll
+sipcodec.dll
+sipdigest.dll
+sipgprsmon.dll
+siph2lanbearermonitor.dll
+sipietfagnt.dll
+sipimsagnt.dll
+sipipsec.dll
+sipprofile.dll
+sipprofilecli.dll
+sipprofilefsm.dll
+sipprofilesrv.exe
+sipproxyrsv.dll
+sipreqhand.dll
+sipresolver.dll
+siprsvclient.dll
+siprsvsrv.exe
+sipserver.exe
+sipsigcomp.dll
+siptls.dll
+sipcpr.dll
+sipdummyprt.prt
+sipparams.dll
+sipscpr.dll
+sipstatemachine.dll
+bitmaptransforms.dll
+bitmaptransformsrefplugin.dll
+imageconversion.dll
+jpegcodec.dll
+jpegexifplugin.dll
+jpegimageframeplugin.dll
+recicl.dll
+iclwrapperimagedisplay.dll
+imagedisplay.dll
+imagedisplayresolver.dll
+imagetransform.dll
+recmmf.dll
+mmruf.dll
+gsmu.dll
+smsprot.prt
+smsu.dll
+wapprot.prt
+cdmasms.prt
+cdmau.dll
+cdmawapprot.prt
+dhcpserv.exe
+netcfgextndhcp.dll
+obex.dll
+obexbtrfcommtransportcontroller.dll
+obexcommontransport.dll
+obexirdattptransportcontroller.dll
+obexusbtransportcontroller.dll
+obexextensionapis.dll
+randsvr.exe
+swtlstokentypeplugin.dll
+tlscacheclient.dll
+tlscacheserver.exe
+tlsprovider.dll
+acmclasscontroller.dll
+msclasscontroller.dll
+obexclasscontroller.dll
+usbclasscontroller.dll
+whcmclasscontroller.dll
+bafl.dll
+centralrepository.dll
+centralrepositorysrv.exe
+charconv.dll
+ecom.dll
+ecomserver.exe
+ecompatchdata.dll
+estlib.dll
+indicatorwatcher.dll
+signalstrengthwatcher.dll
+telwatcherbase.dll
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/tools/configpaging/configpaging_stressed.cfg Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,33 @@
+#
+# Stressed paging configuration
+#
+
+#
+# To set the default setting use:
+# defaultpaged
+# Or
+# defaultunpaged
+#
+# This will override the paged/unpaged flags in executables and any paged/unpaged attributes in iby files.
+# Do not use a default setting if the existing paged/unpaged flags/attributes are to be respected.
+#
+# To mark executables as not pageable use:
+# <executable regex> unpaged
+# Or
+# unpaged:
+# <executable regex>
+# <executable regex>
+#
+# To include other configuration files within this configuration file use:
+# include "<includefile>"
+#
+# Included files will be processed before the remaining lines of the parent file are processed. Included files
+# can themselves include other other files.
+
+defaultpaged
+
+#
+# mandatory locked-down list. This should only contain executables that use realtime APIs and their
+# dependencies, which would otherwise panic if they took a page fault
+#
+#unpaged:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/tools/featuredatabase.dtd Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,38 @@
+<!ELEMENT hrhmacro EMPTY>
+<!ATTLIST hrhmacro
+ exclude CDATA #IMPLIED
+ include CDATA #IMPLIED
+ infeaturesetiby CDATA #IMPLIED>
+
+<!ELEMENT hfileheader (#PCDATA)>
+<!ATTLIST hfileheader
+ interfacestatus CDATA #REQUIRED
+ interfacevisibility CDATA #REQUIRED>
+
+<!ELEMENT featureset ((hfileheader?, (featureoverride|feature)+))>
+<!ATTLIST featureset
+ hfilename CDATA #IMPLIED
+ ibyname CDATA #IMPLIED
+ namespace CDATA #IMPLIED>
+
+<!ELEMENT featuredatabase ((featureset+, defaultfeaturerange*))>
+<!ELEMENT feature ((hrhmacro?, comment?))>
+<!ATTLIST feature
+ name CDATA #REQUIRED
+ statusflags CDATA #REQUIRED
+ uid CDATA #REQUIRED
+ userdata CDATA #IMPLIED>
+
+<!ELEMENT featureoverride ((hrhmacro?, comment?))>
+<!ATTLIST featureoverride
+ name CDATA #REQUIRED
+ statusflags CDATA #IMPLIED
+ uid CDATA #REQUIRED
+ userdata CDATA #IMPLIED>
+
+<!ELEMENT defaultfeaturerange ((comment?))>
+<!ATTLIST defaultfeaturerange
+ higheruid CDATA #REQUIRED
+ loweruid CDATA #REQUIRED>
+
+<!ELEMENT comment (#PCDATA)>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/tools/featureuids.dtd Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,16 @@
+<!ELEMENT featureuids (features,default)>
+<!ELEMENT features (feature+)>
+<!ELEMENT feature EMPTY>
+
+<!ATTLIST feature
+ name CDATA #REQUIRED
+ uid CDATA #REQUIRED
+ installable (true|false) #IMPLIED>
+
+<!ELEMENT default (range+)>
+<!ELEMENT range EMPTY>
+<!ATTLIST range
+ min CDATA #REQUIRED
+ max CDATA #REQUIRED
+ support (include|exclude) #REQUIRED>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/romkiteka2/tools/imageContent.dtd Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,73 @@
+<!ELEMENT imageContent (version?, romchecksum?, time?,
+ options?, romgeometry, romtarget, romscope?)+>
+
+<!ELEMENT version (#PCDATA)>
+<!ELEMENT romchecksum (#PCDATA)>
+<!ELEMENT time (#PCDATA)>
+<!ELEMENT romgeometry (image+)>
+<!ELEMENT romtarget (target+)>
+<!ELEMENT romscope ((obyFile|cdf)+)>
+
+<!ELEMENT options ((binaryselectionorder | trace | bootbinary |
+ dataaddress | debugport |
+ defaultstackreserve | device |
+ wrapper | kernel | primary+ |
+ secondary+ | romalign | romlinearbase |
+ variant | autosize | extension | coreimage)+)>
+
+<!ELEMENT binaryselectionorder (#PCDATA)>
+<!ELEMENT trace (#PCDATA)>
+<!ELEMENT bootbinary (#PCDATA)>
+<!ELEMENT wrapper (#PCDATA)>
+<!ATTLIST wrapper type (none|epoc|coff) #REQUIRED>
+
+<!ELEMENT kernel (dataaddress, heapmax, heapmin, name, trace?)>
+<!ATTLIST kernel number (single|multi) #IMPLIED>
+
+<!ELEMENT heapmax (#PCDATA)>
+<!ELEMENT heapmin (#PCDATA)>
+<!ELEMENT name (#PCDATA)>
+
+<!ELEMENT dataaddress (#PCDATA)>
+<!ELEMENT debugport (#PCDATA)>
+<!ELEMENT defaultstackreserve (#PCDATA)>
+<!ELEMENT device (file+)>
+<!ELEMENT primary (file+)>
+<!ELEMENT secondary (file+)>
+<!ELEMENT variant (file+)>
+<!ELEMENT extension (file+)>
+<!ELEMENT romalign (#PCDATA)>
+<!ELEMENT romlinearbase (#PCDATA)>
+<!ELEMENT autosize (#PCDATA)>
+<!ELEMENT coreimage (#PCDATA)>
+
+<!ELEMENT file (source,destination,fixed?)>
+<!ATTLIST file
+ id CDATA #REQUIRED>
+<!ELEMENT source (#PCDATA)>
+<!ELEMENT destination (#PCDATA)>
+<!ELEMENT fixed (#PCDATA)>
+
+
+<!ELEMENT image (partition?)>
+<!ATTLIST image
+ id CDATA #REQUIRED
+ name CDATA #REQUIRED
+ type (xip|nonxip) #REQUIRED
+ compression (compress|nocompress) #IMPLIED
+ extension (yes|no) "no"
+ size CDATA #REQUIRED>
+
+<!ELEMENT target (include,exclude?)>
+<!ATTLIST target imageid CDATA #REQUIRED>
+<!--- target imageid of any allowed where it there is no constraints on
+ which image the files should be placed. -->
+<!ELEMENT include ((feature|obyFile|cdf)+)>
+<!ELEMENT exclude (feature+)>
+<!ELEMENT partition (#PCDATA)>
+<!ELEMENT feature EMPTY>
+<!ATTLIST feature name CDATA #IMPLIED
+ uid CDATA #IMPLIED>
+<!ELEMENT obyFile (#PCDATA)>
+<!ELEMENT cdf (#PCDATA)>
+<!ATTLIST cdf type (file|dir) "file">
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hostenv/unzip-5.40/group/unzip-5.40.mrp.bak Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,23 @@
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+component dev_build_dist_unzip-5.40
+
+source \src\tools\build\dist\unzip-5.40
+exports \src\tools\build\dist\unzip-5.40\group
+
+notes_source \src\tools\build\dist\unzip-5.40\group\release.txt
+
+ipr T
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hostenv/zip-2.2/group/zip-2.2.mrp.bak Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,23 @@
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+component dev_build_dist_zip-2.2
+
+source \src\tools\build\dist\zip-2.2
+exports \src\tools\build\dist\zip-2.2\group
+
+notes_source \src\tools\build\dist\zip-2.2\group\release.txt
+
+ipr T
\ No newline at end of file
--- a/imgtools/buildrom/group/release.txt Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/buildrom/group/release.txt Mon Oct 18 10:23:52 2010 +0100
@@ -1,3 +1,24 @@
+Version 3.30.0 (BUILDROM)
+===============
+Released by Lorence Wang, 12/10/2010
+ 1) ROM tools performance improvement: ignore configuration check.
+
+Version 3.29.1 (BUILDROM)
+===============
+Released by Zheng Shen, 30/09/2010
+ 1) ou1cimx1#577011 [MCL]Fallback failed in case of {} exists in filename, and file doesn't exists in default ABI folder
+
+Version 3.29.0 (BUILDROM)
+===============
+Released by Lorence Wang, 17/09/2010
+ 1) Whole directory support in FAT.
+
+Version 3.28.1 (BUILDROM)
+===============
+Released by Lorence Wang, 13/09/2010
+ 1) ou1cimx1#560005 Buildrom failed with -workdir="folder of different drive"
+ 2) ou1cimx1#563537 Rofsbuild generates the log file for smr image and datadrive image in wrong location
+
Version 3.28.0 (BUILDROM)
===============
Released by Marvin Shi, 7/09/2010
--- a/imgtools/buildrom/tools/buildrom.pl Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/buildrom/tools/buildrom.pl Mon Oct 18 10:23:52 2010 +0100
@@ -53,13 +53,15 @@
# Processes the buildrom command line parameters.
&process_cmdline_arguments;
- &image_content_processing_phase;
+ my $ignoreconfig = &isIgnoreConfig;
+
+ &image_content_processing_phase if(!$ignoreconfig);
#Processes intermediate oby files. Also processes any new option added to the buildrom in future.
- &processobyfiles;
+ &processobyfiles if(!$ignoreconfig);
# Suppress ROM/ROFS/DataDrive Image creation if "-noimage" option is provided.
- &suppress_image_generation;
+ &suppress_image_generation if(!$ignoreconfig);
#Invokes ROMBUILD and ROFSBUILD
&invoke_rombuild;
--- a/imgtools/buildrom/tools/buildrom.pm Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/buildrom/tools/buildrom.pm Mon Oct 18 10:23:52 2010 +0100
@@ -57,6 +57,7 @@
processData
create_smrimage
getWorkdir
+ isIgnoreConfig
);
my $useinterpretsis = 1;
@@ -66,7 +67,7 @@
my $enforceFeatureManager = 0; # Flag to make Feature Manager mandatory if SYMBIAN_FEATURE_MANAGER macro is defined.
my $BuildromMajorVersion = 3 ;
-my $BuildromMinorVersion = 28;
+my $BuildromMinorVersion = 30;
my $BuildromPatchVersion = 0;
@@ -159,6 +160,9 @@
-stdcpp -- ignore symbian customized cpp and try to find another cpp in the PATH.(for Windows only)
-cpp=xxx -- specify a CPP preprocessor used by Buildrom.
-xiponly -- just create the XIP ROM image without creating the ROFS image.
+ -inputoby=<finalOBYfile> -- Ignore BUILDROM config phase, invoke Rombuild/Rofsbuild using <finalOBYfile>.
+ <finalOBYfile> must contain one and ONLY one of romsize/rofssize/dataimagename/imagename keywords,
+ The keywords will be used to identify the OBY type.
Popular -D defines to use include
@@ -354,6 +358,8 @@
my $cppoption = 0;
my $preprocessor = "cpp";
my $opt_xiponly = 0;
+my $ignoreconfig = 0;
+my $romcount = 0;
sub match_obyfile
{
@@ -424,7 +430,8 @@
$compress =~m/\s-(compression)(method)\s(none|inflate|bytepair)/;
print "* ".$1." ".$2.": ".$3;
}
- my $command = "rofsbuild -slog".$compress." -datadrive=$obeyfile.oby";
+ my $command = "rofsbuild -slog".$compress." -datadrive=$obeyfile.oby -logfile=$thisdir";
+ $command .= " -k" if($opt_k);
print "* Executing $command\n" if ($opt_v);
system($command);
if ($? != 0)
@@ -505,129 +512,132 @@
{
if($dataImageCount)
{
- # set the default path for Z drive and Data drive directory,
- # if and only if, path is not specified by the user.
- $ZDirloc = $thisdir."zdrive" unless ($ZDirloc);
- $DataDriveDirloc = $thisdir."datadrive" unless ($DataDriveDirloc);
- #delete any existing Z drive directory.
- my $retVal = &datadriveimage::deleteDirectory($ZDirloc,$opt_v)if(!$opt_r);
- if($retVal)
- {
- exit(1) if(!$opt_k);
- }
- # delete pre-existence of data drive folder, if and only if -r option is not enabled.
- $retVal = &datadriveimage::deleteDirectory($DataDriveDirloc,$opt_v) if(!$opt_r);
- if($retVal)
+ if(!$ignoreconfig)
{
- exit(1) if(!$opt_k);
- }
- if($opt_logFile)
- {
- # clean any pre-existance of log file.
- unlink($ZDirloc."\/".$imageEntryLogFile);
- }
-
- for (my $datadriveidx=0; $datadriveidx < $dataImageCount; $datadriveidx++)
- {
- my $driveIndex = $dataIndexHash{$datadriveidx};
- # get the data drive name.
- if( defined( $driveIndex ) )
+ # set the default path for Z drive and Data drive directory,
+ # if and only if, path is not specified by the user.
+ $ZDirloc = $thisdir."zdrive" unless ($ZDirloc);
+ $DataDriveDirloc = $thisdir."datadrive" unless ($DataDriveDirloc);
+ #delete any existing Z drive directory.
+ my $retVal = &datadriveimage::deleteDirectory($ZDirloc,$opt_v)if(!$opt_r);
+ if($retVal)
+ {
+ exit(1) if(!$opt_k);
+ }
+ # delete pre-existence of data drive folder, if and only if -r option is not enabled.
+ $retVal = &datadriveimage::deleteDirectory($DataDriveDirloc,$opt_v) if(!$opt_r);
+ if($retVal)
{
- my $datadrivename=$datadriveimage[$driveIndex]{obeyfile};
- # get the size of the data drive.
- my $size = $datadriveimage[$driveIndex]{size};
- if( $datadrivename )
+ exit(1) if(!$opt_k);
+ }
+ if($opt_logFile)
+ {
+ # clean any pre-existance of log file.
+ unlink($ZDirloc."\/".$imageEntryLogFile);
+ }
+
+ for (my $datadriveidx=0; $datadriveidx < $dataImageCount; $datadriveidx++)
+ {
+ my $driveIndex = $dataIndexHash{$datadriveidx};
+ # get the data drive name.
+ if( defined( $driveIndex ) )
{
- # set data drive oby file.
- my $datadriveobyfile = $datadrivename.".oby";
- # final location of prototype data drive.
- my $proDataDriveDirloc;
- # Location of stub-sis file(s) inside Z Drive folder.
- my $zDriveSisFileLoc;
- # check if more than one data drive image needs to be generated.
- if ($datadrivename =~ /.*[\\\/]([^\\\/]+)$/)
- {
- $datadrivename = $1;
- }
- if( $dataImageCount > 1 )
- {
- # if yes, then set the location of prototype data drive folder as
- # DataDriveDirloc + datadrivename
- $proDataDriveDirloc = $DataDriveDirloc."\/".$datadrivename;
- }
- else
+ my $datadrivename=$datadriveimage[$driveIndex]{obeyfile};
+ # get the size of the data drive.
+ my $size = $datadriveimage[$driveIndex]{size};
+ if( $datadrivename )
{
- # else, then set the location of prototype data drive folder as DataDriveDirloc
- $proDataDriveDirloc = $DataDriveDirloc;
- }
-
- # create prototype data drive folder.
- print "creating data drive folder\n" if ($opt_v);
- &datadriveimage::createDirectory($proDataDriveDirloc);
-
- # check for sis file keyword in ROM description file.
- # if found,then locate for stub-sisfile.
- # create Z drive( if and only if stub-sis files are present in ROM description file )
- # and dump all the non-sis files on to the Z drive folder.
- if(&datadriveimage::checkForSisFile($datadriveobyfile,\@sisfilelist,\$sisfilepresent))
- {
- my $zDriveImagePresent = 0; # flag to check whether z drive image is Present;
- if(&datadriveimage::checkForZDriveImageKeyword($datadriveobyfile,\@zDriveImageList,\$zDriveImagePresent) )
+ # set data drive oby file.
+ my $datadriveobyfile = $datadrivename.".oby";
+ # final location of prototype data drive.
+ my $proDataDriveDirloc;
+ # Location of stub-sis file(s) inside Z Drive folder.
+ my $zDriveSisFileLoc;
+ # check if more than one data drive image needs to be generated.
+ if ($datadrivename =~ /.*[\\\/]([^\\\/]+)$/)
{
- # find out size of the array
- my $arraysize = scalar(@zDriveImageList);
- for( my $i=0; $i < $arraysize; $i++ )
- {
- $zDriveSisFileLoc = $ZDirloc."\/".$datadrivename;
- &datadriveimage::invokeReadImage(pop(@zDriveImageList),$zDriveSisFileLoc,$opt_v,$imageEntryLogFile,$opt_k);
- }
+ $datadrivename = $1;
+ }
+ if( $dataImageCount > 1 )
+ {
+ # if yes, then set the location of prototype data drive folder as
+ # DataDriveDirloc + datadrivename
+ $proDataDriveDirloc = $DataDriveDirloc."\/".$datadrivename;
}
else
{
- $zDriveSisFileLoc = $ZDirloc;
- # locate and copy stub-sis file(s),for the first time.
- if( !$zDrivePresent )
+ # else, then set the location of prototype data drive folder as DataDriveDirloc
+ $proDataDriveDirloc = $DataDriveDirloc;
+ }
+
+ # create prototype data drive folder.
+ print "creating data drive folder\n" if ($opt_v);
+ &datadriveimage::createDirectory($proDataDriveDirloc);
+
+ # check for sis file keyword in ROM description file.
+ # if found,then locate for stub-sisfile.
+ # create Z drive( if and only if stub-sis files are present in ROM description file )
+ # and dump all the non-sis files on to the Z drive folder.
+ if(&datadriveimage::checkForSisFile($datadriveobyfile,\@sisfilelist,\$sisfilepresent))
+ {
+ my $zDriveImagePresent = 0; # flag to check whether z drive image is Present;
+ if(&datadriveimage::checkForZDriveImageKeyword($datadriveobyfile,\@zDriveImageList,\$zDriveImagePresent) )
{
- # check for image file.
- if( $opt_zimage )
+ # find out size of the array
+ my $arraysize = scalar(@zDriveImageList);
+ for( my $i=0; $i < $arraysize; $i++ )
{
- # image(s)supplied to BUILDROM(like rom,rofs,extrofs or core) using "-zdriveimage" option,
- # are maintained in a seperate array and the element from the array is fetched one by one and is
- # fed to READIMAGE as an input.
- foreach my $element (@zdriveImageName)
+ $zDriveSisFileLoc = $ZDirloc."\/".$datadrivename;
+ &datadriveimage::invokeReadImage(pop(@zDriveImageList),$zDriveSisFileLoc,$opt_v,$imageEntryLogFile,$opt_k);
+ }
+ }
+ else
+ {
+ $zDriveSisFileLoc = $ZDirloc;
+ # locate and copy stub-sis file(s),for the first time.
+ if( !$zDrivePresent )
+ {
+ # check for image file.
+ if( $opt_zimage )
{
- # invoke READIMAGE to extract all /swi stub sis file(s) from the given image.
- $zDrivePresent = &datadriveimage::invokeReadImage($element,$zDriveSisFileLoc,$opt_v,$imageEntryLogFile,$opt_k);
+ # image(s)supplied to BUILDROM(like rom,rofs,extrofs or core) using "-zdriveimage" option,
+ # are maintained in a seperate array and the element from the array is fetched one by one and is
+ # fed to READIMAGE as an input.
+ foreach my $element (@zdriveImageName)
+ {
+ # invoke READIMAGE to extract all /swi stub sis file(s) from the given image.
+ $zDrivePresent = &datadriveimage::invokeReadImage($element,$zDriveSisFileLoc,$opt_v,$imageEntryLogFile,$opt_k);
+ }
}
- }
- else
- {
- # if zdrive image(s) such as (rom,core,rofs or extrofs) are generated ealier to the data drive image processing
- # then these images are maintained in an array and the element from the array is fetched one by one and is
- # fed to READIMAGE as an input.
- foreach my $element (@romImages)
+ else
{
- # invoke READIMAGE to extract all /swi stub sis file(s) from the given image.
- $zDrivePresent = &datadriveimage::invokeReadImage($element,$zDriveSisFileLoc,$opt_v,$imageEntryLogFile,$opt_k);
+ # if zdrive image(s) such as (rom,core,rofs or extrofs) are generated ealier to the data drive image processing
+ # then these images are maintained in an array and the element from the array is fetched one by one and is
+ # fed to READIMAGE as an input.
+ foreach my $element (@romImages)
+ {
+ # invoke READIMAGE to extract all /swi stub sis file(s) from the given image.
+ $zDrivePresent = &datadriveimage::invokeReadImage($element,$zDriveSisFileLoc,$opt_v,$imageEntryLogFile,$opt_k);
+ }
}
}
}
+ # invoke INTERPRETSIS tool with z drive folder location.
+ if ($useinterpretsis)
+ {
+ &datadriveimage::invokeInterpretsis( \@sisfilelist,$proDataDriveDirloc,$opt_v,$zDriveSisFileLoc,$paraFile,$opt_k,\@interpretsisOptList,$thisdir)if($sisfilepresent);
+ }else
+ {
+ print "Warning: interpretsis is not ready on linux.\n";
+ }
}
- # invoke INTERPRETSIS tool with z drive folder location.
- if ($useinterpretsis)
- {
- &datadriveimage::invokeInterpretsis( \@sisfilelist,$proDataDriveDirloc,$opt_v,$zDriveSisFileLoc,$paraFile,$opt_k,\@interpretsisOptList,$thisdir)if($sisfilepresent);
- }else
- {
- print "Warning: interpretsis is not ready on linux.\n";
- }
+
+ # create an oby file by traversing through upated prototype data drive directory.
+ &datadriveimage::dumpDatadriveObydata( $proDataDriveDirloc,$datadriveobyfile,$size,\@nonsisFilelist,
+ \@renameList,\@aliaslist,\@hideList,\@sisobydata,\@datadrivedata,$opt_k,$opt_v );
+ #reset sisfilepresent flag to zero;
+ $sisfilepresent =0;
}
-
- # create an oby file by traversing through upated prototype data drive directory.
- &datadriveimage::dumpDatadriveObydata( $proDataDriveDirloc,$datadriveobyfile,$size,\@nonsisFilelist,
- \@renameList,\@aliaslist,\@hideList,\@sisobydata,\@datadrivedata,$opt_k,$opt_v );
- #reset sisfilepresent flag to zero;
- $sisfilepresent =0;
}
}
}
@@ -902,7 +912,7 @@
next;
}
#Process imagecontent file
- if( $arg =~ /^-i(.*)/)
+ if( $arg =~ /^-i(.*)/ && $arg !~ /^-input(.*)/)
{
# Disabling -i option
print "Warning: Ignoring invalid Option $arg \n";
@@ -1106,6 +1116,61 @@
}
next;
}
+ if ($arg =~ /^-inputoby=(.*)/)
+ {
+ $ignoreconfig =1;
+ my $ignoreoby = $1;
+ $ignoreoby .= ".oby" unless $ignoreoby =~ /\.oby$/i;
+ die "$ignoreoby file does not exist!!\n" if (!-e $ignoreoby);
+ open IGNORE, "$ignoreoby" or die("* Can't open $ignoreoby\n");
+ my @lines = <IGNORE>;
+ close IGNORE;
+ my $keywordcount = 0;
+ my $romimgcount = 0;
+ my $rofsimgcount = 0;
+ my $fatcount = 0;
+ my $smrcount = 0;
+ foreach my $line (@lines)
+ {
+ if ($line =~ /^\s*romsize\s*=/)
+ {
+ next if ($romimgcount);
+ $romimgcount = 1;
+ $keywordcount ++;
+ $ignoreoby =~ s/\.oby$//i;
+ $romimage[$romcount] = {xip=>1, obeyfile=>$ignoreoby, compress=>0, extension=>0, composite=>"none",uncompress=>0 };
+ $romcount ++;
+ }elsif ($line =~ /^\s*rofssize\s*=/)
+ {
+ next if ($rofsimgcount);
+ $rofsimgcount = 1;
+ $keywordcount ++;
+ $ignoreoby =~ s/\.oby$//i;
+ $romimage[$romcount] = {xip=>0, obeyfile=>$ignoreoby, compress=>0, extension=>0, composite=>"none",uncompress=>0 };
+ $romcount ++;
+ }elsif ($line =~ /^\s*dataimagename\s*=/)
+ {
+ next if ($fatcount);
+ $fatcount = 1;
+ $keywordcount ++;
+ $ignoreoby =~ s/\.oby$//i;
+ $datadriveimage[$dataImageCount] = {obeyfile=>$ignoreoby, compress=>0, uncompress=>0};
+ $dataImageCount ++;
+ $dataIndexHash{0} = 0;
+ }elsif ($line =~ /^\s*imagename\s*=/)
+ {
+ next if ($smrcount);
+ $smrcount = 1;
+ $keywordcount ++;
+ $ignoreoby =~ s/\.oby$//i;
+ $needSmrImage = 1;
+ push @obeyFileList, $ignoreoby;
+ }
+ }
+ die "$ignoreoby file does not contain keywords romsize/rofssize/dataimagename/imagename, cannot identify the oby type!\n" if ($keywordcount == 0);
+ die "$ignoreoby file contains $keywordcount keywords of romsize/rofssize/dataimagename/imagename, cannot identify the oby type! Maybe $ignoreoby is not a final oby file.\n" if ($keywordcount > 1);
+ next;
+ }
if( $arg =~ /^-loglevel\d+$/)
{
$logLevel= $arg;
@@ -1258,7 +1323,8 @@
return;
}
- if (@obyfiles<1)
+ $preserve = 1 if ($ignoreconfig);
+ if (@obyfiles<1 && !$ignoreconfig)
{
print "Missing obyfile argument\n";
$errors++ if(!$opt_k);
@@ -3250,6 +3316,7 @@
$from =~ s/\\/\\\\/g;
$from =~ s/\//\\\//g; # need to escape backslashes
$from =~ s/(\[|\])/\\$1/g; # need to escape square brackets for file names like "featreg.cfg[x-y]",etc.
+ $from =~ s/(\{|\})/\\$1/g; # need to escape brace for file names like "mydll{00010001}.dll",etc.
my $into = $fileExists;
$line =~ s/$from/$into/i;
@@ -3607,7 +3674,7 @@
{
return $line;
}
- elsif($line =~ /^\s*dir\s*=.*/i)
+ elsif($line =~ /^\s*(dir|dircopy)\s*=.*/i)
{
return $line;
}
@@ -4868,7 +4935,8 @@
foreach my $oby (@obeyFileList)
{
is_existinpath("rofsbuild", romutl::ERROR_NOT_FOUND);
- my $command = "rofsbuild -slog -smr=$oby.oby";
+ my $command = "rofsbuild -slog -smr=$oby.oby -logfile=$thisdir";
+ $command .= " -k" if($opt_k);
print "* Executing $command\n" if($opt_v);
system($command);
if($? != 0)
@@ -4913,6 +4981,11 @@
return $thisdir;
}
+sub isIgnoreConfig
+{
+ return $ignoreconfig;
+}
+
sub find_stdcpp
{
return "cpp" if (!$stdcpp);
--- a/imgtools/buildrom/tools/datadriveimage.pm Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/buildrom/tools/datadriveimage.pm Mon Oct 18 10:23:52 2010 +0100
@@ -288,20 +288,35 @@
open (OBEY ,$obyfile) or die($obyfile."\n");
while(my $line =<OBEY>)
{
- if( $line =~ /^(file|data)\s*=\s*(\"[^"]+\")\s+(\"[^"]+\")/i ||
- $line =~ /^(file|data)\s*=\s*(\"[^"]+\")\s+(\S+)/i ||
- $line =~ /^(file|data)\s*=\s*(\S+)\s+(\"[^"]+\")/i ||
- $line =~ /^(file|data)\s*=\s*(\S+)\s+(\S+)/i )
+ if( $line =~ /^(file|data|dircopy)\s*=\s*(\"[^"]+\")\s+(\"[^"]+\")/i ||
+ $line =~ /^(file|data|dircopy)\s*=\s*(\"[^"]+\")\s+(\S+)/i ||
+ $line =~ /^(file|data|dircopy)\s*=\s*(\S+)\s+(\"[^"]+\")/i ||
+ $line =~ /^(file|data|dircopy)\s*=\s*(\S+)\s+(\S+)/i )
{
my $keyWord=$1;
my $source=$2;
my $dest=$3;
- if( $source !~ /(\S+):([^"]+)/ )
- {
- $source = get_drive().$2;
+ my $currentdir=cwd;
+ $currentdir=~s-\\-\/-go;
+ $currentdir.= "\/" unless $currentdir =~ /\/$/;
+ $currentdir =~ s-\/-\\-g if (&is_windows);
+ my $drive = "";
+ $drive = $1 if ($currentdir =~ /^(.:)/);
+ $source =~ s/\"//g;
+ if ($source =~ /^[\\\/]/)
+ {
+ $source = $drive.$source;
+ }elsif ($source !~ /^.:/)
+ {
+ $source = $currentdir.$source;
}
- my $var = ©FilesToFolders( $source,$dest,$dir,$verboseOpt);
+ $source = "\"".$source."\"";
+
+ my $var = $source;
+ if ($keyWord ne "dircopy"){
+ $var = ©FilesToFolders( $source,$dest,$dir,$verboseOpt);
+ }
if($var)
{
$line = $keyWord."=".$var."\t".$dest."\n";
@@ -371,8 +386,6 @@
my $command = "interpretsis ";
my $vOption = "-w info" if ($verboseOpt);
- is_existinpath("interpretsis", romutl::DIE_NOT_FOUND);
-
# do a check if the path has a white space.
if( $dataDrivePath =~ m/ /)
{
@@ -457,6 +470,11 @@
print "* Changing to $outputdir\n" if ( $verboseOpt );
chdir "$outputdir";
+ my $epocroot = &get_epocroot;
+ if ($epocroot !~ /^(.:)/)
+ {
+ $ENV{EPOCROOT} = $drive.$epocroot;
+ }
print "* Executing $command\n" if ( $verboseOpt );
system ( $command );
@@ -467,6 +485,7 @@
print "* Changing back to $currentdir\n" if ( $verboseOpt );
chdir "$currentdir";
+ $ENV{EPOCROOT} = $epocroot;
}
# invoke the READIMAGE tool with appropriate parameters.
@@ -654,7 +673,7 @@
my $linekeyword = "alias";
&compareArrays($aliasArray,$nonsisFileArray,$linesource,$linedest,$linekeyword);
}
- elsif( $line =~ /^(file|data)\s*=\s*/i || $line =~ /^\s*(zdriveimagename|sisfile)\s*=\s*/i )
+ elsif( $line =~ /^(file|data|dircopy)\s*=\s*/i || $line =~ /^\s*(zdriveimagename|sisfile)\s*=\s*/i )
{
# skip to next line.
next;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/version.hpp Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,35 @@
+// Boost version.hpp configuration header file ------------------------------//
+
+// (C) Copyright John maddock 1999. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+// See http://www.boost.org/libs/config for documentation
+
+#ifndef BOOST_VERSION_HPP
+#define BOOST_VERSION_HPP
+
+//
+// Caution, this is the only boost header that is guarenteed
+// to change with every boost release, including this header
+// will cause a recompile every time a new boost version is
+// released.
+//
+// BOOST_VERSION % 100 is the patch level
+// BOOST_VERSION / 100 % 1000 is the minor version
+// BOOST_VERSION / 100000 is the major version
+
+#define BOOST_VERSION 103900
+
+//
+// BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION
+// but as a *string* in the form "x_y[_z]" where x is the major version
+// number, y is the minor version number, and z is the patch level if not 0.
+// This is used by <config/auto_link.hpp> to select which library version to link to.
+
+#define BOOST_LIB_VERSION "1_39"
+
+#endif
+
+
+
--- a/imgtools/imglib/compress/byte_pair.h Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/imglib/compress/byte_pair.h Mon Oct 18 10:23:52 2010 +0100
@@ -19,9 +19,10 @@
#define BYTE_PAIR_H
-#ifdef __VC32__
- #ifdef __MSVCDOTNET__
- #include <strstream>
+#ifdef _MSC_VER
+ #if (_MSC_VER > 1200)
+ #define __MSVCDOTNET__ 1
+ #include <sstream>
#include <iomanip>
#else //!__MSVCDOTNET__
#include <strstrea.h>
--- a/imgtools/imglib/host/h_utl.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/imglib/host/h_utl.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -19,11 +19,7 @@
#define __INCLUDE_CAPABILITY_NAMES__
-#if defined(_MSVCDOTNET__) || defined(__TOOLS2__)
-#else //!__MSVCDOTNET__
-#include <string.h>
-#endif //__MSVCDOTNET__
#include <stdarg.h>
#include <stdlib.h>
@@ -33,6 +29,12 @@
#include "h_utl.h"
+#if defined(__MSVCDOTNET__)|| defined(__TOOLS2__)
+
+#else //!__MSVCDOTNET__
+#include <string.h>
+#endif //__MSVCDOTNET__
+
#ifdef __LINUX__
// Convert the supplied string to uppercase, in-place
@@ -155,7 +157,7 @@
TVersion::TVersion(TInt aMajor, TInt aMinor, TInt aBuild)
: iMajor((TInt8)aMajor), iMinor((TInt8)aMinor), iBuild((TInt16)aBuild)
{}
-#ifdef __TOOLS2__
+#if defined(__TOOLS2__ ) || defined(__MSVCDOTNET__ )
istringstream &operator>>(istringstream &is, TVersion &aVersion)
#else
istrstream &operator>>(istrstream &is, TVersion &aVersion)
@@ -164,7 +166,7 @@
// Input a TVersion with syntax: major[.minor][(build)]
//
{
-#ifdef __TOOLS2__
+#if defined(__TOOLS2__ ) || defined(__MSVCDOTNET__ )
string tmp = is.str();
const char *str=tmp.c_str();
#else
@@ -192,7 +194,7 @@
{
cout << "\n Warning: major version must be in range 0 - 127 \n";
}
- char* pMinor = strchr(str, '.');
+ char* pMinor = (char*)strchr(str, '.');
if (pMinor)
{
pMinor++;
@@ -300,7 +302,7 @@
TInt sec=0;
TInt mill=0;
char ch;
- #ifdef __TOOLS2__
+ #if defined(__TOOLS2__) || defined(__MSVCDOTNET__)
istringstream val(aString);
#else
istrstream val(aString,strlen(aString));
--- a/imgtools/imglib/inc/h_utl.h Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/imglib/inc/h_utl.h Mon Oct 18 10:23:52 2010 +0100
@@ -21,10 +21,11 @@
//
#include <stdio.h>
-#ifdef __VC32__
- #ifdef __MSVCDOTNET__
+#ifdef _MSC_VER
+ #if (_MSC_VER > 1200) //!__MSVCDOTNET__
+ #define __MSVCDOTNET__ 1
#include <iostream>
- #include <strstream>
+ #include <sstream>
#include <fstream>
using namespace std;
#else //!__MSVCDOTNET__
@@ -151,7 +152,7 @@
TAny *operator new(TUint aSize);
void operator delete(TAny *aPtr);
//
-#ifdef __TOOLS2__
+#if defined(__TOOLS2__) || defined(__MSVCDOTNET__)
istringstream &operator>>(istringstream &is, TVersion &aVersion);
#else
istrstream &operator>>(istrstream &is, TVersion &aVersion);
@@ -173,12 +174,12 @@
{
T x;
- #ifdef __TOOLS2__
+ #if defined(__TOOLS2__) || defined(__MSVCDOTNET__)
istringstream val(aStr);
#else
istrstream val((char*)aStr,strlen(aStr));
#endif
- #if defined(__MSVCDOTNET__) || defined (__TOOLS2__)
+ #if defined (__TOOLS2__) || defined(__MSVCDOTNET__)
val >> setbase(0);
#endif //__MSVCDOTNET__
val >> x;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/group/readimage.vcproj Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,542 @@
+<?xml version="1.0" encoding="gb2312"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="readimage"
+ ProjectGUID="{14ADB7DA-3076-4A77-868E-83E04E8D5A13}"
+ RootNamespace="readimage"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="\VCOutput\Bins"
+ IntermediateDirectory="\VCOutput\Int\$(ProjectName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="1"
+ UseOfATL="0"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../imglib/boostlibrary;../../imglib/boostlibrary/boost;../rofsbuild;../rombuild;../readimage/inc;../rofsbuild/inc;../../imglib/inc;../../sisutils/inc;../../imglib/compress;../../imglib/memmap/include;../../imglib/patchdataprocessor/include;../../imglib/uniconv/include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;__MSVCDOTNET__;__TOOLS__;__VC32__;_STLP_DEBUG=1;__OPERATOR_NEW_DECLARED__;__SUPPORT_ELF_FILES__;snprintf=_snprintf;PATH_MAX=260"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ DisableSpecificWarnings="4819;4996;4244;4334;4290"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="false"
+ OutputFile="$(OutDir)\$(ProjectName)D.exe"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../imglib/boostlibrary/binary/windows;../stlport_5-2-1_vc90_staticlib"
+ IgnoreDefaultLibraryNames=""
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="\VCOutput\Bins"
+ IntermediateDirectory="\VCOutput\Int\$(ProjectName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="1"
+ UseOfATL="0"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories="../../imglib/boostlibrary;../../imglib/boostlibrary/boost;../rofsbuild;../rombuild;../readimage/inc;../rofsbuild/inc;../../imglib/inc;../../sisutils/inc;../../imglib/compress;../../imglib/memmap/include;../../imglib/patchdataprocessor/include;../../imglib/uniconv/include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;__MSVCDOTNET__;__TOOLS__;__VC32__;__OPERATOR_NEW_DECLARED__;__SUPPORT_ELF_FILES__;snprintf=_snprintf;PATH_MAX=260"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4819;4996;4244;4334;4290"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../imglib/boostlibrary/binary/windows;../stlport_5-2-1_vc90_staticlib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Sources"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\readimage\src\common.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\src\e32_image_reader.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\src\image_handler.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\src\image_reader.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\src\rofs_image_reader.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\src\rom_image_reader.cpp"
+ >
+ </File>
+ <Filter
+ Name="e32image"
+ >
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\compress.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\decode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\deflate.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\e32image.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\encode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\inflate.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\panic.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="compress"
+ >
+ <File
+ RelativePath="..\..\imglib\compress\byte_pair.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\compress\pagedcompress.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="e32uid"
+ >
+ <File
+ RelativePath="..\..\imglib\e32uid\e32uid.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="imglib_host"
+ >
+ <File
+ RelativePath="..\..\imglib\host\h_file.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\host\h_mem.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\host\h_utl.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\host\utf16string.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="rofsbuild_cache"
+ >
+ <File
+ RelativePath="..\rofsbuild\src\cache\cache.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cacheablelist.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cacheentry.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cacheexception.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cachegenerator.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cachemanager.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cachevalidator.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="memmap"
+ >
+ <File
+ RelativePath="..\..\imglib\memmap\source\memmap.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\memmap\source\memmaputils.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="patchdataprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\patchdataprocessor\source\patchdataprocessor.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="sisutils"
+ >
+ <File
+ RelativePath="..\..\sisutils\src\pkgfileparser.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sisutils\src\pkglanguage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sisutils\src\sis2iby.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sisutils\src\sisutils.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="rombuild"
+ >
+ <File
+ RelativePath="..\rombuild\r_global.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="rofsbuild"
+ >
+ <File
+ RelativePath="..\rofsbuild\r_build.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_coreimage.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="uniconv"
+ >
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Headers"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\readimage\inc\common.h"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\e32_image_reader.h"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\image_handler.h"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\image_reader.h"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\rofs_image_reader.h"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\rom_image_reader.h"
+ >
+ </File>
+ <Filter
+ Name="compress"
+ >
+ <File
+ RelativePath="..\..\imglib\compress\byte_pair.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="e32image"
+ >
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\deflate.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\farray.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\huffman.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\panic.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="imglib_inc"
+ >
+ <File
+ RelativePath="..\..\imglib\inc\e32image.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\inc\fatdefines.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\inc\h_utl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\inc\utf16string.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="cache"
+ >
+ <File
+ RelativePath="..\readimage\inc\cache\cache.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\cache\cacheablelist.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\cache\cacheentry.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\cache\cacheexception.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\cache\cachegenerator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\cache\cachemanager.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\readimage\inc\cache\cachevalidator.hpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="memmap"
+ >
+ <File
+ RelativePath="..\..\imglib\memmap\include\memmap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\memmap\include\memmaputils.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="patchdataprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\patchdataprocessor\include\patchdataprocessor.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="sisutils"
+ >
+ <File
+ RelativePath="..\..\sisutils\inc\pkgfileparser.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sisutils\inc\pkglanguage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sisutils\inc\sis2iby.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\sisutils\inc\sisutils.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="uniconv"
+ >
+ <File
+ RelativePath="..\..\imglib\uniconv\source\uniconv.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- a/imgtools/romtools/group/release.txt Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/group/release.txt Mon Oct 18 10:23:52 2010 +0100
@@ -1,4 +1,26 @@
-Version 2.13.0 (ROFSBUILD)
+Version 2.18.4 (ROMBUILD)
+Version 2.14.2 (ROFSBUILD)
+===============
+Released by Ross Qin, 15/10/2010
+ 1) ou1cimx1#616869 Copyright Info missing in symbolgenerator.*/Romtools source codes are not VC friendly
+
+Version 2.18.3 (ROMBUILD)
+Version 2.14.1 (ROFSBUILD)
+===============
+Released by Lorence Wang, 19/09/2010
+ 1) ou1cimx1#498436 rombuild prompt 2 warnings when there's an unknown keyword in oby.
+
+Version 2.14.0 (ROFSBUILD)
+===============
+Released by Lorence Wang, 17/09/2010
+ 1) Whole directory support in FAT.
+
+Version 2.13.3 (ROFSBUILD)
+===============
+Released by Lorence Wang, 13/09/2010
+ 1) ou1cimx1#563537 Rofsbuild generates the log file for smr image and datadrive image in wrong location
+
+Version 2.13.2 (ROFSBUILD)
===============
Released by Jason Cui, 25/08/2010
1) ROFSBUILD generates 0-length log file.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/group/rofsbuild.vcproj Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,546 @@
+<?xml version="1.0" encoding="gb2312"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="rofsbuild"
+ ProjectGUID="{A68ED0C5-60D6-4281-8226-8F9830A424CF}"
+ RootNamespace="rofsbuild"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="\VCOutput\Bins"
+ IntermediateDirectory="\VCOutput\Int\$(ProjectName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="1"
+ UseOfATL="0"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../imglib/boostlibrary;../../imglib/boostlibrary/boost;../rofsbuild;../rofsbuild/inc;../../imglib/inc;../../imglib/compress;../../imglib/memmap/include;../../imglib/patchdataprocessor/include;../../imglib/parameterfileprocessor/include;../../imglib/uniconv/include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;__MSVCDOTNET__;__TOOLS__ ;__VC32__;_STLP_DEBUG=1;__OPERATOR_NEW_DECLARED__;"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ DisableSpecificWarnings="4819;4996;4244;4334;4290"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="false"
+ OutputFile="$(OutDir)\$(ProjectName)D.exe"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../imglib/boostlibrary/binary/windows;../stlport_5-2-1_vc90_staticlib"
+ IgnoreDefaultLibraryNames=""
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="\VCOutput\Bins"
+ IntermediateDirectory="\VCOutput\Int\$(ProjectName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="1"
+ UseOfATL="0"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories="../../imglib/boostlibrary;../../imglib/boostlibrary/boost;../rofsbuild;../rofsbuild/inc;../../imglib/inc;../../imglib/compress;../../imglib/memmap/include;../../imglib/patchdataprocessor/include;../../imglib/parameterfileprocessor/include;../../imglib/uniconv/include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;__MSVCDOTNET__;__TOOLS__ ;__VC32__;__OPERATOR_NEW_DECLARED__;"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4819;4996;4244;4334;4290"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../imglib/boostlibrary/binary/windows;../stlport_5-2-1_vc90_staticlib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Sources"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\rofsbuild\fatcluster.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\fatimagegenerator.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\fsnode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_build.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_coreimage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_driveimage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_driveutl.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_obey.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_rofs.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_smrimage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\rofsbuild.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\symbolgenerator.cpp"
+ >
+ </File>
+ <Filter
+ Name="e32image"
+ >
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\compress.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\decode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\deflate.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\e32image.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\encode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\inflate.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\panic.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="compress"
+ >
+ <File
+ RelativePath="..\..\imglib\compress\byte_pair.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\compress\pagedcompress.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="e32uid"
+ >
+ <File
+ RelativePath="..\..\imglib\e32uid\e32uid.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="imglib_host"
+ >
+ <File
+ RelativePath="..\..\imglib\host\h_file.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\host\h_mem.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\host\h_utl.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\host\utf16string.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="cache"
+ >
+ <File
+ RelativePath="..\rofsbuild\src\cache\cache.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cacheablelist.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cacheentry.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cacheexception.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cachegenerator.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cachemanager.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\src\cache\cachevalidator.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="memmap"
+ >
+ <File
+ RelativePath="..\..\imglib\memmap\source\memmap.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\memmap\source\memmaputils.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="patchdataprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\patchdataprocessor\source\patchdataprocessor.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="parameterfileprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\parameterfileprocessor\source\parameterfileprocessor.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="uniconv"
+ >
+ <File
+ RelativePath="..\..\imglib\uniconv\source\uniconv.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Headers"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\rofsbuild\fatcluster.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\fatimagegenerator.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\fsnode.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_coreimage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_driveimage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_driveutl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_obey.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_rofs.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_romnode.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\r_smrimage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\symbolgenerator.h"
+ >
+ </File>
+ <Filter
+ Name="compress"
+ >
+ <File
+ RelativePath="..\..\imglib\compress\byte_pair.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="e32image"
+ >
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\deflate.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\farray.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\huffman.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\panic.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="imglib_inc"
+ >
+ <File
+ RelativePath="..\..\imglib\inc\e32image.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\inc\fatdefines.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\inc\h_utl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\inc\utf16string.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="cache"
+ >
+ <File
+ RelativePath="..\rofsbuild\inc\cache\cache.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\inc\cache\cacheablelist.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\inc\cache\cacheentry.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\inc\cache\cacheexception.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\inc\cache\cachegenerator.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\inc\cache\cachemanager.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rofsbuild\inc\cache\cachevalidator.hpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="memmap"
+ >
+ <File
+ RelativePath="..\..\imglib\memmap\include\memmap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\memmap\include\memmaputils.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="patchdataprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\patchdataprocessor\include\patchdataprocessor.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="parameterfileprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\parameterfileprocessor\include\parameterfileprocessor.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="uniconv"
+ >
+ <File
+ RelativePath="..\..\imglib\uniconv\include\uniconv.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/group/rombuild.vcproj Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,474 @@
+<?xml version="1.0" encoding="gb2312"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="rombuild"
+ ProjectGUID="{77D9E2A3-AD01-4691-9137-8DA53692BE9D}"
+ RootNamespace="rombuild"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="\VCOutput\Bins"
+ IntermediateDirectory="\VCOutput\Int\$(ProjectName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="1"
+ UseOfATL="0"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="../../imglib/boostlibrary;../../imglib/boostlibrary/boost;../rombuild;../../imglib/inc;../../imglib/compress;../../imglib/memmap/include;../../imglib/patchdataprocessor/include;../../imglib/parameterfileprocessor/include;../../imglib/uniconv/include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;__MSVCDOTNET__;__TOOLS__ ;__VC32__;_STLP_DEBUG=1;__OPERATOR_NEW_DECLARED__;snprintf=_snprintf"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ DisableSpecificWarnings="4819;4996;4244;4334"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ IgnoreImportLibrary="false"
+ OutputFile="$(OutDir)\$(ProjectName)D.exe"
+ LinkIncremental="2"
+ AdditionalLibraryDirectories="../../imglib/boostlibrary/binary/windows;../stlport_5-2-1_vc90_staticlib"
+ IgnoreDefaultLibraryNames=""
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="\VCOutput\Bins"
+ IntermediateDirectory="\VCOutput\Int\$(ProjectName)\$(ConfigurationName)"
+ ConfigurationType="1"
+ UseOfMFC="1"
+ UseOfATL="0"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories="../../imglib/boostlibrary;../../imglib/boostlibrary/boost;../rombuild;../../imglib/inc;../../imglib/compress;../../imglib/memmap/include;../../imglib/patchdataprocessor/include;../../imglib/parameterfileprocessor/include;../../imglib/uniconv/include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;__MSVCDOTNET__;__TOOLS__ ;__VC32__;__OPERATOR_NEW_DECLARED__;snprintf=_snprintf"
+ RuntimeLibrary="0"
+ EnableFunctionLevelLinking="true"
+ TreatWChar_tAsBuiltInType="false"
+ UsePrecompiledHeader="0"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ DisableSpecificWarnings="4819;4996;4244;4334"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ AdditionalLibraryDirectories="../../imglib/boostlibrary/binary/windows;../stlport_5-2-1_vc90_staticlib"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Sources"
+ Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+ UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+ >
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\inflate.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_areaset.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_build.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_collapse.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_coreimage.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_coreimagereader.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_dir.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_global.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_header.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_obey.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_rom.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_srec.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\rombuild.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\symbolgenerator.cpp"
+ >
+ </File>
+ <Filter
+ Name="e32image"
+ >
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\compress.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\decode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\deflate.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\e32image.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\encode.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\panic.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="compress"
+ >
+ <File
+ RelativePath="..\..\imglib\compress\byte_pair.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\compress\pagedcompress.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="e32uid"
+ >
+ <File
+ RelativePath="..\..\imglib\e32uid\e32uid.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="imglib_host"
+ >
+ <File
+ RelativePath="..\..\imglib\host\h_file.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\host\h_mem.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\host\h_utl.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\host\utf16string.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="memmap"
+ >
+ <File
+ RelativePath="..\..\imglib\memmap\source\memmap.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\memmap\source\memmaputils.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="parameterfileprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\parameterfileprocessor\source\parameterfileprocessor.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="patchdataprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\patchdataprocessor\source\patchdataprocessor.cpp"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="uniconv"
+ >
+ <File
+ RelativePath="..\..\imglib\uniconv\source\uniconv.cpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ <Filter
+ Name="Headers"
+ Filter="h;hpp;hxx;hm;inl;inc;xsd"
+ UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+ >
+ <File
+ RelativePath="..\rombuild\r_areaset.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_coreimage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_coreimagereader.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_dir.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_global.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_mromimage.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_obey.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\r_rom.h"
+ >
+ </File>
+ <File
+ RelativePath="..\rombuild\symbolgenerator.h"
+ >
+ </File>
+ <Filter
+ Name="compress"
+ >
+ <File
+ RelativePath="..\..\imglib\compress\byte_pair.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="e32image"
+ >
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\deflate.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\farray.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\huffman.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\e32image\deflate\panic.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="imglib_inc"
+ >
+ <File
+ RelativePath="..\..\imglib\inc\e32image.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\inc\h_utl.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\inc\utf16string.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="memmap"
+ >
+ <File
+ RelativePath="..\..\imglib\memmap\include\memmap.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\imglib\memmap\include\memmaputils.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="patchdataprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\patchdataprocessor\include\patchdataprocessor.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="parameterfileprocessor"
+ >
+ <File
+ RelativePath="..\..\imglib\parameterfileprocessor\include\parameterfileprocessor.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="uniconv"
+ >
+ <File
+ RelativePath="..\..\imglib\uniconv\include\uniconv.hpp"
+ >
+ </File>
+ </Filter>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/group/romtools.sln Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,32 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rombuild", "rombuild.vcproj", "{77D9E2A3-AD01-4691-9137-8DA53692BE9D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rofsbuild", "rofsbuild.vcproj", "{A68ED0C5-60D6-4281-8226-8F9830A424CF}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "readimage", "readimage.vcproj", "{14ADB7DA-3076-4A77-868E-83E04E8D5A13}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {77D9E2A3-AD01-4691-9137-8DA53692BE9D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77D9E2A3-AD01-4691-9137-8DA53692BE9D}.Debug|Win32.Build.0 = Debug|Win32
+ {77D9E2A3-AD01-4691-9137-8DA53692BE9D}.Release|Win32.ActiveCfg = Release|Win32
+ {77D9E2A3-AD01-4691-9137-8DA53692BE9D}.Release|Win32.Build.0 = Release|Win32
+ {A68ED0C5-60D6-4281-8226-8F9830A424CF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A68ED0C5-60D6-4281-8226-8F9830A424CF}.Debug|Win32.Build.0 = Debug|Win32
+ {A68ED0C5-60D6-4281-8226-8F9830A424CF}.Release|Win32.ActiveCfg = Release|Win32
+ {A68ED0C5-60D6-4281-8226-8F9830A424CF}.Release|Win32.Build.0 = Release|Win32
+ {14ADB7DA-3076-4A77-868E-83E04E8D5A13}.Debug|Win32.ActiveCfg = Debug|Win32
+ {14ADB7DA-3076-4A77-868E-83E04E8D5A13}.Debug|Win32.Build.0 = Debug|Win32
+ {14ADB7DA-3076-4A77-868E-83E04E8D5A13}.Release|Win32.ActiveCfg = Release|Win32
+ {14ADB7DA-3076-4A77-868E-83E04E8D5A13}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
--- a/imgtools/romtools/rofsbuild/fsnode.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/fsnode.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -25,19 +25,6 @@
#include <ctype.h>
-
-#ifdef __LINUX__
-#include <dirent.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#define SPLIT_CHAR '/'
-#else
-#include <io.h>
-#include <direct.h> //TODO: check under MinGW4 + stlport 5.2
-#include <conio.h>
-#define SPLIT_CHAR '\\'
-#endif
-
using namespace std;
const TUint KBytesPerEntry = 13 ;
@@ -105,85 +92,6 @@
free(iPCSideName);
}
-TFSNode* TFSNode::CreateFromFolder(const char* aPath,TFSNode* aParent) {
-
- int len = strlen(aPath);
-#ifdef __LINUX__
- DIR* dir = opendir(aPath);
- if(dir == NULL) {
- cout << aPath << " does not contain any subfolder/file.\n";
- return aParent;
- }
- if(!aParent)
- aParent = new TFSNode(NULL,"/",ATTR_DIRECTORY);
- dirent* entry;
- struct stat statbuf ;
- char* fileName = new(nothrow) char[len + 200];
- if(!fileName) return NULL ;
- memcpy(fileName,aPath,len);
- fileName[len] = SPLIT_CHAR;
- while ((entry = readdir(dir)) != NULL) {
- if(strcmp(entry->d_name,".") == 0 || strcmp(entry->d_name,"..") == 0)
- continue ;
- strcpy(&fileName[len+1],entry->d_name);
- stat(fileName , &statbuf);
- TFSNode* pNewItem = new TFSNode(aParent,fileName,S_ISDIR(statbuf.st_mode) ? ATTR_DIRECTORY : 0);
- pNewItem->Init(statbuf.st_ctime,statbuf.st_atime,statbuf.st_mtime,statbuf.st_size);
- if(S_ISDIR(statbuf.st_mode)){
- CreateFromFolder(fileName,pNewItem);
- }
- }
- delete []fileName ;
- closedir(dir);
-#else
- struct _finddata_t data ;
- memset(&data, 0, sizeof(data));
- char* fileName = new(nothrow) char[len + 200];
- if(!fileName) return NULL ;
- memcpy(fileName,aPath,len);
- fileName[len] = SPLIT_CHAR;
- fileName[len+1] = '*';
- fileName[len+2] = 0;
- intptr_t hFind = _findfirst(fileName,&data);
-
- if(hFind == (intptr_t)-1 ) {
- cout << aPath << " does not contain any subfolder/file.\n";
- delete []fileName;
- return aParent;
- }
- if(!aParent)
- aParent = new TFSNode(NULL,"/",ATTR_DIRECTORY);
-
- do {
- if(strcmp(data.name,".") == 0 || strcmp(data.name,"..") == 0)
- continue ;
-
- strcpy(&fileName[len+1],data.name);
- TUint8 attr = 0;
- if(data.attrib & _A_SUBDIR)
- attr |= ATTR_DIRECTORY;
- if(data.attrib & _A_RDONLY)
- attr |= ATTR_READ_ONLY ;
- if(data.attrib & _A_HIDDEN)
- attr |= ATTR_HIDDEN ;
- if(data.attrib & _A_SYSTEM)
- attr |= ATTR_SYSTEM ;
- if(data.attrib & _A_ARCH)
- attr |= ATTR_ARCHIVE;
- TFSNode* pNewItem = new TFSNode(aParent,data.name,attr,fileName);
- pNewItem->Init(data.time_create,data.time_access,data.time_write,data.size);
- if(data.attrib & _A_SUBDIR){
- CreateFromFolder(fileName,pNewItem);
- }
-
- } while(-1 != _findnext(hFind, &data));
- delete []fileName ;
- _findclose(hFind);
-#endif
-
- return aParent;
-}
-
/** GenerateBasicName : Generate the short name according to long name
*
* algorithm :
--- a/imgtools/romtools/rofsbuild/fsnode.h Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/fsnode.h Mon Oct 18 10:23:52 2010 +0100
@@ -55,9 +55,7 @@
// GetSize()
void WriteDirEntries(TUint aStartIndex, TUint8* aClusterData );
- static TFSNode* CreateFromFolder(const char* aPath,TFSNode* aParent = NULL);
-
-
+
protected:
void GenerateBasicName();
--- a/imgtools/romtools/rofsbuild/r_build.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/r_build.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -1071,9 +1071,9 @@
char * buffer = new char [size];
#if defined(__LINUX__)
ostrstream os((char*)aDest, aMaxSize, (ios_base::openmode)(ios_base::out+ios_base::binary));
-#elif defined(__TOOLS2__) && defined (_STLP_THREADS)
+#elif ( defined(__TOOLS2__) || defined(__MSVCDOTNET__)) && defined (_STLP_THREADS)
ostrstream os((char*)buffer, size,(ios_base::out+ios_base::binary));
-#elif defined( __TOOLS2__)
+#elif ( defined(__TOOLS2__) || defined(__MSVCDOTNET__))
ostrstream os((char*)buffer, size,(ios_base::out+ios_base::binary));
#else
ostrstream os( (char*)buffer, size, (ios_base::out+ios_base::binary));
@@ -1119,10 +1119,12 @@
}
}
-#if defined(__TOOLS2__) && defined (_STLP_THREADS)
+#if defined(__TOOLS2__) || defined(__MSVCDOTNET__)
+ #ifdef _STLP_THREADS
ostrstream os((char*)aDest, aMaxSize,(ios_base::out+ios_base::binary));
-#elif __TOOLS2__
+ #else
ostrstream os((char*)aDest, aMaxSize, (_Ios_Openmode)(ios_base::out+ios_base::binary));
+ #endif
#else
ostrstream os((char*)aDest, aMaxSize, (ios_base::out+ios_base::binary));
#endif
--- a/imgtools/romtools/rofsbuild/r_driveutl.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/r_driveutl.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -32,33 +32,49 @@
Checks the validity of driveobey file name before creating the log file name.
@param adriveobeyFileName - Drive obey file.
-@param &apadlogfile - Reference to log file name.
+@param &apadlogfile - Log file name from command line.
@return - returns 'ErrorNone' if log file created, otherwise returns Error.
*/
-TInt Getlogfile(char *aDriveObeyFileName,char* &aPadLogFile)
+string Getlogfile(char *aDriveObeyFileName,const string &CmdLogFile)
{
-
+ string strLogfile(CmdLogFile);
+ if(strLogfile.size() > 0 && strLogfile[strLogfile.size()-1] != '\\' && strLogfile[strLogfile.size()-1] != '/')
+ return strLogfile;
+
if(!(*aDriveObeyFileName))
- return KErrGeneral;
+ return string("");
// Validate the user entered driveoby file name.
char* logFile = (char*)aDriveObeyFileName;
+#ifdef __LINUX__
+ logFile = strrchr(logFile,'/');
+#else
+ while(*logFile)
+ {
+ if(*logFile == '/')
+ *logFile = '\\';
+ logFile++;
+ }
+ logFile = (char*)aDriveObeyFileName;
+ logFile = strrchr(logFile,'\\');
+#endif
+
+ if(logFile)
+ ++logFile;
+ else
+ logFile = (char*)aDriveObeyFileName;
+
TInt len = strlen(logFile);
if(!len)
- return KErrGeneral;
-
- // Allocates the memory for log file name.
- aPadLogFile = new char[(len)+5];
- if(!aPadLogFile)
- return KErrNoMemory;
+ return string("");
// Create the log file name.
- strcpy((char*)aPadLogFile,logFile);
- strcat((char*)aPadLogFile,".LOG");
+ strLogfile += logFile;
+ strLogfile += ".LOG";
- return KErrNone;
+ return strLogfile;
}
/**
--- a/imgtools/romtools/rofsbuild/r_driveutl.h Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/r_driveutl.h Mon Oct 18 10:23:52 2010 +0100
@@ -23,7 +23,7 @@
#include <e32def.h>
-TInt Getlogfile(char *aDriveObeyFileName,char* &aPadLogFile);
+string Getlogfile(char *aDriveObeyFileName,const string &CmdLogFile);
TAny GetLocalTime(TAny);
#endif
--- a/imgtools/romtools/rofsbuild/r_obey.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/r_obey.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -40,6 +40,16 @@
#include "fatimagegenerator.h"
#include "r_driveimage.h"
+#ifdef __LINUX__
+#include <dirent.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#else
+#include <io.h>
+#include <direct.h> //TODO: check under MinGW4 + stlport 5.2
+#include <conio.h>
+#endif
+
#include "uniconv.hpp"
extern TInt gCodePagingOverride;
extern TInt gDataPagingOverride;
@@ -57,6 +67,7 @@
{_K("file"), 2,-2, EKeywordFile, "File to be copied into ROFS"},
{_K("data"), 2,-2, EKeywordData, "same as file"},
{_K("dir"), 2,1, EKeywordDir, "Directory to be created into FAT image"},
+ {_K("dircopy"), 2,-2, EKeywordDirCpy, "Directory to be copied into FAT image"},
{_K("rofsname"), 1, 1, EKeywordRofsName, "output file for ROFS image"},
{_K("romsize"), 1, 1, EKeywordRomSize, "size of ROM image"},
@@ -268,7 +279,7 @@
}
TInt ObeyFileReader::NextLine(TInt aPass, enum EKeyword& aKeyword) {
-
+ static int warnline = -1;
NextLine:
TInt err = ReadAndParseLine();
if (err == KErrEof)
@@ -312,8 +323,10 @@
aKeyword = k->iKeywordEnum;
return KErrNone;
}
- if (aPass == 1)
+ if (aPass == 1 && iCurrentLine > warnline){
+ warnline = iCurrentLine;
Print(EWarning, "Unknown keyword '%s'. Line %d ignored\n", iWord[0], iCurrentLine);
+ }
goto NextLine;
}
@@ -740,6 +753,7 @@
case EKeywordHide:
case EKeywordFile:
case EKeywordDir:
+ case EKeywordDirCpy:
case EKeywordData:
case EKeywordFileCompress:
case EKeywordFileUncompress:
@@ -933,7 +947,6 @@
*/
TBool CObeyFile::ProcessDriveFile(enum EKeyword aKeyword) {
- TBool isPeFile = ETrue;
TBool aFileCompressOption, aFileUncompressOption;
TInt epocPathStart=2;
@@ -945,8 +958,8 @@
{
case EKeywordData:
case EKeywordDir:
+ case EKeywordDirCpy:
case EKeywordHide:
- isPeFile = EFalse;
break;
case EKeywordFile:
@@ -964,7 +977,7 @@
return EFalse;
}
- if (aKeyword!=EKeywordHide && aKeyword!=EKeywordDir) {
+ if (aKeyword!=EKeywordHide && aKeyword!=EKeywordDir && aKeyword!=EKeywordDirCpy) {
// check the PC file exists
char* nname = NormaliseFileName(iReader.Word(1));
if(gIsOBYUTF8 && !UniConv::IsPureASCIITextStream(nname))
@@ -990,15 +1003,12 @@
delete []nname ;
}
- else
+ else if (aKeyword != EKeywordDirCpy)
epocPathStart=1;
- if(aKeyword != EKeywordDir)
- iNumberOfFiles++;
-
TBool endOfName=EFalse;
const char *epocStartPtr;
- if(aKeyword != EKeywordDir)
+ if(aKeyword != EKeywordDir && aKeyword != EKeywordDirCpy)
epocStartPtr = IsValidFilePath(iReader.Word(epocPathStart));
else
epocStartPtr = IsValidDirPath(iReader.Word(epocPathStart));
@@ -1011,59 +1021,12 @@
TRomNode* dir=iRootDirectory;
TRomNode* subDir=0;
- TRomBuilderEntry *file=0;
while (!endOfName) {
endOfName = GetNextBitOfFileName(epocEndPtr);
- if (endOfName && (aKeyword!=EKeywordDir)) { // file
- TRomNode* alreadyExists=dir->FindInDirectory(epocStartPtr);
- if ((aKeyword != EKeywordHide) && alreadyExists) { // duplicate file
- if (gKeepGoing) {
- Print(EWarning, "Duplicate file for %s on line %d, will be ignored\n",iReader.Word(1),iReader.CurrentLine());
- iNumberOfFiles--;
- return ETrue;
- }
- else {
- Print(EError, "Duplicate file for %s on line %d\n",iReader.Word(1),iReader.CurrentLine());
- return EFalse;
- }
- }
- else if((aKeyword == EKeywordHide) && (alreadyExists)) {
- alreadyExists->iEntry->iHidden = ETrue;
- alreadyExists->iHidden = ETrue;
- return ETrue;
- }
- else if((aKeyword == EKeywordHide) && (!alreadyExists)) {
- Print(EWarning, "Hiding non-existent file %s on line %d\n",iReader.Word(1),iReader.CurrentLine());
- return ETrue;
- }
-
- file = new TRomBuilderEntry(iReader.Word(1), epocStartPtr);
- file->iExecutable=isPeFile;
- if( aFileCompressOption ) {
- file->iCompressEnabled = ECompressionCompress;
- }
- else if(aFileUncompressOption ) {
- file->iCompressEnabled = ECompressionUncompress;
- }
-
- TRomNode* node=new TRomNode(epocStartPtr, file);
- if (node==0)
+ if (endOfName && (aKeyword!=EKeywordDir) && (aKeyword!=EKeywordDirCpy)) { // file
+ if (!AddFileToNodeTree(aKeyword, dir, epocStartPtr, iReader.Word(1), ETrue, aFileCompressOption, aFileUncompressOption))
return EFalse;
-
- TInt r=ParseFileAttributes(node, file, aKeyword);
- if (r!=KErrNone)
- return EFalse;
-
- if(gCompress != ECompressionUnknown) {
- node->iFileUpdate = ETrue;
- }
-
- if((node->iOverride) || (aFileCompressOption) || (aFileUncompressOption)) {
- node->iFileUpdate = ETrue;
- }
-
- dir->AddFile(node); // to drive directory structure.
}
else {
// directory
@@ -1071,24 +1034,195 @@
if(!*epocStartPtr)
break;
- subDir = dir->FindInDirectory(epocStartPtr);
- if (!subDir){ // sub directory does not exist
- if(aKeyword==EKeywordHide) {
- Print(EWarning, "Hiding non-existent file %s on line %d\n",
- iReader.Word(1),iReader.CurrentLine());
- return ETrue;
- }
- subDir = dir->NewSubDir(epocStartPtr);
- if (!subDir)
- return EFalse;
+ subDir = AddDirToNodeTree(aKeyword, dir, epocStartPtr);
+ if (!subDir) {
+ if (aKeyword != EKeywordHide)
+ return EFalse;//this is for memory alloc failed
+ else
+ return ETrue;//this is for hide a non-exist dir
}
dir=subDir;
epocStartPtr = epocEndPtr;
} // end of else.
}
+
+ if (aKeyword == EKeywordDirCpy) {
+ if(!CreateFromFolder(iReader.Word(1), dir))
+ return EFalse;
+ }
+
return ETrue;
}
+TRomNode* CObeyFile::AddFileToNodeTree(enum EKeyword aKeyword, TRomNode* dir, const char* filename, const char* aPCSidename, const TBool aParseAttr, TBool aFileCompressOption, TBool aFileUncompressOption) {
+ TRomNode* alreadyExists=dir->FindInDirectory(filename);
+ if ((aKeyword != EKeywordHide) && alreadyExists) { // duplicate file
+ if (gKeepGoing) {
+ Print(EWarning, "Duplicate file for %s on line %d, will be ignored\n",aPCSidename,iReader.CurrentLine());
+ return alreadyExists;
+ }
+ else {
+ Print(EError, "Duplicate file for %s on line %d\n",aPCSidename,iReader.CurrentLine());
+ return 0;
+ }
+ }
+ else if((aKeyword == EKeywordHide) && (alreadyExists)) {
+ alreadyExists->iEntry->iHidden = ETrue;
+ alreadyExists->iHidden = ETrue;
+ return alreadyExists;
+ }
+ else if((aKeyword == EKeywordHide) && (!alreadyExists)) {
+ Print(EWarning, "Hiding non-existent file %s on line %d\n",aPCSidename,iReader.CurrentLine());
+ return (TRomNode*)1;
+ }
+
+ iNumberOfFiles++;
+ TRomBuilderEntry* file = new TRomBuilderEntry(aPCSidename, filename);
+ if( aFileCompressOption ) {
+ file->iCompressEnabled = ECompressionCompress;
+ }
+ else if(aFileUncompressOption ) {
+ file->iCompressEnabled = ECompressionUncompress;
+ }
+
+ TRomNode* node=new TRomNode(filename, file);
+ if (node==0)
+ return 0;
+
+ if (aParseAttr){
+ TInt r=ParseFileAttributes(node, file, aKeyword);
+ if (r!=KErrNone)
+ return 0;
+ }
+ if(gCompress != ECompressionUnknown) {
+ node->iFileUpdate = ETrue;
+ }
+
+ if((node->iOverride) || (aFileCompressOption) || (aFileUncompressOption)) {
+ node->iFileUpdate = ETrue;
+ }
+
+ dir->AddFile(node); // to drive directory structure.
+ return node;
+}
+
+TRomNode* CObeyFile::AddDirToNodeTree(enum EKeyword aKeyword, TRomNode* dir, const char* dirname) {
+ TRomNode* subDir = dir->FindInDirectory(dirname);
+ if (!subDir){ // sub directory does not exist
+ if(aKeyword==EKeywordHide) {
+ Print(EWarning, "Hiding non-existent file %s on line %d\n",
+ iReader.Word(1),iReader.CurrentLine());
+ return 0;
+ }
+ subDir = dir->NewSubDir(dirname);
+ if (!subDir)
+ return 0;
+ }
+ return subDir;
+}
+
+TBool CObeyFile::CreateFromFolder(const char* aPath,TRomNode* aParent) {
+ int len = strlen(aPath);
+ if(!aParent)
+ aParent = new TRomNode("//");
+#ifdef __LINUX__
+ DIR* dir = opendir(aPath);
+ if(dir == NULL) {
+ Print(EError, "The directory %s does not exist.\n",aPath);
+ return EFalse;
+ }
+ dirent* entry;
+ struct stat statbuf ;
+ char* fileName = new(nothrow) char[len + 200];
+ if(!fileName) return EFalse ;
+ memcpy(fileName,aPath,len);
+ fileName[len] = '/';
+ while ((entry = readdir(dir)) != NULL) {
+ if(strcmp(entry->d_name,".") == 0 || strcmp(entry->d_name,"..") == 0)
+ continue ;
+ strcpy(&fileName[len+1],entry->d_name);
+ stat(fileName , &statbuf);
+ if (S_ISDIR(statbuf.st_mode)){
+ TRomNode* subdir = AddDirToNodeTree(EKeywordDirCpy, aParent, entry->d_name);
+ if (!subdir){
+ delete []fileName;
+ return EFalse;
+ }
+ if (!CreateFromFolder(fileName, subdir)){
+ delete []fileName;
+ return EFalse;
+ }
+ }else{
+ if (!AddFileToNodeTree(EKeywordDirCpy, aParent, entry->d_name, fileName, EFalse)){
+ delete []fileName;
+ return EFalse;
+ }
+ }
+ }
+ delete []fileName ;
+ closedir(dir);
+#else
+ struct _finddata_t data ;
+ memset(&data, 0, sizeof(data));
+ char* fileName = new(nothrow) char[len + 200];
+ if(!fileName) return EFalse ;
+ memcpy(fileName,aPath,len);
+ fileName[len] = '\\';
+ fileName[len+1] = '*';
+ fileName[len+2] = 0;
+ intptr_t hFind = _findfirst(fileName,&data);
+
+ if(hFind == (intptr_t)-1 ) {
+ Print(EError, "The directory %s does not exist.\n",aPath);
+ delete []fileName;
+ return EFalse;
+ }
+
+ do {
+ if(strcmp(data.name,".") == 0 || strcmp(data.name,"..") == 0)
+ continue ;
+
+ strcpy(&fileName[len+1],data.name);
+ if(data.attrib & _A_SUBDIR){
+ TRomNode* subDir = AddDirToNodeTree(EKeywordDirCpy, aParent, data.name);
+ if (!subDir){
+ delete []fileName;
+ return EFalse;
+ }
+ if(data.attrib & _A_RDONLY)
+ subDir->iAtt |= KEntryAttReadOnly;
+ if(data.attrib & _A_HIDDEN){
+ subDir->iAtt |= KEntryAttHidden;
+ }
+ if(data.attrib & _A_SYSTEM)
+ subDir->iAtt |= KEntryAttSystem;
+ if (!CreateFromFolder(fileName, subDir)){
+ delete []fileName;
+ return EFalse;
+ }
+ }else{
+ TRomNode* node = AddFileToNodeTree(EKeywordDirCpy, aParent, data.name, fileName, EFalse);
+ if (!node){
+ delete []fileName;
+ return EFalse;
+ }
+ if(data.attrib & _A_RDONLY)
+ node->iAtt |= KEntryAttReadOnly;
+ if(data.attrib & _A_HIDDEN){
+ node->iAtt |= KEntryAttHidden;
+ node->iEntry->iHidden = ETrue;
+ node->iHidden = ETrue;
+ }
+ if(data.attrib & _A_SYSTEM)
+ node->iAtt |= KEntryAttSystem;
+ }
+ } while(-1 != _findnext(hFind, &data));
+ delete []fileName ;
+ _findclose(hFind);
+#endif
+
+ return ETrue;
+}
TInt CObeyFile::SetStackSize(TRomNode *aNode, const char* aStr) {
if (EFalse == IsValidNumber(aStr))
--- a/imgtools/romtools/rofsbuild/r_obey.h Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/r_obey.h Mon Oct 18 10:23:52 2010 +0100
@@ -48,6 +48,7 @@
EKeywordFile,
EKeywordData,
EKeywordDir,
+ EKeywordDirCpy,
EKeywordRofsName,
EKeywordExtensionRofs,
EKeywordCoreRofsName,
@@ -252,6 +253,10 @@
TInt SetUid2(TRomNode* aNode, const char *aStr);
TInt SetUid3(TRomNode* aNode, const char *aStr);
TInt SetPriority(TRomNode* aNode, const char *aStr);
+
+ TRomNode* AddFileToNodeTree(enum EKeyword aKeyword, TRomNode* dir, const char* filename, const char* aPCSidename, const TBool aParseAttr, TBool aFileCompressOption = EFalse, TBool aFileUncompressOption = EFalse);
+ TRomNode* AddDirToNodeTree(enum EKeyword aKeyword, TRomNode* dir, const char* dirname);
+ TBool CreateFromFolder(const char* aPath,TRomNode* aParent);
static TBool GetNextBitOfFileName(char*& epocEndPtr);
static const char *IsValidFilePath(const char *aPath);
--- a/imgtools/romtools/rofsbuild/rofsbuild.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/rofsbuild.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -46,7 +46,7 @@
#endif
static const TInt RofsbuildMajorVersion=2;
-static const TInt RofsbuildMinorVersion=13;
+static const TInt RofsbuildMinorVersion=14;
static const TInt RofsbuildPatchVersion=2;
static TBool SizeSummary=EFalse;
static TPrintType SizeWhere=EAlways;
@@ -77,7 +77,7 @@
TBool reallyHelp = EFalse;
TBool gSmrImage = EFalse;
string gSmrFileName = "";
-static string rofslogfile = "ROFSBUILD.LOG";
+static string cmdlogfile = "";
//Cache global variables
bool gCache = false;
@@ -323,7 +323,7 @@
else if (stricmp(argv[i], "-LOWMEM") == 0)
gLowMem = ETrue;
else if (strnicmp(argv[i], "-logfile=",9) ==0) {
- rofslogfile = argv[i] + 9;
+ cmdlogfile = argv[i] + 9;
}
else {
#ifdef WIN32
@@ -386,7 +386,7 @@
@return - returns the status, after processing the drive obey file.
*/
-TInt ProcessDataDriveMain(char* aobeyFileName,char* alogfile) {
+TInt ProcessDataDriveMain(char* aobeyFileName, const char* alogfile) {
ObeyFileReader *reader = new ObeyFileReader(aobeyFileName);
@@ -432,7 +432,7 @@
return retstatus;
}
-TInt ProcessSmrImageMain(char* aObeyFileName, char* /* alogfile */) {
+TInt ProcessSmrImageMain(char* aObeyFileName, const char* /* alogfile */) {
ObeyFileReader *reader = new ObeyFileReader(aObeyFileName);
if(!reader)
return KErrNoMemory;
@@ -536,13 +536,12 @@
*(--ptr)++ = 0;
if(*driveobeyFileName) {
- char* logfile = 0;
- if(Getlogfile(driveobeyFileName,logfile) == KErrNone) {
- H.SetLogFile(logfile);
+ string logfile = Getlogfile(driveobeyFileName, cmdlogfile);
+ if(logfile.size() > 0) {
+ H.SetLogFile(logfile.c_str());
GetLocalTime();
- r = ProcessDataDriveMain(driveobeyFileName,logfile);
+ r = ProcessDataDriveMain(driveobeyFileName,logfile.c_str());
H.CloseLogFile();
- delete[] logfile;
if(r == KErrNoMemory)
return KErrNoMemory;
}
@@ -564,13 +563,12 @@
*(--ptr)++ = 0;
if(*smrImageObeyFileName){
- char * logfile = 0;
- if(Getlogfile(smrImageObeyFileName,logfile) == KErrNone){
- H.SetLogFile(logfile);
+ string logfile = Getlogfile(smrImageObeyFileName, cmdlogfile);
+ if(logfile.size() > 0) {
+ H.SetLogFile(logfile.c_str());
GetLocalTime();
- r = ProcessSmrImageMain(smrImageObeyFileName, logfile);
+ r = ProcessSmrImageMain(smrImageObeyFileName, logfile.c_str());
H.CloseLogFile();
- delete[] logfile;
if(r == KErrNoMemory)
return KErrNoMemory;
}
@@ -584,9 +582,13 @@
}
// Process Rofs Obey files.
if(obeyFileName) {
- if (rofslogfile[rofslogfile.size()-1] == '\\' || rofslogfile[rofslogfile.size()-1] == '/')
- rofslogfile += "ROFSBUILD.LOG";
- H.SetLogFile(rofslogfile.c_str());
+ if(cmdlogfile.empty())
+ cmdlogfile.assign("ROFSBUILD.LOG");
+ else if (cmdlogfile[cmdlogfile.length()-1] == '\\' || cmdlogfile[cmdlogfile.length()-1] == '/') {
+ cmdlogfile += "ROFSBUILD.LOG" ;
+ }
+
+ H.SetLogFile(cmdlogfile.c_str());
ObeyFileReader *reader = new ObeyFileReader(obeyFileName);
if (!reader->Open())
return KErrGeneral;
--- a/imgtools/romtools/rofsbuild/symbolgenerator.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/symbolgenerator.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -1,3 +1,20 @@
+/*
+* 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 the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
#include <boost/regex.hpp>
#define MAX_LINE 65535
#include "symbolgenerator.h"
@@ -71,10 +88,10 @@
boost::regex regARMV5("ARMV5", boost::regex::icase);
boost::regex regGCCEoARMV4("(GCCE|ARMV4)", boost::regex::icase);
boost::cmatch what;
- if(regex_search(fileName, what, regARMV5)) {
+ if(regex_search(fileName.c_str(), what, regARMV5)) {
ProcessArmv5File(fileName, fMap);
}
- else if(regex_search(fileName, what, regGCCEoARMV4)) {
+ else if(regex_search(fileName.c_str(), what, regGCCEoARMV4)) {
ProcessGcceOrArm4File(fileName, fMap);
}
else {
@@ -185,13 +202,13 @@
break;
else if(regex_search(str, what, reg1)) {
sLibFile.assign(what[4].first,what[4].second-what[4].first);
- if(!regex_search(sLibFile, what1, reg)) {
+ if(!regex_search(sLibFile.c_str(), what1, reg)) {
sTmp.assign(what[2].first,what[2].second-what[2].first);
addr = strtol(sTmp.c_str(), NULL, 16);
sTmp.assign(what[3].first,what[3].second-what[3].first);
len = strtol(sTmp.c_str(), NULL, 16);
syms[addr+len] = "";
- if(regex_search(sLibFile, what, reg3)) {
+ if(regex_search(sLibFile.c_str(), what, reg3)) {
stubhex = addr;
}
}
--- a/imgtools/romtools/rofsbuild/symbolgenerator.h Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rofsbuild/symbolgenerator.h Mon Oct 18 10:23:52 2010 +0100
@@ -1,3 +1,20 @@
+/*
+* 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 the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
#ifndef __SYMBOLGENERATOR_H__
#define __SYMBOLGENERATOR_H__
#include <queue>
--- a/imgtools/romtools/rombuild/r_obey.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rombuild/r_obey.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -296,7 +296,7 @@
}
TInt ObeyFileReader::NextLine(TInt aPass, enum EKeyword& aKeyword)
{
-
+ static int warnline = -1;
NextLine:
TInt err = ReadAndParseLine();
if (err == KErrEof)
@@ -346,8 +346,10 @@
aKeyword = k->iKeywordEnum;
return KErrNone;
}
- if (aPass == 1)
+ if (aPass == 1 && iCurrentLine > warnline){
+ warnline = iCurrentLine;
Print(EWarning, "Unknown keyword '%s'. Line %d ignored\n", iWord[0], iCurrentLine);
+ }
goto NextLine;
}
--- a/imgtools/romtools/rombuild/rombuild.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rombuild/rombuild.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -33,7 +33,7 @@
static const TInt RombuildMajorVersion=2;
static const TInt RombuildMinorVersion=18;
-static const TInt RombuildPatchVersion=2;
+static const TInt RombuildPatchVersion=4;
static TBool SizeSummary=EFalse;
static TPrintType SizeWhere=EAlways;
static string compareROMName = "";
--- a/imgtools/romtools/rombuild/symbolgenerator.cpp Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rombuild/symbolgenerator.cpp Mon Oct 18 10:23:52 2010 +0100
@@ -1,3 +1,20 @@
+/*
+* 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 the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
#include <e32rom.h>
#include <algorithm>
#include "symbolgenerator.h"
--- a/imgtools/romtools/rombuild/symbolgenerator.h Mon Sep 20 10:55:43 2010 +0100
+++ b/imgtools/romtools/rombuild/symbolgenerator.h Mon Oct 18 10:23:52 2010 +0100
@@ -1,3 +1,20 @@
+/*
+* 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 the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
#ifndef __SYMBOLSCREATER_H__
#define __SYMBOLSCREATER_H__
#include <queue>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javatoolsplat/j2re-1.3.1/group/j2re-1.3.1.mrp.bak Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,23 @@
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+component dev_build_dist_j2re-1.3.1
+
+source \src\tools\build\dist\j2re-1.3.1
+exports \src\tools\build\dist\j2re-1.3.1\group
+
+notes_source \src\tools\build\dist\j2re-1.3.1\group\release.txt
+
+ipr T
\ No newline at end of file
--- a/package_definition.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/package_definition.xml Mon Oct 18 10:23:52 2010 +0100
@@ -8,23 +8,18 @@
<component filter="build_SFPhase1" id="rcomp" name="Resource Compiler" >
<unit bldFile="bintools/rcomp/group" mrp="bintools/rcomp/group/rcomp.mrp"/>
</component>
- <component filter="build_SFPhase1" id="checklib" name="Checklib" >
+ <component filter="build_SFPhase1" id="checklib" name="checklib" >
<unit bldFile="bintools/checklib/group" mrp="bintools/checklib/group/checklib.mrp"/>
</component>
- <component filter="build_SFPhase1" id="elftools" name="ELF Tools" >
+ <component filter="build_SFPhase1" id="elftools" name="elftools" >
<unit bldFile="bintools/elftools/group" mrp="bintools/elftools/group/elftools.mrp"/>
</component>
</collection>
<collection id="srctools" level="middleware" name="Source Tools">
- <component filter="build_SFPhase1" id="tranasm" name="Translate ASM">
+ <component filter="build_SFPhase1" id="tranasm" name="tranasm" >
<unit bldFile="srctools/tranasm/group" mrp="srctools/tranasm/group/tranasm.mrp"/>
</component>
</collection>
- <collection id="metatools" level="middleware" name="Metadata Tools">
- <component filter="build_SFPhase1" id="sysdeftools" name="System Definition Tools" introduced="^1">
- <unit base="metatools/sysdeftools"/>
- </component>
- </collection>
<collection id="e32tools" level="middleware" name="E32 Tools">
<component filter="build_SFPhase1" id="elf2e32" name="elf2e32 (Postlinker)" >
<unit bldFile="e32tools/elf2e32/group" mrp="e32tools/elf2e32/group/elf2e32.mrp"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/perltoolsplat/activestate-perl-5.6.1/group/activestate-perl-5.6.1.mrp.bak Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,23 @@
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+component dev_build_dist_activestate-perl-5.6.1
+
+source \src\tools\build\dist\activestate-perl-5.6.1
+exports \src\tools\build\dist\activestate-perl-5.6.1\group
+
+notes_source \src\tools\build\dist\activestate-perl-5.6.1\group\release.txt
+
+ipr T
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/group/cbrtools.mrp.bak Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,24 @@
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+component dev_build_releasing_cbrtools
+
+source \src\tools\dev\build\releasing\cbrtools
+
+ipr T
+
+exports \src\tools\build\releasing\cbrtools\group
+
+notes_source \src\tools\build\releasing\cbrtools\group\release.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/group/makecbr.mrp.bak Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,24 @@
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+component dev_build_releasing_makecbr
+
+source \src\tools\dev\build\releasing\makecbr
+
+ipr T
+
+exports \src\tools\dev\build\releasing\makecbr\group
+
+notes_source \src\tools\dev\build\releasing\makecbr\files\release.src
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/zdelta-2.1/group/zdelta-2.1.mrp.bak Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,23 @@
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+component dev_build_dist_zdelta-2.1
+
+source \src\tools\build\dist\zdelta-2.1
+exports \src\tools\build\dist\zdelta-2.1\group
+
+notes_source \src\tools\build\dist\zdelta-2.1\group\release.txt
+
+ipr T
\ No newline at end of file
--- a/sbsv1/abld/group/bld.inf Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv1/abld/group/bld.inf Mon Oct 18 10:23:52 2010 +0100
@@ -65,6 +65,7 @@
../platform/gccev6.bsf /epoc32/tools/gccev6.bsf
../platform/armv6_abiv1.bsf /epoc32/tools/armv6_abiv1.bsf
../platform/armv7.bsf /epoc32/tools/armv7.bsf
+../platform/armv7smp.bsf /epoc32/tools/armv7smp.bsf
#ifdef SBSV2
#ifndef TOOLS2_LINUX
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/armv7smp.bsf Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,27 @@
+#<bsf>#
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for ARMV6 architecture. The options specified here are same as for ARMV5 except
+# the --cpu 6 option in INVARIANT_OPTIONS. This specifies to compiler to compile for generic ARMV6. If any other
+# specific options are required such as --cpu ARM1136J-S, etc, then it can be done via a different BSF file
+# NOTE: The options specified here for the compiler disable the unaligned memory access.
+
+CUSTOMIZES ARMV5
+
+INVARIANT_OPTIONS --cpu=7-A $(ENUM_OPTION) $(OWN_LIBRARY_OPTION) $(FPMODE_OPTION) $(EXPORT_VTBL_OPTION) $(VFE_OPTION) $(AAPCS_OPTION) $(NO_UNALIGNED_ACCESS)
+
+# On ARMV7 we use DWARF 3 instead of DWARF 2.
+DEBUG_FORMAT $(DEBUG_FORMAT_DWARF3)
+
+SMP
--- a/sbsv2/raptor/RELEASE-NOTES.html Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/RELEASE-NOTES.html Mon Oct 18 10:23:52 2010 +0100
@@ -6,6 +6,22 @@
<h1>Release Notes for Symbian Build System v2</h1>
+<h2>version 2.15.2</h2>
+
+<h3>Engineering Changes</h3>
+<ul>
+<li><a href="notes/variant_cfg.txt">Allow .hrh files to be defined in XML instead of variant.cfg</a></li>
+<li><a href="notes/tools_env_vars.txt">Environment variables for tools</a></li>
+</ul>
+
+<h3>Defect Fixes</h3>
+<ul>
+<li><a href="notes/filter_html.txt">Report no-rule-to-make errors correctly in the HTML log filter</a></li>
+<li><a href="http://developer.symbian.org/bugs/show_bug.cgi?id=2412">SF Bug 2412</a> - createvmap fails when the list of source files becomes too long</li>
+<li><a href="http://developer.symbian.org/bugs/show_bug.cgi?id=2437">SF Bug 2437</a> - End-user installation script does not fully describe or report missing build dependencies (libbz2-dev, etc. needed)</li>
+<li><a href="http://developer.symbian.org/bugs/show_bug.cgi?id=3647">SF Bug 3647</a> - Raptor retains read-only attribute when exporting files</li>
+</ul>
+
<h2>version 2.15.1</h2>
<h3>Defect Fixes</h3>
--- a/sbsv2/raptor/bin/annofile.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/bin/annofile.py Mon Oct 18 10:23:52 2010 +0100
@@ -24,6 +24,7 @@
def __init__(self, name, maxagents=30):
self.name = name
self.overallAggregateTime = 0
+ self.duration = 0
self.inJob = False
self.inMetricDuration = False
self.jobType = ''
--- a/sbsv2/raptor/bin/createvmap.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/bin/createvmap.py Mon Oct 18 10:23:52 2010 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
@@ -24,6 +24,11 @@
import traceback
from optparse import OptionParser
+# Need to find the raptor utilities.
+sys.path.append(os.path.join(os.environ['SBS_HOME'],"python"))
+from raptor_utilities import expand_command_options
+
+
# the script will exit with 0 if there are no errors
global exitCode
exitCode = 0
@@ -184,7 +189,18 @@
parser.add_option("-u","--userinc",action="append",dest="user_include",help="User Include Folders")
parser.add_option("-x","--systeminc",action="append",dest="system_include",help="System Include Folders")
- (options, leftover_args) = parser.parse_args(sys.argv[1:])
+
+ # The following allows the use of the --command option.
+ # The add_option() is redundant since --command is
+ # expanded well before it can take effect but it does
+ # allow us to print out a useful help message.
+ parser.add_option("--command",action="store",
+ dest="preinclude",
+ help="""Specify a command file with more commandline options
+ in it (for very large components)""")
+ expanded_args = expand_command_options(sys.argv[1:])
+
+ (options, leftover_args) = parser.parse_args(expanded_args)
if leftover_args:
for invalids in leftover_args:
--- a/sbsv2/raptor/bin/install_raptor.sh Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/bin/install_raptor.sh Mon Oct 18 10:23:52 2010 +0100
@@ -50,6 +50,12 @@
echo "You DON'T appear to have the ncurses dev libraries - please install them (ncurses-dev or ncurses-devel)"
fi
+if [ -f "/usr/include/bzlib.h" ]; then
+ echo "You appear to have the bzip2 dev libraries"
+else
+ echo "You DON'T appear to have the bzip2 dev libraries - please install them (bzip2-dev or bzip2-devel)"
+fi
+
echo "Do you wish to continue (Y or y for 'yes' anything else for no)?"
read X
--- a/sbsv2/raptor/bin/sbs_index.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/bin/sbs_index.py Mon Oct 18 10:23:52 2010 +0100
@@ -6,20 +6,16 @@
# under the terms of the License "Symbian Foundation License v1.0"
# which accompanies this distribution, and is available
# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description:
-#
-# Tie together a set of HTML build summaries by creating a single index page
-# which shows the total number of Errors, Warnings etc. across all the parts
-# of the build and links to the individual summaries.
+
+'''
+Tie together a set of HTML build summaries by creating a single index page
+which shows the total number of Errors, Warnings etc. across all the parts
+of the build and links to the individual summaries.
+'''
import os
import sys
+import time
# get the absolute path to this script
script = os.path.abspath(sys.argv[0])
@@ -104,8 +100,13 @@
for row in reader:
type = int(row[0])
style = row[1]
- count = int(row[2])
- if count == 0 or filter_html.Records.SUBDIRS[type] == style:
+
+ if style == 'time':
+ count = float(row[2])
+ else:
+ count = int(row[2])
+
+ if count == 0 or filter_html.Records.CLASSES[type] == style:
grandtotal[type] += count
columns.append((style,count))
else:
@@ -119,7 +120,11 @@
linkname = os.path.relpath(os.path.join(linktext, "index.html"), indexdir)
index.write('<tr><td class="name"><a href="%s">%s</a></td>' % (linkname, linktext))
for (style, count) in columns:
- index.write('<td class="%s">%d</td>' % (style, count))
+ if style == 'time':
+ n = time.strftime("%H:%M:%S", time.gmtime(count + 0.5))
+ else:
+ n = str(count)
+ index.write('<td class="%s">%s</td>' % (style, n))
index.write("</tr>")
except:
sys.stderr.write("error: cannot write index file %s\n" % indexfile)
@@ -129,10 +134,16 @@
try:
index.write('<tr><td> </td></tr><tr><td class="name">total</td>')
for i, count in enumerate(grandtotal):
+ style = filter_html.Records.CLASSES[i]
+ if style == 'time':
+ n = time.strftime("%H:%M:%S", time.gmtime(count + 0.5))
+ else:
+ n = str(count)
+
if count == 0:
index.write('<td class="zero">0</td>')
else:
- index.write('<td class="%s">%d</td>' % (filter_html.Records.SUBDIRS[i], count))
+ index.write('<td class="%s">%s</td>' % (style, n))
index.write("</tr></table>")
index.write("</body></html>\n")
index.close()
--- a/sbsv2/raptor/examples/os_properties.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/examples/os_properties.xml Mon Oct 18 10:23:52 2010 +0100
@@ -11,14 +11,13 @@
The file can have any name as long as it ends with ".xml"
-->
-
- <!-- changes required for v9.4, TB91, and TB91sf -->
<var name="root.changes">
<set name='POSTLINKER_SUPPORTS_WDP' value=''/>
<set name='SUPPORTS_STDCPP_NEWLIB' value=''/>
<set name='RVCT_PRE_INCLUDE' value='$(EPOCINCLUDE)/rvct2_2/rvct2_2.h'/>
<set name="SUPPORTS_ABIV1_IMPLIBS" value='1'/>
+ <set name='VARIANT_HRH' value='$(EPOCINCLUDE)/feature_settings.hrh'/>
</var>
</build>
--- a/sbsv2/raptor/lib/config/arm.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/config/arm.xml Mon Oct 18 10:23:52 2010 +0100
@@ -7,17 +7,23 @@
<!-- tools and scripts -->
<env name="BMCONV" default="$(EPOCROOT)/epoc32/tools/bmconv$(DOTEXE)" type="tool"/>
- <env name="CHECKLIB" default="$(EPOCROOT)/epoc32/tools/checklib$(DOTEXE)" type="tool"/>
+ <env name="SBS_CHECKLIB" default="$(EPOCTOOLS)/checklib$(DOTEXE)" type="tool"/>
+ <set name="CHECKLIB" value="$(SBS_CHECKLIB)"/>
<env name="CPPFILT" default="$(GCCPREFIX)c++filt$(DOTEXE)" type="tool"/>
- <env name="EFREEZE" default="$(PERL) $(EPOCROOT)/epoc32/tools/efreeze.pl" type="script"/>
- <env name="ELF2E32" default="$(EPOCROOT)/epoc32/tools/elf2e32$(DOTEXE)" type="tool"/>
- <env name="PREPDEF" default="$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl" type="script"/>
- <env name="RCOMP" default="$(EPOCROOT)/epoc32/tools/rcomp$(DOTEXE)" type="tool"/>
+ <env name="SBS_EFREEZE" default="$(PERL) $(EPOCTOOLS)/efreeze.pl" type="script"/>
+ <set name="EFREEZE" value="$(SBS_EFREEZE)"/>
+ <env name="SBS_ELF2E32" default="$(EPOCTOOLS)/elf2e32$(DOTEXE)" type="tool"/>
+ <set name="ELF2E32" value="$(SBS_ELF2E32)"/>
+ <env name="SBS_PREPDEF" default="$(PERL) $(EPOCTOOLS)/prepdef.pl" type="script"/>
+ <set name="PREPDEF" value="$(SBS_PREPDEF)"/>
+ <env name="SBS_RCOMP" default="$(EPOCTOOLS)/rcomp$(DOTEXE)" type="tool"/>
+ <set name="RCOMP" value="$(SBS_RCOMP)"/>
<!-- RANSLEEP is a program that can be used to cause a random delay in milliseconds. This is only useful in parallel builds. See the PERTURBSTARTTIME switch for more details. -->
<env name="RANSLEEP" default="$(SBS_HOME)/bin/$(HOSTPLATFORM_DIR)/ransleep$(DOTEXE)" type="tool"/>
<env name="SBSV1MAKE" default="$(EPOCROOT)/epoc32/tools/make$(DOTEXE)" type="tool"/>
<env name="STRINGTABLE" default="$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl" type="script"/>
- <env name="TRANASM" default="$(PERL) $(EPOCROOT)/epoc32/tools/tranasm.pl" type="script"/>
+ <env name="SBS_TRANASM" default="$(PERL) $(EPOCTOOLS)/tranasm.pl" type="script"/>
+ <set name="TRANASM" value="$(SBS_TRANASM)"/>
<set name="BASE_ARCH" value="arm"/>
<set name="POSTLINKER" value="$(ELF2E32)"/>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/lib/config/empty.hrh Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,9 @@
+/*
+
+There is a general assumption that there is always a pre-include file
+in every build. So for the cases where there is no .hrh file in the
+epoc32 tree, yet, you can use this file.
+
+The "nohrh" variant points VARIANT_HRH at this file.
+
+*/
--- a/sbsv2/raptor/lib/config/gcc.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/config/gcc.xml Mon Oct 18 10:23:52 2010 +0100
@@ -94,7 +94,7 @@
<alias name="tools2_deb" meaning="tools2_base.t_deb"/>
<var name="t_rel">
- <set name='TOOLSPATH' value='$(EPOCTOOLS)'/> <!-- install -->
+ <set name='TOOLSPATH' value='$(EPOCROOT)/epoc32/tools'/> <!-- install -->
<set name='VARIANTTYPE' value='rel'/>
<append name='CFLAGS' value='-s'/>
--- a/sbsv2/raptor/lib/config/gccxml.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/config/gccxml.xml Mon Oct 18 10:23:52 2010 +0100
@@ -11,9 +11,12 @@
<env name='CPP' default='$(GNUCPP)' type='tool'/>
<env name='CREATERFIFILE' default='$(PERL) $(SBS_HOME)/bin/createrfifile.pl ' type='script'/>
<env name='GNUAWK' default='$(GNUPREFIX)gawk$(DOTEXE)' type='tool' versionCommand='$(GNUAWK) --version' versionResult='GNU Awk [3-9].*'/>
- <env name='MAKEDEF' default='$(PERL) $(EPOCROOT)/epoc32/tools/makedef.pl' type='script'/>
- <env name='PREPDEF' default='$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl' type='script'/>
- <env name='RCOMP' default='$(EPOCROOT)/epoc32/tools/rcomp$(DOTEXE)' type='tool'/>
+ <env name='SBS_MAKEDEF' default='$(PERL) $(EPOCTOOLS)/makedef.pl' type='script'/>
+ <set name='MAKEDEF' value='$(SBS_MAKEDEF)'/>
+ <env name='SBS_PREPDEF' default='$(PERL) $(EPOCTOOLS)/prepdef.pl' type='script'/>
+ <set name='PREPDEF' value='$(SBS_PREPDEF)'/>
+ <env name='SBS_RCOMP' default='$(EPOCTOOLS)/rcomp$(DOTEXE)' type='tool'/>
+ <set name='RCOMP' value='$(SBS_RCOMP)'/>
<env name='STRINGTABLE' default='$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl' type='script'/>
<!-- link to bld.inf and mmp platform names -->
--- a/sbsv2/raptor/lib/config/locations.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/config/locations.xml Mon Oct 18 10:23:52 2010 +0100
@@ -7,29 +7,32 @@
-->
<var name="hostplatform.locations" host='linux.*'>
+ <env name='SBS_SLASHBIN' default='/bin'/>
+ <env name='SBS_USRBIN' default='/usr/bin'/>
+
<set name='DOTEXE' value=''/>
- <set name='GCCPREFIX' value='/usr/bin/'/>
- <set name='GNUPREFIX' value='/bin/'/>
+ <set name='GCCPREFIX' value='$(SBS_USRBIN)/'/>
+ <set name='GNUPREFIX' value='$(SBS_SLASHBIN)/'/>
<env name='HOSTPLATFORM_DIR' default='linux-i386' />
<env name='HOSTPLATFORM' default='linux i386'/>
- <env name='SBS_GNUCPP' default='/usr/bin/cpp' type='tool'/>
- <env name='SBS_GNUDATE' default='/bin/date' type='tool'/>
+ <env name='SBS_GNUCPP' default='$(SBS_USRBIN)/cpp' type='tool'/>
+ <env name='SBS_GNUDATE' default='$(SBS_SLASHBIN)/date' type='tool'/>
<env name='SBS_GNUMAKE38' default='$(SBS_HOME)/$(HOSTPLATFORM_DIR)/bin/make' type='tool'/>
- <env name='SBS_GNUSED' default='/bin/sed' type='tool'/>
- <env name='SBS_GNUMKDIR' default='/bin/mkdir' type='tool'/>
- <env name='SBS_GNUMV' default='/bin/mv' type='tool'/>
- <env name='SBS_GNUCP' default='/bin/cp' type='tool'/>
- <env name='SBS_GNUCAT' default='/bin/cat' type='tool'/>
- <env name='SBS_GNURM' default='/bin/rm' type='tool'/>
- <env name='SBS_GNULN' default='/bin/ln' type='tool'/>
- <env name='SBS_GNURMDIR' default='/bin/rmdir' type='tool'/>
- <env name='SBS_GNUCHMOD' default='/bin/chmod' type='tool'/>
- <env name='SBS_GNUMD5SUM' default='/usr/bin/md5sum' type='tool'/>
- <env name='SBS_GNUTOUCH' default='/bin/touch' type='tool'/>
- <env name='SBS_GNUFIND' default='/usr/bin/find' type='tool'/>
- <env name='SBS_GNUGREP' default='/bin/grep' type='tool'/>
+ <env name='SBS_GNUSED' default='$(SBS_SLASHBIN)/sed' type='tool'/>
+ <env name='SBS_GNUMKDIR' default='$(SBS_SLASHBIN)/mkdir' type='tool'/>
+ <env name='SBS_GNUMV' default='$(SBS_SLASHBIN)/mv' type='tool'/>
+ <env name='SBS_GNUCP' default='$(SBS_SLASHBIN)/cp' type='tool'/>
+ <env name='SBS_GNUCAT' default='$(SBS_SLASHBIN)/cat' type='tool'/>
+ <env name='SBS_GNURM' default='$(SBS_SLASHBIN)/rm' type='tool'/>
+ <env name='SBS_GNULN' default='$(SBS_SLASHBIN)/ln' type='tool'/>
+ <env name='SBS_GNURMDIR' default='$(SBS_SLASHBIN)/rmdir' type='tool'/>
+ <env name='SBS_GNUCHMOD' default='$(SBS_SLASHBIN)/chmod' type='tool'/>
+ <env name='SBS_GNUMD5SUM' default='$(SBS_USRBIN)/md5sum' type='tool'/>
+ <env name='SBS_GNUTOUCH' default='$(SBS_SLASHBIN)/touch' type='tool'/>
+ <env name='SBS_GNUFIND' default='$(SBS_USRBIN)/find' type='tool'/>
+ <env name='SBS_GNUGREP' default='$(SBS_SLASHBIN)/grep' type='tool'/>
<env name='SBS_GNUSORT' default='sort' type='tool'/>
<env name='SBS_SHELL' default="$(SBS_HOME)/$(HOSTPLATFORM_DIR)/bin/sh" type='tool'/>
<env name='SBS_ZIP' default="$(SBS_HOME)/$(HOSTPLATFORM_DIR)/bin/zip" type='tool'/>
--- a/sbsv2/raptor/lib/config/logfile_regex.csv Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/config/logfile_regex.csv Mon Oct 18 10:23:52 2010 +0100
@@ -1,37 +1,65 @@
-priority,regex,modifiers
-ERROR,error\s*:,ignorecase
-ERROR,ERROR\t,
-ERROR,cannot create regular file,
-ERROR,Missing file:,
-ERROR,is not recognized as an internal or external command,
-ERROR,MISSING:,
-ERROR,fatal error,
-ERROR,warning U4010,
-ERROR,Internal fault,
-ERROR,target .* given more than once in the same rule,
-ERROR,[Nn]o such file or directory,
-ERROR,Exception: [A-Z0-9_]+,
-ERROR,ERROR EC\d+:,
-ERROR,Errors caused tool to abort,
-ERROR,Traceback \(most recent call last\),
-ERROR,Application encountered an unexpected error,
-ERROR,Unable to write dump file,
-ERROR,Unable to connect to CM:,
-ERROR,: Incorrect,
-ERROR,The system cannot find the path specified,
-ERROR,[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049),
-REMARK,No feature macros were found in the source,
-REMARK,is shorter than expected,
-REMARK,Command line warning D4025 :,
-REMARK,REMARK:,
-REMARK,EventType:\s+Error\s+Source:\s+GNU\s+Make,
-REMARK,: note:,
-WARNING,\(\d+\) : warning C,
-WARNING,mwld.exe:,
-WARNING,Command line warning,
-WARNING,ERROR: bad relocation:,
-WARNING,\d+ warning,
-WARNING,EventType:\s+Error\s+Source:\s+SweepNT,
-WARNING,WARN\t,
-WARNING,LINK : warning,
-WARNING,warning\s*:,ignorecase
+priority,regex,description
+CRITICAL,.*Error:.*mingw_make\.exe.*,
+ERROR,.*\: cannot create regular file.*,
+ERROR,.*\): Missing file:.*,
+ERROR,(?:(?:\s*\d+\)\s*)|(?:\s*\*\*\*\s*))ERROR:.*,
+ERROR,.*is not recognized as an internal or external command.*,
+ERROR,MISSING:.*,
+ERROR,.*FLEXlm error:.*,
+ERROR,.*(ABLD|BLDMAKE)\s*ERROR:.*,
+ERROR,.*FATAL ERROR\(S\):.*,
+ERROR,.*fatal error C1001: INTERNAL COMPILER ERROR.*,
+ERROR,.*fatal error U1077.*,
+ERROR,^fatal error.*,
+ERROR,.*warning U4010.*,
+ERROR,make(?:\.exe)?\s*(?:\[\d+\])\s*?\:\s*\*\*\*.*,
+ERROR,make(?:\.exe)(?:\[\d+\])?\:.*\s+not\s+remade.*,
+ERROR,make(?:\.exe)\s*:\s*\*\*\*.*\s*[Nn]o rule.*,
+ERROR,"\""(?:.*)\"" , line (\d+): (Error: +(.\d+.*?):.*)",
+ERROR,error: ((Internal fault):.*)$,
+ERROR,.*Exception: STATUS_ACCESS_VIOLATION.*,
+ERROR,.*target .* given more than once in the same rule.*,
+ERROR,ERROR:.*,
+ERROR,Error:.*,
+ERROR,ERROR\t.*,
+ERROR,^.*\s*elf2e32\s*:\s*Error\s*:\s*,
+ERROR,.*[Nn]o such file or directory\s*.*,
+ERROR,Exception: [A-Z0-9_]+.*,
+ERROR,.*target .* given more than once in the same rule.*,
+ERROR,ERROR EC\d+:.*,
+ERROR,Errors caused tool to abort..*,
+ERROR,ERROR\t.*,
+ERROR,.*Traceback \(most recent call last\).*,
+ERROR,Application encountered an unexpected error\.\s*Stopping\.\s*,
+ERROR,Unable to write dump file .+,
+ERROR,Unable to connect to CM: .*,
+ERROR,.*: Incorrect slash in .*,
+ERROR,.*: Incorrect case for epoc32 tree in .*,
+ERROR,.*: Incorrect case versus exclusion list in .*,
+ERROR,The system cannot find the path specified.*,
+CRITICAL,.*[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049).*,
+WARNING,(\d+\))?\s.*WARNING:.*,
+WARNING,(BLDMAKE |MAKEDEF )?WARNING:.*,
+WARNING,.*\(\d+\) : warning C.*,
+WARNING,.*\d+: warning:.*,
+WARNING,.*Usage Warning:.*,
+WARNING,.*mwld.exe:.*,
+WARNING,Command line warning.*,
+WARNING,.*ERROR: bad relocation:.*,
+WARNING,(\d+) warning.*,
+WARNING,.*EventType:\s+Error\s+Source:\s+SweepNT.*,
+WARNING,WARN\t.*,
+WARNING,.*LINK : warning.*,
+WARNING,.*\s*elf2e32\s*:\s*Warning\s*:\s*,
+WARNING,Warning:.*,
+REMARK,"\"".*\""\, line \d+: Warning: +(.\d+.*?):.*",
+REMARK,.*Command line warning D4025 : .*,
+REMARK,REMARK: .*,
+REMARK,EventType:\s+Error\s+Source:\s+GNU\s+Make.*,
+REMARK,".*:\d+: warning: cannot find matching deallocation function.*",
+REMARK,(:\d+)*: note: .*,
+INFO,INFO:.*,
+WARNING,"line \d+: Warning:'\, r':\s+warning\s+\w+:.*",
+WARNING,"\""(.*)\""\, line (\d+): (Warning: +(?!A1495E)(.\d+.*?):.*)",
+WARNING,Warning\s*:\s*.*,
+ERROR,.*Error\s*:\s*.*,
\ No newline at end of file
--- a/sbsv2/raptor/lib/config/root.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/config/root.xml Mon Oct 18 10:23:52 2010 +0100
@@ -23,17 +23,18 @@
<!-- Common folders and files -->
<var name="root.places">
<env name='EPOCROOT' default='/' type='path'/>
+ <env name='SBS_EPOCTOOLS' default='$(EPOCROOT)/epoc32/tools' type='path'/>
<set name='EPOCINCLUDE' value='$(EPOCROOT)/epoc32/include'/>
- <set name='EPOCTOOLS' value='$(EPOCROOT)/epoc32/tools'/>
+ <set name='EPOCTOOLS' value='$(SBS_EPOCTOOLS)'/>
<!-- Place where intermediate files are built -->
<env name='SBS_BUILD_DIR' default='$(EPOCROOT)/epoc32/build' type='path'/>
<!-- Configuration files and directories -->
<set name='PRODUCT_INCLUDE' value='$(EPOCINCLUDE)/variant/symbian_os.hrh'/>
- <set name='VARIANT_CFG' value='$(EPOCTOOLS)/variant/variant.cfg'/>
- <set name='MAKEFILE_TEMPLATES' value='$(EPOCTOOLS)/makefile_templates'/>
+ <set name='VARIANT_CFG' value='$(EPOCROOT)/epoc32/tools/variant/variant.cfg'/>
+ <set name='MAKEFILE_TEMPLATES' value='$(EPOCROOT)/epoc32/tools/makefile_templates'/>
<set name='FLM_EXPORT_DIR' value='$(MAKEFILE_TEMPLATES)'/>
</var>
--- a/sbsv2/raptor/lib/config/variants.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/config/variants.xml Mon Oct 18 10:23:52 2010 +0100
@@ -287,4 +287,8 @@
<set name="DEBUG_INFO" value=""/>
</var>
+ <!-- for builds which don't need a populated .hrh file -->
+ <var name="nohrh">
+ <set name="VARIANT_HRH" value="$(SBS_HOME)/lib/config/empty.hrh"/>
+ </var>
</build>
--- a/sbsv2/raptor/lib/config/winscw.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/config/winscw.xml Mon Oct 18 10:23:52 2010 +0100
@@ -16,14 +16,20 @@
<!-- tools and scripts -->
<env name="BMCONV" default="$(EPOCROOT)/epoc32/tools/bmconv$(DOTEXE)" type="tool"/>
- <env name="CHECKLIB" default="$(EPOCROOT)/epoc32/tools/checklib$(DOTEXE)" type="tool"/>
- <env name="EFREEZE" default="$(PERL) $(EPOCROOT)/epoc32/tools/efreeze.pl" type="script"/>
- <env name="MAKEDEF" default="$(PERL) $(EPOCROOT)/epoc32/tools/makedef.pl" type="script"/>
- <env name="PREPDEF" default="$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl" type="script"/>
- <env name="RCOMP" default="$(EPOCROOT)/epoc32/tools/rcomp$(DOTEXE)" type="tool"/>
+ <env name="SBS_CHECKLIB" default="$(EPOCTOOLS)/checklib$(DOTEXE)" type="tool"/>
+ <set name="CHECKLIB" value="$(SBS_CHECKLIB)"/>
+ <env name="SBS_EFREEZE" default="$(PERL) $(EPOCTOOLS)/efreeze.pl" type="script"/>
+ <set name="EFREEZE" value="$(SBS_EFREEZE)"/>
+ <env name='SBS_MAKEDEF' default='$(PERL) $(EPOCTOOLS)/makedef.pl' type='script'/>
+ <set name='MAKEDEF' value='$(SBS_MAKEDEF)'/>
+
+ <env name="SBS_PREPDEF" default="$(PERL) $(EPOCTOOLS)/prepdef.pl" type="script"/>
+ <set name="PREPDEF" value="$(SBS_PREPDEF)"/>
+ <env name="SBS_RCOMP" default="$(EPOCTOOLS)/rcomp$(DOTEXE)" type="tool"/>
+ <set name="RCOMP" value="$(SBS_RCOMP)"/>
<env name="SBSV1MAKE" default="$(EPOCROOT)/epoc32/tools/make$(DOTEXE)" type="tool"/>
<env name="STRINGTABLE" default="$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl" type="script"/>
-
+
<!-- link to bld.inf and mmp platform names -->
<set name="TRADITIONAL_PLATFORM" value="WINSCW"/>
@@ -121,7 +127,8 @@
<set name="STDCPP_INCLUDE" value="$(EPOCINCLUDE)/stdapis"/>
<set name="STDCPP_WCHAR_DEF" value="__wchar_t_defined"/>
<set name="SYMLOOKUPARGS" value="--ignore_export_dir"/>
- <set name="SYMLOOKUPUTIL" value="$(PERL) $(EPOCROOT)/epoc32/tools/sym_lkup_util.pl"/>
+ <env name="SBS_SYMLOOKUPUTIL" default="$(PERL) $(EPOCTOOLS)/sym_lkup_util.pl" type="tool"/>
+ <set name="SYMLOOKUPUTIL" value="$(SBS_SYMLOOKUPUTIL)"/>
<set name="SYSTEMINCLUDE" value=""/>
<set name="TARGET" value="TARGET_WAS_NOT_SET_PROPERLY"/>
<set name="TARGETPATH" value=""/>
--- a/sbsv2/raptor/lib/config/x86.xml Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/config/x86.xml Mon Oct 18 10:23:52 2010 +0100
@@ -7,21 +7,28 @@
<!-- tools and scripts -->
<env name="BMCONV" default="$(EPOCROOT)/epoc32/tools/bmconv$(DOTEXE)" type="tool"/>
- <env name="CHECKLIB" default="$(EPOCROOT)/epoc32/tools/checklib$(DOTEXE)" type="tool"/>
+ <env name="SBS_CHECKLIB" default="$(EPOCTOOLS)/checklib$(DOTEXE)" type="tool"/>
+ <set name="CHECKLIB" value="$(SBS_CHECKLIB)"/>
<env name="CPPFILT" default="$(GCCPREFIX)c++filt$(DOTEXE)" type="tool"/>
- <env name="EFREEZE" default="$(PERL) $(EPOCROOT)/epoc32/tools/efreeze.pl" type="script"/>
+ <env name="SBS_EFREEZE" default="$(PERL) $(EPOCTOOLS)/efreeze.pl" type="script"/>
+ <set name="EFREEZE" value="$(SBS_EFREEZE)"/>
<env name="GENDEF" default="$(PERL) $(EPOCROOT)/epoc32/tools/gendef.pl" type="script"/>
- <env name="PETRAN" default="$(EPOCROOT)/epoc32/tools/petran$(DOTEXE)" type="tool"/>
- <env name="PREPDEF" default="$(PERL) $(EPOCROOT)/epoc32/tools/prepdef.pl" type="script"/>
- <env name="RCOMP" default="$(EPOCROOT)/epoc32/tools/rcomp$(DOTEXE)" type="tool"/>
+ <env name="SBS_PETRAN" default="$(EPOCTOOLS)/petran$(DOTEXE)" type="tool"/>
+ <set name="PETRAN" value="$(SBS_PETRAN)"/>
+ <env name="SBS_PREPDEF" default="$(PERL) $(EPOCTOOLS)/prepdef.pl" type="script"/>
+ <set name="PREPDEF" value="$(SBS_PREPDEF)"/>
+
+ <env name="SBS_RCOMP" default="$(EPOCTOOLS)/rcomp$(DOTEXE)" type="tool"/>
+ <set name="RCOMP" value="$(SBS_RCOMP)"/>
<!-- RANSLEEP is a program that can be used to cause a random delay in milliseconds. This is only useful in parallel builds. See the PERTURBSTARTTIME switch for more details. -->
<env name="RANSLEEP" default="$(SBS_HOME)/bin/$(HOSTPLATFORM_DIR)/ransleep$(DOTEXE)" type="tool"/>
<env name="SBSV1MAKE" default="$(EPOCROOT)/epoc32/tools/make$(DOTEXE)" type="tool"/>
<env name="STRINGTABLE" default="$(PERL) $(EPOCROOT)/epoc32/tools/stringtable.pl" type="script"/>
- <env name="TRANASM" default="$(PERL) $(EPOCROOT)/epoc32/tools/tranasm.pl" type="script"/>
+ <env name="SBS_TRANASM" default="$(PERL) $(EPOCTOOLS)/tranasm.pl" type="script"/>
+ <set name="TRANASM" value="$(SBS_TRANASM)"/>
<set name="BASE_ARCH" value="x86"/>
- <set name="POSTLINKER" value="$(PETRAN)"/>
+ <set name="POSTLINKER" value="$(SBS_PETRAN)"/>
<set name="IMPLIBTOOL" value="$(DLLTOOL)"/>
<set name="DEFGENTOOL" value="$(GENDEF)"/>
--- a/sbsv2/raptor/lib/flm/e32abiv2.flm Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/flm/e32abiv2.flm Mon Oct 18 10:23:52 2010 +0100
@@ -1133,7 +1133,6 @@
TARGET:: $(OUTPUTVMAP)
VMAPNEEDS:=$(E32TARGET) $(SOURCE) $(PROJECT_META)
-BV_SOURCELIST:=$(addprefix -s ,$(SOURCE) $(PROJECT_META))
BV_FEATURELIST:=$(addprefix -f ,$(FEATURELISTFILES))
BV_USER_INCLUDES:=$(addprefix -u ,$(USERINCLUDE))
BV_SYSTEM_INCLUDES:=$(addprefix -x ,$(SYSTEMINCLUDE))
@@ -1141,12 +1140,24 @@
# translate double quoted macros because $(shell) messes them up in some make engines
BV_MACROLIST:=$(COMPILER_INTERWORK_DEFINES) $(CDEFS) $(if $(ALWAYS_BUILD_AS_ARM),,$(COMPILER_THUMB_DEFINES))
BV_DEFINES:=$(call makemacrodef,-D,$(subst ",__SBS__QUOTE__,$(BV_MACROLIST)))
+VMAPCOMMANDFILE:=$(INTERMEDIATEPATH)/$(TARGET).vmap.cmdfile
+
+CLEANTARGETS:=$(CLEANTARGETS) $(VMAPCOMMANDFILE)
# the script to generate our .vmap file and hash value
-VMAPCOMMAND:=$(CREATEVMAP) -o $(OUTPUTVMAP) $(BV_FEATURELIST) $(BV_DEFINES) -p $(PREINCLUDE) $(BV_SOURCELIST) $(BV_USER_INCLUDES) $(BV_SYSTEM_INCLUDES) -c $(CREATEVMAPCPP)
+define createvmap
+
+$(OUTPUTVMAP): $(VMAPNEEDS)
+ @echo -n "" > $(VMAPCOMMANDFILE);
+ $(call groupin10infile,$(VMAPCOMMANDFILE),$(addprefix -s,$(SOURCE) $(PROJECT_META))) ;
+ $(call startrule,createvmap) \
+ $(CREATEVMAP) -o $(OUTPUTVMAP) $(BV_FEATURELIST) $(BV_DEFINES) -p $(PREINCLUDE) --command=$(VMAPCOMMANDFILE) $(BV_USER_INCLUDES) $(BV_SYSTEM_INCLUDES) -c $(CREATEVMAPCPP) \
+ $(call endrule,createvmap)
+
+endef
# a recipe to create the .vmap from the "sources" with the createvmap script
-$(call raptor_recipe,createvmap,$(OUTPUTVMAP),$(VMAPNEEDS),$(VMAPCOMMAND))
+$(eval $(createvmap))
endif # E32TARGET != ""
endif # FEATUREVARIANTNAME != ""
--- a/sbsv2/raptor/lib/flm/run.mk Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-.PHONY:: ALL
-ALL:: # Default target
-
-HOSTPLATFORM:=win 32
-HOSTPLATFORM_DIR:=win32
-OSTYPE:=cygwin
-FLMHOME:=E:/wip2/lib/flm
-SHELL:=E:/wip2/win32/cygwin/bin/sh.exe
-
-
-USE_TALON:=
-
-
-
-include E:/wip2/lib/flm/globals.mk
-
-# dynamic default targets
-
-# call E:/wip2/lib/flm/config/default.flm
-SBS_SPECIFICATION:=Symbian.config.default
-SBS_CONFIGURATION:=armv5_urel
-
-EPOCROOT:=E:/wip2/test/epocroot
-ELF2E32:=E:/wip2/test/epocroot/epoc32/tools/elf2e32.exe
-WHATLOG:=
-include E:/wip2/lib/flm/config/default.flm
-
-
-component_paths:=$(SBS_HOME)/test/smoke_suite/test_resources/simple/bld.inf|c:/make_test/a.mk \
-$(SBS_HOME)/test/smoke_suite/test_resources/simple_dll/bld.inf|c:/make_test/b.mk \
-$(SBS_HOME)/test/smoke_suite/test_resources/simple/always_build_as_arm_bld.inf|c:/make_test/c.mk \
-$(SBS_HOME)/test/smoke_suite/test_resources/simple/debuggable_bld.inf|c:/make_test/d.mk \
-$(SBS_HOME)/test/smoke_suite/test_resources/simple_export/bld.inf|c:/make_test/e.mk
-
-configs:=armv5 armv7
-
-cli_options:=-d
-
-include build.flm
--- a/sbsv2/raptor/lib/flm/stringtable.flm Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/flm/stringtable.flm Mon Oct 18 10:23:52 2010 +0100
@@ -66,7 +66,7 @@
$(STRINGTABLEHEADER): $(SOURCE)
$(call startrule,stringtable,FORCESUCCESS) \
- $(GNUCP) --no-preserve=mode $(SOURCE) $(TEMPSOURCE) && $(GNUCHMOD) a+w $(TEMPSOURCE) && \
+ $(GNUCP) --remove-destination --no-preserve=mode $(SOURCE) $(TEMPSOURCE) && $(GNUCHMOD) a+w $(TEMPSOURCE) && \
$(STRINGTABLE) $(TEMPSOURCE) \
$(call endrule,stringtable)
--- a/sbsv2/raptor/lib/flm/tools2exe.flm Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/lib/flm/tools2exe.flm Mon Oct 18 10:23:52 2010 +0100
@@ -73,7 +73,7 @@
define tools2install
$(INSTALLED): $(EXETARGET)
$(call startrule,tools2install) \
- $(GNUCP) "$(EXETARGET)" "$(INSTALLED)" && \
+ $(GNUCP) --remove-destination "$(EXETARGET)" "$(INSTALLED)" && \
$(GNUCHMOD) a+rwx "$(INSTALLED)" \
$(call endrule,tools2install)
endef
--- a/sbsv2/raptor/notes/filter_html.txt Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/notes/filter_html.txt Mon Oct 18 10:23:52 2010 +0100
@@ -1,15 +1,15 @@
There is a new log filter to generate HTML output. For example,
-sbs --filters=html -f logdir
+sbs --filters=html -f name
-will produce an output file "logdir/index.html" and other supporting files
-in the directory "logdir". This can be used alongside the Bz2 filter to
+will produce an output file "name_html/index.html" and other supporting files
+in the directory "name_html". This can be used alongside the Bz2 filter to
generate both a human readable summary and a compressed log for further
detailed machine analysis if required: for example,
sbs --filters=html,bz2log -f name
-will produce a folder "name" and a file "name.bz2".
+will produce a folder "name_html" and a file "name.bz2".
If a build is done in several parts, for example,
@@ -21,7 +21,7 @@
Then there is a new script "SBS_HOME/bin/sbs_index.py" which can produce a
single index linking to all the individual parts: for example,
-sbs_index.py build/part1 build/part2 build/part3 build/index.html
+sbs_index.py build/part{1,2,3}_html build/index.html
the first parameters are the directories to search for summaries and the
last parameter is the name of the overall index file. Directories are
@@ -30,12 +30,32 @@
sbs_index.py build build/index.html
-Text in the Raptor logs is classified as Error, Warning or Remark using the
-list of regular expressions in the file SBS_HOME/lib/config/logfile_regex.csv
+Text in the Raptor logs is classified as Error, Critical, Warning or Remark
+using the list of regular expressions in the file,
+
+SBS_HOME/lib/config/logfile_regex.csv
+
but this can be overriden by placing a file of the same name in the kit in
its EPOCROOT/epoc32/sbs_config folder.
The filter also checks that all the files which were listed in "what" output
actually exist at the end of the build. Any files which don't exist are
-recorded as "Missing files".
\ No newline at end of file
+recorded as "Missing files".
+
+
+Sometimes when a target cannot be built you will see errors like this in the
+HTML report,
+"
+/opt/nokia/wk99/epoc32/build/something
+
+required the following files which could not be found,
+
+/opt/nokia/wk99/epoc32/include/foo
+/opt/nokia/wk99/epoc32/include/bar
+"
+
+which means that a dependency was created on "foo" and "bar" but the build
+did not contain any information anywhere on how to build those files. This
+is often caused by someone just forgetting to add files to the asset.
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/notes/tools_env_vars.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,37 @@
+A requirement on Raptor is to allow all the tools to be configurable via
+environment variables. To this end, updates have been made to extend the list
+of tools that can be configured using environment variables.
+
+The list of new SBS_*** environment variables and their purpose is given below:
+
+SBS_EPOCTOOLS Directory for epoc32 tools; defaults to $EPOCROOT/epoc32/tools
+ Changes the default locations for all of the following tools.
+SBS_CHECKLIB Full path to checklib program
+SBS_EFREEZE perl, followed by full path to efreeze.pl
+SBS_ELF2E32 Full path to elf2e32 program
+SBS_PREPDEF perl, followed by full path to prepdef.pl
+SBS_RCOMP Full path to rcomp program
+SBS_TRANASM perl, followed by full path to tranasm.pl
+SBS_MAKEDEF perl, followed by full path to makedef.pl
+SBS_PETRAN perl, followed by full path to petran.pl
+SBS_SYMLOOKUPUTIL perl, followed by full path to sym_lkup_util.pl
+SBS_SLASHBIN Linux only: location of /bin, i.e. an alternative location for
+ GCC and associated tools
+SBS_USRBIN Linux only: location of /usr/bin, i.e. an alternative location
+ for Gnu tools such as the Core Utils
+
+In the case Perl scripts (.pl files), "perl" can be replaced with the full path to
+the perl program.
+
+The above variables supercede the following environment variables:
+
+CHECKLIB
+EFREEZE
+ELF2E32
+MAKEDEF
+PETRAN
+PREPDEF
+RCOMP
+TRANASM
+
+which are no longer in use.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/notes/variant_cfg.txt Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,25 @@
+The pre-included header file used in builds (.hrh) is normally defined
+inside a text file located at $(EPOCROOT)/epoc32/tools/variant/variant.cfg
+in each kit.
+
+This is an unnecessary extra file to maintain if you already define all the
+other kit properties in an XML file in the $(EPOCROOT)/epoc32/sbs_config
+folder.
+
+This change allows kit owners to define the .hrh file name in the XML instead
+of using an additional variant.cfg file.
+
+An example of this is shown in $(SBS_HOME)/examples/os_properties.xml
+where the VARIANT_HRH parameter is set as follows,
+
+<set name='VARIANT_HRH' value='$(EPOCINCLUDE)/feature_settings.hrh'/>
+
+
+In the unusual case where you want to build without a .hrh file at all (maybe
+to create an epoc32 tree from scratch) there is a variant "nohrh" which
+simply sets VARIANT_HRH as above to an empty file. Example usage would be,
+
+sbs -b bootstrap/bld.inf -c tools2.nohrh
+
+Note that, in general, actual code will not build properly without a .hrh
+file to configure it.
--- a/sbsv2/raptor/python/plugins/filter_html.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/python/plugins/filter_html.py Mon Oct 18 10:23:52 2010 +0100
@@ -1,19 +1,14 @@
-#
+
# 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 the License "Eclipse Public License v1.0"
# which accompanies this distribution, and is available
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description:
-# Filter class for generating HTML summary pages
-#
+
+'''
+Filter class for generating HTML summary pages
+'''
import os
import re
@@ -21,6 +16,7 @@
import sys
import shutil
import tempfile
+import time
import filter_interface
class HTML(filter_interface.FilterSAX):
@@ -49,6 +45,10 @@
self.regex = self.readregex(str(csv))
break
+ # regexes for important "make" errors
+ self.noruletomake = re.compile("No rule to make target `(.+)', needed by `(.+)'")
+
+ # all our lists are empty
self.elements = []
self.recipe_tag = None
self.error_tag = None
@@ -56,10 +56,15 @@
self.components = {}
self.configurations = {}
+ self.missed_depends = {}
+ self.parse_start = {}
self.totals = Records()
+
+ self.progress_started = 0
+ self.progress_stopped = 0
# create all the directories
- for s in Records.SUBDIRS:
+ for s in Records.CLASSES:
dir = os.path.join(self.dirname, s)
if not os.path.isdir(dir):
try:
@@ -104,9 +109,10 @@
def startElement(self, name, attributes):
"call the start handler for this element if we defined one."
- self.generic_start(name) # tracks element nesting
+ ns_name = name.replace(":", "_")
+ self.generic_start(ns_name) # tracks element nesting
- function_name = "start_" + name
+ function_name = "start_" + ns_name
try:
HTML.__dict__[function_name](self, attributes)
except KeyError:
@@ -124,7 +130,7 @@
def endElement(self, name):
"call the end handler for this element if we defined one."
- function_name = "end_" + name
+ function_name = "end_" + name.replace(":", "_")
try:
HTML.__dict__[function_name](self)
except KeyError:
@@ -137,6 +143,12 @@
self.existencechecks()
self.dumptotals()
try:
+ if self.progress_started > 0:
+ t_from = time.asctime(time.localtime(self.progress_started))
+ t_to = time.asctime(time.localtime(self.progress_stopped))
+ self.index.write("<p>start: " + t_from + "\n")
+ self.index.write("<br>end : " + t_to + "\n")
+
self.index.write("<p><table><tr><th></th>")
for title in Records.TITLES:
@@ -239,6 +251,23 @@
except KeyError:
pass
+ def char_buildlog(self, char):
+ '''process text in the top-level element.
+
+ ideally all text will be inside <recipe> tags, but some will not.
+ "make" errors in particular appear inside the buildlog tag itself.'''
+
+ text = char.strip()
+ if text:
+ match = self.noruletomake.search(text)
+ if match:
+ target = match.group(2)
+ depend = match.group(1)
+ if target in self.missed_depends:
+ self.missed_depends[target].append(depend)
+ else:
+ self.missed_depends[target] = [depend]
+
def end_buildlog(self):
pass
@@ -271,6 +300,46 @@
self.err("status element not inside a recipe element")
except KeyError:
pass
+
+ def start_time(self, attributes):
+ try:
+ if self.recipe_tag:
+ self.recipe_tag.time = float(attributes['elapsed'])
+ else:
+ self.err("status element not inside a recipe element")
+ except KeyError:
+ pass
+
+ def start_progress_start(self, attributes):
+ '''on progress:start note the parse starting timestamp.
+
+ and keep track of the earliest timestamp of all as that shows
+ us when the sbs command was run.'''
+ try:
+ t = float(attributes['time'])
+ if self.progress_started == 0 or t < self.progress_started:
+ self.progress_started = t
+
+ if attributes['task'] == 'parse':
+ self.parse_start[attributes['key']] = t
+ except KeyError:
+ pass
+
+ def start_progress_end(self, attributes):
+ '''on progress:end add the elapsed parse time to the total time.
+
+ also keep track of the latest timestamp of all as that shows
+ us when the sbs command finished.'''
+ try:
+ t = float(attributes['time'])
+ if t > self.progress_stopped:
+ self.progress_stopped = t
+
+ if attributes['task'] == 'parse':
+ elapsed = t - self.parse_start[attributes['key']]
+ self.totals.inc(Records.TIME, elapsed)
+ except KeyError:
+ pass
def start_error(self, attributes):
self.error_tag = TaggedText(attributes)
@@ -367,7 +436,34 @@
self.tmp.write(self.build_tag.strip() + "\n")
except:
return self.err("could not write to temporary file")
-
+
+ def start_clean(self, attributes):
+ try:
+ for attrib in ['bldinf', 'config']:
+ self.tmp.write("|")
+ if attrib in attributes:
+ self.tmp.write(attributes[attrib])
+ self.tmp.write("\n")
+ except:
+ return self.err("could not write to temporary file")
+
+ def start_file(self, attributes):
+ '''opening file tag.
+
+ in the temporary file we need to mark the "clean" targets with a
+ leading ">" character so they can be treated differently from
+ the "releasable" targets'''
+ self.file_tag = ">"
+
+ def char_file(self, char):
+ self.file_tag += char
+
+ def end_file(self):
+ try:
+ self.tmp.write(self.file_tag.strip() + "\n")
+ except:
+ return self.err("could not write to temporary file")
+
# even if we ignore an element we need to mark its coming and going
# so that we know which element any character data belongs to.
@@ -436,7 +532,7 @@
# we don't want to show successes, just count them
return
- linkname = os.path.join(Records.SUBDIRS[type], "overall.html")
+ linkname = os.path.join(Records.CLASSES[type], "overall.html")
filename = os.path.join(self.dirname, linkname)
title = Records.TITLES[type] + " for all configurations"
try:
@@ -448,17 +544,18 @@
except:
return self.err("cannot create file '%s'" % filename)
- self.totals.set(type, 'filename', filename)
- self.totals.set(type, 'linkname', linkname)
+ self.totals.set_filename(type, filename)
+ self.totals.set_linkname(type, linkname)
def appendoverallfile(self, type, taggedtext):
- self.totals.inc(type, 'N') # one more and counting
+ self.totals.inc(type) # one more and counting
+ self.totals.inc(Records.TIME, taggedtext.time)
if type == Records.OK:
# we don't want to show successes, just count them
return
- filename = self.totals.get(type, 'filename')
+ filename = self.totals.get_filename(type)
try:
file = open(filename, "a")
file.write("<p>component: %s " % taggedtext.bldinf)
@@ -473,7 +570,7 @@
# we don't want to show successes, just count them
return
- linkname = os.path.join(Records.SUBDIRS[type], "cfg_" + configuration + ".html")
+ linkname = os.path.join(Records.CLASSES[type], "cfg_" + configuration + ".html")
filename = os.path.join(self.dirname, linkname)
title = Records.TITLES[type] + " for configuration " + configuration
try:
@@ -485,17 +582,18 @@
except:
return self.err("cannot create file '%s'" % filename)
- self.configurations[configuration].set(type, 'filename', filename)
- self.configurations[configuration].set(type, 'linkname', linkname)
+ self.configurations[configuration].set_filename(type, filename)
+ self.configurations[configuration].set_linkname(type, linkname)
def appendconfigurationfile(self, configuration, type, taggedtext):
- self.configurations[configuration].inc(type, 'N') # one more and counting
+ self.configurations[configuration].inc(type) # one more and counting
+ self.configurations[configuration].inc(Records.TIME, taggedtext.time)
if type == Records.OK:
# we don't want to show successes, just count them
return
- filename = self.configurations[configuration].get(type, 'filename')
+ filename = self.configurations[configuration].get_filename(type)
try:
file = open(filename, "a")
file.write("<p>component: %s\n" % taggedtext.bldinf)
@@ -509,7 +607,7 @@
# we don't want to show successes, just count them
return
- linkname = os.path.join(Records.SUBDIRS[type], "bld_" + re.sub("[/:]","_",component) + ".html")
+ linkname = os.path.join(Records.CLASSES[type], "bld_" + re.sub("[/:]","_",component) + ".html")
filename = os.path.join(self.dirname, linkname)
title = Records.TITLES[type] + " for component " + component
try:
@@ -521,17 +619,18 @@
except:
return self.err("cannot create file '%s'" % filename)
- self.components[component].set(type, 'filename', filename)
- self.components[component].set(type, 'linkname', linkname)
+ self.components[component].set_filename(type, filename)
+ self.components[component].set_linkname(type, linkname)
def appendcomponentfile(self, component, type, taggedtext):
- self.components[component].inc(type, 'N') # one more and counting
+ self.components[component].inc(type) # one more and counting
+ self.components[component].inc(Records.TIME, taggedtext.time)
if type == Records.OK:
# we don't want to show successes, just count them
return
- filename = self.components[component].get(type, 'filename')
+ filename = self.components[component].get_filename(type)
try:
file = open(filename, "a")
file.write("<p>config: %s\n" % taggedtext.config)
@@ -556,12 +655,37 @@
missing_tag = TaggedText(attribs)
else:
filename = line.strip()
- if not filename in missed and not os.path.isfile(filename):
- missing_tag.text = filename
- self.record(missing_tag, Records.MISSING)
- missed.add(filename)
+ if filename.startswith(">"):
+ # a clean target, so we don't care if it exists
+ # but we care if it has a missing dependency
+ filename = filename[1:]
+ else:
+ # a releasable target so it must exist
+ if not filename in missed and not os.path.isfile(filename):
+ missing_tag.text = filename
+ self.record(missing_tag, Records.MISSING)
+ missed.add(filename)
+
+ if filename in self.missed_depends:
+ missing_tag.text = filename + \
+ "\n\nrequired the following files which could not be found,\n\n"
+ for dep in self.missed_depends[filename]:
+ missing_tag.text += dep + "\n"
+ self.record(missing_tag, Records.ERROR)
+ del self.missed_depends[filename]
self.tmp.close() # this also deletes the temporary file
+
+ # any missed dependencies left over are not attributable to any
+ # specific component but should still be reported
+ missing_tag = TaggedText({})
+ for filename in self.missed_depends:
+ missing_tag.text = filename + \
+ "\n\nrequired the following files which could not be found,\n\n"
+ for dep in self.missed_depends[filename]:
+ missing_tag.text += dep + "\n"
+ self.record(missing_tag, Records.ERROR)
+
except Exception,e:
return self.err("could not close temporary file " + str(e))
@@ -593,8 +717,10 @@
try:
type = None
- if row[0] == "CRITICAL" or row[0] == "ERROR":
+ if row[0] == "ERROR":
type = Records.ERROR
+ elif row[0] == "CRITICAL":
+ type = Records.CRITICAL
elif row[0] == "WARNING":
type = Records.WARNING
elif row[0] == "REMARK":
@@ -615,52 +741,65 @@
return []
return regexlist
+
+class CountItem(object):
+ def __init__(self):
+ self.N = 0
+ self.filename = None
+ self.linkname = None
+
+ def num_str(self):
+ return str(self.N)
+class TimeItem(CountItem):
+ def num_str(self):
+ return time.strftime("%H:%M:%S", time.gmtime(self.N + 0.5))
+
class Records(object):
"a group of related records e.g. errors, warnings and remarks."
# the different types of record we want to group together
- OK = 0
- ERROR = 1
- WARNING = 2
- REMARK = 3
- MISSING = 4
+ TIME = 0
+ OK = 1
+ ERROR = 2
+ CRITICAL = 3
+ WARNING = 4
+ REMARK = 5
+ MISSING = 6
- SUBDIRS = [ "ok", "error", "warning", "remark", "missing" ]
- TITLES = [ "OK", "Errors", "Warnings", "Remarks", "Missing files" ]
+ CLASSES = [ "time", "ok", "error", "critical", "warning", "remark", "missing" ]
+ TITLES = [ "CPU Time", "OK", "Errors", "Criticals", "Warnings", "Remarks", "Missing files" ]
def __init__(self):
- self.data = [ {'N':0}, {'N':0}, {'N':0}, {'N':0}, {'N':0} ]
-
- def get(self, index, item):
- try:
- return self.data[index][item]
- except KeyError:
- return None
+ self.data = [ TimeItem(), CountItem(), CountItem(), CountItem(), CountItem(), CountItem(), CountItem() ]
+
+ def get_filename(self, index):
+ return self.data[index].filename
- def inc(self, index, item):
- self.data[index][item] += 1
-
+ def inc(self, index, increment=1):
+ self.data[index].N += increment
+
def isempty(self, index):
- return (self.data[index]['N'] == 0)
+ return (self.data[index].N == 0)
- def set(self, index, item, value):
- self.data[index][item] = value
+ def set_filename(self, index, value):
+ self.data[index].filename = value
+ def set_linkname(self, index, value):
+ self.data[index].linkname = value
+
def tablerow(self, name):
row = '<tr><td class="name">%s</td>' % name
-
+
for i,datum in enumerate(self.data):
- number = datum['N']
- if number == 0:
+ if datum.N == 0:
row += '<td class="zero">0</td>'
else:
- row += '<td class="' + Records.SUBDIRS[i] + '">'
- try:
- link = datum['linkname']
- row += '<a href="%s">%d</a></td>' % (link,number)
- except KeyError:
- row += '%d</td>' % number
+ row += '<td class="' + Records.CLASSES[i] + '">'
+ if datum.linkname:
+ row += '<a href="%s">%s</a></td>' % (datum.linkname,datum.num_str())
+ else:
+ row += '%s</td>' % datum.num_str()
row += "</tr>"
return row
@@ -668,12 +807,11 @@
def textdump(self):
text = ""
for i,datum in enumerate(self.data):
- number = datum['N']
- if number == 0:
+ if datum.N == 0:
style = "zero"
else:
- style = Records.SUBDIRS[i]
- text += str(i) + ',' + style + "," + str(number) + "\n"
+ style = Records.CLASSES[i]
+ text += str(i) + ',' + style + "," + str(datum.N) + "\n"
return text
class TaggedText(object):
@@ -687,5 +825,6 @@
self.__dict__[attrib] = value
self.text = ""
+ self.time = 0.0
# the end
\ No newline at end of file
--- a/sbsv2/raptor/python/raptor_cli.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/python/raptor_cli.py Mon Oct 18 10:23:52 2010 +0100
@@ -22,9 +22,7 @@
import raptor
from optparse import OptionParser # for parsing command line parameters
-
-fullCommandOption = "--command"
-miniCommandOption = "--co" # update this if another "co" option is added
+from raptor_utilities import expand_command_options
# raptor_cli module attributes
@@ -179,51 +177,6 @@
"Process command line arguments for a Raptor object"
return DoRaptor(Raptor,args)
-def ReadCommandFile(filename, used):
- if filename in used:
- raise IOError("command file '%s' refers to itself" % filename)
-
- args = []
- try:
- file = open(filename, "r")
- for line in file.readlines():
- args.extend(line.split())
- file.close()
- except:
- raise IOError("couldn't read command file '%s'" % filename)
-
- # expand any command files in the options we just read.
- # making sure we don't get stuck in a loop.
- usedPlusThis = used[:]
- usedPlusThis.append(filename)
- return ExpandCommandOptions(args, usedPlusThis)
-
-def ExpandCommandOptions(args, files = []):
- """recursively expand --command options."""
- expanded = []
- previousWasOpt = False
-
- for a in args:
- if previousWasOpt: # then this one is the filename
- expanded.extend(ReadCommandFile(a, files))
- previousWasOpt = False
- continue
-
- if a.startswith(miniCommandOption):
- if "=" in a: # then this is opt=filename
- opt = a.split("=")
- if fullCommandOption.startswith(opt[0]):
- expanded.extend(ReadCommandFile(opt[1], files))
- continue
- else: # the next one is the filename
- if fullCommandOption.startswith(a):
- previousWasOpt = True
- continue
-
- expanded.append(a) # an ordinary arg, nothing to do with command files
-
- return expanded
-
def DoRaptor(Raptor, args):
"Process raptor arguments"
#
@@ -236,7 +189,7 @@
non_ascii_error = "Non-ASCII character in argument or command file"
try:
- expanded_args = ExpandCommandOptions(args)
+ expanded_args = expand_command_options(args)
for arg in expanded_args:
for c in arg:
if ord(c) > 127:
--- a/sbsv2/raptor/python/raptor_meta.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/python/raptor_meta.py Mon Oct 18 10:23:52 2010 +0100
@@ -2599,11 +2599,14 @@
self.__Raptor.Debug("Automatic OS detection disabled.")
# is this a feature variant config or an ordinary variant
- fv = evaluator.Get("FEATUREVARIANTNAME")
- if fv:
- variantHdr = evaluator.CheckedGet("VARIANT_HRH")
+ fvn = evaluator.Get("FEATUREVARIANTNAME")
+ detail['ISFEATUREVARIANT'] = (fvn != None and fvn != '')
+
+ # get the .hrh name from VARIANT_HRH if it is set, otherwise read
+ # the name from the contents of the file named in VARIANT_CFG
+ variantHdr = evaluator.Get("VARIANT_HRH")
+ if variantHdr:
variantHRH = generic_path.Path(variantHdr)
- detail['ISFEATUREVARIANT'] = True
else:
variantCfg = evaluator.CheckedGet("VARIANT_CFG")
variantCfg = generic_path.Path(variantCfg)
@@ -2616,12 +2619,11 @@
self.__Raptor.Warn("missing flag ENABLE_ABIV2_MODE in %s file. ABIV1 builds are not supported.",
str(variantCfg))
variantHRH = variantCfgs[variantCfg]
- detail['ISFEATUREVARIANT'] = False
detail['VARIANT_HRH'] = variantHRH
self.__Raptor.Info("'%s' uses variant hrh file '%s'", buildConfig.name, variantHRH)
detail['SYSTEMINCLUDE'] = evaluator.CheckedGet("SYSTEMINCLUDE")
-
+
detail['TARGET_TYPES'] = evaluator.CheckedGet("TARGET_TYPES")
# find all the interface names we need
@@ -2996,8 +2998,7 @@
destDir = destination.Dir()
if not destDir.isDir():
os.makedirs(str(destDir))
- # preserve permissions
- shutil.copy(source_str, dest_str)
+ shutil.copyfile(source_str, dest_str)
return exportwhatlog
sourceMTime = 0
@@ -3016,14 +3017,12 @@
self.__Raptor.Error(message, bldinf=bldInfFile)
if destMTime == 0 or destMTime < sourceMTime:
- # remove old version
- # - not having ownership prevents chmod
- # - avoid clobbering the original if it is a hard link
if os.path.exists(dest_str):
- os.unlink(dest_str)
- # preserve permissions
- shutil.copy(source_str, dest_str)
-
+ os.chmod(dest_str,stat.S_IREAD | stat.S_IWRITE)
+ shutil.copyfile(source_str, dest_str)
+
+ # Ensure that the destination file remains executable if the source was also:
+ os.chmod(dest_str,sourceStat[stat.ST_MODE] | stat.S_IREAD | stat.S_IWRITE | stat.S_IWGRP )
self.__Raptor.Info("Copied %s to %s", source_str, dest_str)
else:
self.__Raptor.Info("Up-to-date: %s", dest_str)
--- a/sbsv2/raptor/python/raptor_utilities.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/python/raptor_utilities.py Mon Oct 18 10:23:52 2010 +0100
@@ -239,3 +239,56 @@
raise IOError(message)
return
+
+
+
+## Commandline processing utilities ##
+
+fullCommandOption = "--command"
+miniCommandOption = "--co" # update this if another "co" option is added
+
+def read_command_file(filename, used):
+ """Read commandline options in from a file"""
+ if filename in used:
+ raise IOError("command file '%s' refers to itself" % filename)
+
+ args = []
+ try:
+ file = open(filename, "r")
+ for line in file.readlines():
+ args.extend(line.split())
+ file.close()
+ except:
+ raise IOError("couldn't read command file '%s'" % filename)
+
+ # expand any command files in the options we just read.
+ # making sure we don't get stuck in a loop.
+ usedPlusThis = used[:]
+ usedPlusThis.append(filename)
+ return expand_command_options(args, usedPlusThis)
+
+def expand_command_options(args, files = []):
+ """process commandline options to recursively expand command files (--command options) into a full list of options."""
+ expanded = []
+ previousWasOpt = False
+
+ for a in args:
+ if previousWasOpt: # then this one is the filename
+ expanded.extend(read_command_file(a, files))
+ previousWasOpt = False
+ continue
+
+ if a.startswith(miniCommandOption):
+ if "=" in a: # then this is opt=filename
+ opt = a.split("=")
+ if fullCommandOption.startswith(opt[0]):
+ expanded.extend(read_command_file(opt[1], files))
+ continue
+ else: # the next one is the filename
+ if fullCommandOption.startswith(a):
+ previousWasOpt = True
+ continue
+
+ expanded.append(a) # an ordinary arg, nothing to do with command files
+
+ return expanded
--- a/sbsv2/raptor/python/raptor_version.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/python/raptor_version.py Mon Oct 18 10:23:52 2010 +0100
@@ -19,7 +19,7 @@
#
# both of these are done automatically by the installer builder.
-version=(2,15,1,"ISODATE","symbian build system","CHANGESET")
+version=(2,15,2,"ISODATE","symbian build system","CHANGESET")
def numericversion():
"""Raptor version string"""
--- a/sbsv2/raptor/style/filter_html.css Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/style/filter_html.css Mon Oct 18 10:23:52 2010 +0100
@@ -25,8 +25,10 @@
{
text-align: left;
}
+td.time { background: #80ff80; }
td.ok { background: #80ff80; }
td.error { background: #ff8080; }
+td.critical { background: #ffc080; }
td.warning { background: #ffff80; }
td.remark { background: #8080ff; }
td.missing { background: #c0c0c0; }
--- a/sbsv2/raptor/test/common/raptor_tests.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/common/raptor_tests.py Mon Oct 18 10:23:52 2010 +0100
@@ -323,7 +323,7 @@
return "-f " + self.logfile();
def logfile(self):
- return logDir + "/" + self.name + ".log"
+ return logDir + "/" + self.name.replace(" ","_") + ".log"
def makefileOption(self):
return "-m " + self.makefile();
@@ -367,6 +367,7 @@
print "\nID:", self.id
print "TEST:", self.name
+ print "LOGFILE:", self.logfile()
return self.clean()
--- a/sbsv2/raptor/test/smoke_suite/capability_arm.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/capability_arm.py Mon Oct 18 10:23:52 2010 +0100
@@ -16,13 +16,15 @@
from raptor_tests import SmokeTest
import sys
+import os
def run():
t = SmokeTest()
t.usebash = True
-
- if sys.platform.startswith("win"):
+ if "SBS_ELF2E32" in os.environ:
+ elf2e32 = os.environ["SBS_ELF2E32"]
+ elif sys.platform.startswith("win"):
elf2e32 = "$(EPOCROOT)/epoc32/tools/elf2e32.exe"
else:
elf2e32 = "$(EPOCROOT)/epoc32/tools/elf2e32"
--- a/sbsv2/raptor/test/smoke_suite/export.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/export.py Mon Oct 18 10:23:52 2010 +0100
@@ -14,7 +14,7 @@
# Description:
#
-from raptor_tests import SmokeTest, AntiTargetSmokeTest
+from raptor_tests import AntiTargetSmokeTest
import os
def run():
@@ -23,9 +23,9 @@
# reallyclean_simple_export tests to use so that we can put the
# username into the output filenames - which helps a lot when
# several people run tests on the same computer (e.g. linux machines)
- bld = open('smoke_suite/test_resources/simple_export/expbld.inf', 'w')
+ bld_inf = open('smoke_suite/test_resources/simple_export/expbld.inf', 'w')
user = os.environ['USER']
- bld.write("""
+ bld_inf.write("""
PRJ_PLATFORMS
ARMV5 WINSCW
@@ -48,20 +48,16 @@
"file with a space.doc" "exportedfilewithspacesremoved.doc"
"file with a space.doc" "exported file with a space.doc"
-simple_exp1.h /tmp/%s/ //
-simple_exp2.h \\tmp\\%s/ //
-simple_exp3.h /tmp/%s/simple_exp3.h
+simple_exp1.h /tmp/{0}/ //
+simple_exp2.h \\tmp\\{0}/ //
+simple_exp3.h /tmp/{0}/simple_exp3.h
simple_exp4.h //
+read_only.h was_read_only.h //
-""" % (user, user, user))
- bld.close()
-
-
- t = SmokeTest()
- t.id = "0023a"
- t.name = "export"
- t.command = "sbs -b smoke_suite/test_resources/simple_export/expbld.inf export"
- t.targets = [
+""".format(user))
+ bld_inf.close()
+
+ exported_files = [
"$(EPOCROOT)/epoc32/include/exported_1.h",
"$(EPOCROOT)/epoc32/include/exported_2.h",
"$(EPOCROOT)/epoc32/include/exported_3.h",
@@ -71,79 +67,51 @@
"/tmp/$(USER)/simple_exp2.h",
"/tmp/$(USER)/simple_exp3.h",
"$(EPOCROOT)/epoc32/include/executable_file",
- "$(EPOCROOT)/epoc32/include/simple_exp4.h"
+ "$(EPOCROOT)/epoc32/include/simple_exp4.h",
+ "$(EPOCROOT)/epoc32/include/was_read_only.h",
]
+
+ t = AntiTargetSmokeTest()
+
+ # Check basic export success
+ t.name = "export_basic"
+ t.command = "sbs -b smoke_suite/test_resources/simple_export/expbld.inf export"
+ t.targets = exported_files
+ t.antitargets = []
t.run()
-
- t = SmokeTest()
- t.id = "0023a1"
- t.name = "export"
+ # Confirm executable permissions are retained on Linux
+ t.name = "export_executable_permissions"
t.usebash = True
t.command = "ls -l ${EPOCROOT}/epoc32/include/executable_file"
t.mustmatch = [ "^.rwxrwxr.x[\.\+]? .*executable_file.*$" ]
- t.targets = []
+ t.targets = [] # prevent auto clean-up up of target files from previous test
+ t.antitargets = []
t.run("linux")
- t.usebash = False
-
- # Testing if clean deletes any exports which it is not supposed to
- t.id = "0023b"
- t.name = "export_clean"
+ # Check clean does not delete exports
+ t.name = "export_clean"
t.command = "sbs -b smoke_suite/test_resources/simple_export/expbld.inf clean"
t.mustmatch = []
- t.targets = [
- "$(EPOCROOT)/epoc32/include/exported_1.h",
- "$(EPOCROOT)/epoc32/include/exported_2.h",
- "$(EPOCROOT)/epoc32/include/exported_3.h",
- "$(EPOCROOT)/epoc32/include/executable_file",
- "$(EPOCROOT)/epoc32/include/exportedfilewithspacesremoved.doc",
- "$(EPOCROOT)/epoc32/include/exported file with a space.doc",
- "/tmp/$(USER)/simple_exp1.h",
- "/tmp/$(USER)/simple_exp2.h",
- "/tmp/$(USER)/simple_exp3.h"
- ]
+ t.targets = exported_files
+ t.antitargets = []
t.run()
-
- t = AntiTargetSmokeTest()
- t.id = "0023c"
+ # Confirm reallyclean deletes all exports, including those that were read-only
+ # as source (and so should now be removable at their destination)
t.name = "export_reallyclean"
t.command = "sbs -b smoke_suite/test_resources/simple_export/expbld.inf reallyclean"
- t.antitargets = [
- '$(EPOCROOT)/epoc32/include/exported_1.h',
- '$(EPOCROOT)/epoc32/include/exported_2.h',
- '$(EPOCROOT)/epoc32/include/exported_3.h',
- "$(EPOCROOT)/epoc32/include/executable_file",
- '$(EPOCROOT)/epoc32/include/exportedfilewithspacesremoved.doc',
- '$(EPOCROOT)/epoc32/include/exported file with a space.doc',
- '/tmp/$(USER)/simple_exp1.h',
- '/tmp/$(USER)/simple_exp2.h',
- '/tmp/$(USER)/simple_exp3.h',
- '$(EPOCROOT)/epoc32/include/simple_exp4.h'
- ]
+ t.targets = []
+ t.antitargets = exported_files
t.run()
- # Check that the --noexport feature really does prevent exports from happening
- t = AntiTargetSmokeTest()
- t.id = "0023d"
+ # Check --noexport suppresses exports
t.name = "export_noexport"
t.command = "sbs -b smoke_suite/test_resources/simple_export/expbld.inf --noexport -n"
- t.antitargets = [
- '$(EPOCROOT)/epoc32/include/exported_1.h',
- '$(EPOCROOT)/epoc32/include/exported_2.h',
- '$(EPOCROOT)/epoc32/include/exported_3.h',
- "$(EPOCROOT)/epoc32/include/executable_file",
- '$(EPOCROOT)/epoc32/include/exportedfilewithspacesremoved.doc',
- '$(EPOCROOT)/epoc32/include/exported file with a space.doc',
- '/tmp/$(USER)/simple_exp1.h',
- '/tmp/$(USER)/simple_exp2.h',
- '/tmp/$(USER)/simple_exp3.h',
- '$(EPOCROOT)/epoc32/include/simple_exp4.h'
- ]
+ t.targets = []
+ t.antitargets = exported_files
t.run()
-
- t.id = "23"
+
t.name = "export"
t.print_result()
return t
--- a/sbsv2/raptor/test/smoke_suite/featurevariants.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/featurevariants.py Mon Oct 18 10:23:52 2010 +0100
@@ -1,4 +1,4 @@
-#
+
# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
@@ -15,11 +15,20 @@
#
from raptor_tests import AntiTargetSmokeTest, ReplaceEnvs
+from raptor_meta import BldInfFile
import os
def run():
t = AntiTargetSmokeTest()
t.usebash = True
+
+ # create some empty source files just to test createvmaps command file handling:
+ test_cpp_files = []
+ for i in xrange(0,16):
+ tf = "smoke_suite/test_resources/bv/variant1/test_createvmap{0:02}.cpp".format(i)
+ f = open(tf,"w+")
+ f.close()
+ test_cpp_files.append(tf)
preBuiltTargets = [
"$(EPOCROOT)/epoc32/release/armv5/udeb/dummy.lib",
@@ -300,26 +309,46 @@
"dummy_var3_exe/dummy_var3_dummy.rsc.d"
]
- sbscommand = "sbs -b smoke_suite/test_resources/bv/bld.inf -c armv5 " + \
- "-c armv5.test_bv_1 -c armv5.test_bv_2 -c armv5.test_bv_3 -f- " + \
- "--configpath=test/smoke_suite/test_resources/bv/config/variants"
+ bldinf = 'smoke_suite/test_resources/bv/bld.inf'
+ sbscommand = "sbs -b {0} -c armv5 -c armv5.test_bv_1 -c armv5.test_bv_2 -c armv5.test_bv_3 -f- --configpath=test/smoke_suite/test_resources/bv/config/variants".format(bldinf)
t.id = "56a"
t.description = """Build variant and invariant components.
In this default mode of operation, all components build for the non-product armv5 config whereas
only variant components build for the armv5.* bv configs."""
t.name = "featurevariant_build"
- t.command = sbscommand
+
+ t.command = "{0} && cat $(EPOCROOT)/epoc32/build/{1}/{2}".format(sbscommand, BldInfFile.outputPathFragment(bldinf), "createstaticdll_variant1_dll/armv5.three/udeb/createstaticdll_variant1.vmap.cmdfile")
t.targets = preBuiltTargets + invariantTargets + variantTargetsGeneric + variantTargetsDefaultTree + variantTargetsProductTrees
- t.addbuildtargets('smoke_suite/test_resources/bv/bld.inf',
+ t.addbuildtargets(bldinf,
invariantBuildTargets + variantBuildTargetsGeneric + variantBuildTargetsDefaultTree + variantBuildTargetsProductTrees
)
+
# Test that static libs are linked from the invariant place.
t.mustmatch = [
"armlink.*epoc32/release/armv5/urel/bv_static_lib.lib",
- "armlink.*epoc32/release/armv5/udeb/bv_static_lib.lib"
+ "armlink.*epoc32/release/armv5/udeb/bv_static_lib.lib",
+ "\s*-s.*variant1/CreateStaticDLL_variant1.cpp",
+ "\s*-s.*variant1/test_createvmap01.cpp",
+ "\s*-s.*variant1/test_createvmap02.cpp",
+ "\s*-s.*variant1/test_createvmap03.cpp",
+ "\s*-s.*variant1/test_createvmap04.cpp",
+ "\s*-s.*variant1/test_createvmap05.cpp",
+ "\s*-s.*variant1/test_createvmap06.cpp",
+ "\s*-s.*variant1/test_createvmap07.cpp",
+ "\s*-s.*variant1/test_createvmap08.cpp",
+ "\s*-s.*variant1/test_createvmap09.cpp",
+ "\s*-s.*variant1/test_createvmap10.cpp",
+ "\s*-s.*variant1/test_createvmap11.cpp",
+ "\s*-s.*variant1/test_createvmap12.cpp",
+ "\s*-s.*variant1/test_createvmap13.cpp",
+ "\s*-s.*variant1/test_createvmap14.cpp",
+ "\s*-s.*variant1/test_createvmap15.cpp",
+ "\s*-s.*variant1/CreateStaticDLL_variant1.mmp"
]
t.run()
+
+
t.id = "56b"
t.description = """Build variant and invariant components using an os_properties.xml that sets FEATUREVARIANTSAFE=1.
@@ -342,6 +371,7 @@
]
t.run()
+
# tests for the createvmap script
createvmap = "python $(SBS_HOME)/bin/createvmap.py"
@@ -413,6 +443,11 @@
t.targets = [vmapfile]
t.mustmatch = ["A_1=defined", "B_1000=undefined"]
t.run()
+
+
+ # clean up test cpp files from the first test (do it noow after they are no longer needed)
+ for tf in test_cpp_files:
+ os.unlink(tf)
# print the overall result
--- a/sbsv2/raptor/test/smoke_suite/romfile.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/romfile.py Mon Oct 18 10:23:52 2010 +0100
@@ -16,24 +16,27 @@
from raptor_tests import SmokeTest
-import os
def run():
t = SmokeTest()
t.description = """
Tests the creation and content of an .iby romfile for the armv5.test
configuration. Also tests for creation of relevant test batch files.
- """
- t.id = "55a"
- t.name = "romfile_general"
+ """
t.usebash = True
- t.command = "sbs -b $(EPOCROOT)/src/ongoing/group/romfile/other_name.inf " \
- + "-c armv5.test ROMFILE -f - " \
- + "&& cat $(EPOCROOT)/epoc32/rom/src/ongoing/group/romfile/armv5test.iby"
-
# Don't allow -m or -f to be appended
t.logfileOption = lambda :""
t.makefileOption = lambda :""
+
+ t.id = "55a"
+ # Check content of iby file is correct
+ # Check batch files are generated
+ t.name = "romfile_general"
+
+ t.command = "sbs -b $(EPOCROOT)/src/ongoing/group/romfile/other_name.inf " \
+ + "-c armv5.test ROMFILE -m ${SBSMAKEFILE} -f ${SBSLOGFILE} " \
+ + "&& cat $(EPOCROOT)/epoc32/rom/src/ongoing/group/romfile/armv5test.iby"
+
t.targets = [
"$(EPOCROOT)/epoc32/rom/src/ongoing/group/romfile/armv5test.iby",
"$(EPOCROOT)/epoc32/data/z/test/src/armv5.auto.bat",
@@ -41,13 +44,7 @@
]
# Check the content of the generated .iby file.
-
t.mustmatch = [
- # Check whatlog output includes batch files and .iby file
- r".*/epoc32/rom/src/ongoing/group/romfile/armv5test.iby</build>.*",
- r".*/epoc32/data/z/test/src/armv5.auto.bat</build>.*",
- r".*/epoc32/data/z/test/src/armv5.manual.bat</build>.*",
-
# The comment that is put at the start of the file.
r".*// epoc32/rom/src/ongoing/group/romfile/armv5test\.iby\n.*",
@@ -76,21 +73,27 @@
# without flagging C++ style comments.
r"\w//+\w"
]
-
- t.run("windows")
+ t.warnings = 0 if t.onWindows else 2
+ t.run()
+
- if t.result == SmokeTest.SKIP:
- t.command = "sbs -b $(EPOCROOT)/src/ongoing/group/romfile/other_name.inf" \
- + " -c armv5.test ROMFILE -f -" \
- + " && cat $(EPOCROOT)/epoc32/rom/src/ongoing/group/romfile/armv5test.iby"
-
- # These two warnings are because gnumakefiles are not supported on
- # Linux:
- t.warnings = 2
- t.run("linux")
+ t.id = "55b"
+ # t.targets and t.warnings are the same as above and thus omitted
+ t.name = "romfile_whatlog"
+ t.command = "sbs -b $(EPOCROOT)/src/ongoing/group/romfile/other_name.inf " \
+ + "-c armv5.test ROMFILE -f -"
+
+ t.mustmatch = [
+ # Check whatlog output includes batch files and .iby file
+ r".*/epoc32/rom/src/ongoing/group/romfile/armv5test.iby</build>.*",
+ r".*/epoc32/data/z/test/src/armv5.auto.bat</build>.*",
+ r".*/epoc32/data/z/test/src/armv5.manual.bat</build>.*"
+ ]
+ t.mustnotmatch = []
+ t.run()
- t.id = "55b"
+ t.id = "55c"
t.name = "romfile_mmp_include_twice"
t.command = "sbs -b $(EPOCROOT)/src/e32test/group/bld.inf " \
+ "-b $(EPOCROOT)/src/falcon/test/bld.inf " \
@@ -115,6 +118,7 @@
t.warnings = 0
t.run()
+
t.id = "55"
t.name = "romfile"
t.print_result()
--- a/sbsv2/raptor/test/smoke_suite/stringtable_zip_whatlog.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/stringtable_zip_whatlog.py Mon Oct 18 10:23:52 2010 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
@@ -43,6 +43,7 @@
"$(EPOCROOT)/epoc32/testunzip/archive/archivefile3.txt",
"$(EPOCROOT)/epoc32/testunzip/archive/archivefile4.txt",
"$(EPOCROOT)/epoc32/testunzip/archive/archivefilelinuxbin",
+ "$(EPOCROOT)/epoc32/testunzip/archive/archivefilereadonly.txt",
"$(EPOCROOT)/epoc32/build/" + markerfile
]
t.addbuildtargets('smoke_suite/test_resources/simple_stringtable/bld.inf', [
@@ -60,6 +61,7 @@
"<member>$(EPOCROOT)/epoc32/testunzip/archive/archivefile3.txt</member>",
"<member>$(EPOCROOT)/epoc32/testunzip/archive/archivefile4.txt</member>",
"<member>$(EPOCROOT)/epoc32/testunzip/archive/archivefilelinuxbin</member>",
+ "<member>$(EPOCROOT)/epoc32/testunzip/archive/archivefilereadonly.txt</member>",
"<zipmarker>$(EPOCROOT)/epoc32/build/" + markerfile + "</zipmarker>"
]
t.run()
--- a/sbsv2/raptor/test/smoke_suite/test_resources/bv/variant1/CreateStaticDLL_variant1.mmp Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/bv/variant1/CreateStaticDLL_variant1.mmp Mon Oct 18 10:23:52 2010 +0100
@@ -29,6 +29,23 @@
SOURCEPATH .
SOURCE CreateStaticDLL_variant1.cpp
+// > 10 files to test the createvmap handling of command files
+SOURCE test_createvmap01.cpp
+SOURCE test_createvmap02.cpp
+SOURCE test_createvmap03.cpp
+SOURCE test_createvmap04.cpp
+SOURCE test_createvmap05.cpp
+SOURCE test_createvmap06.cpp
+SOURCE test_createvmap07.cpp
+SOURCE test_createvmap08.cpp
+SOURCE test_createvmap09.cpp
+SOURCE test_createvmap10.cpp
+SOURCE test_createvmap11.cpp
+SOURCE test_createvmap12.cpp
+SOURCE test_createvmap13.cpp
+SOURCE test_createvmap14.cpp
+SOURCE test_createvmap15.cpp
+
USERINCLUDE .
APP_LAYER_SYSTEMINCLUDE_SYMBIAN
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/simple_export/read_only.h Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,17 @@
+/*
+* 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 the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
Binary file sbsv2/raptor/test/smoke_suite/test_resources/simple_zip_export/archive.zip has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/smoke_suite/test_resources/tools2/bootstrap.inf Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,22 @@
+/*
+* 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 the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+header_abc.h bootstrap_header_abc.h
--- a/sbsv2/raptor/test/smoke_suite/tools2.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/tools2.py Mon Oct 18 10:23:52 2010 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
@@ -18,11 +18,11 @@
def run():
t = SmokeTest()
- t.id = "51"
- t.name = "tools2"
+
+ t.id = "51a"
+ t.name = "tools2_exe_lib"
t.command = "sbs -b smoke_suite/test_resources/tools2/bld.inf -c tools2"
-
t.targets = [
"$(EPOCROOT)/epoc32/release/tools2/deb/libtool_lib1.a",
"$(EPOCROOT)/epoc32/release/tools2/deb/libtool_lib2.a",
@@ -74,5 +74,19 @@
"tool_exe_exe/tool_exe_exe/tools2/deb/$(HOSTPLATFORM_DIR)/tool_exe_a.o"
])
t.run("linux") # tools2 output is platform dependent
-
+
+ t.id = "51b"
+ t.name = "tools2_nohrh"
+ t.usebash = True
+ t.command = "sbs -b smoke_suite/test_resources/tools2/bootstrap.inf -c tools2.nohrh -f -"
+ t.targets = ["$(EPOCROOT)/epoc32/include/bootstrap_header_abc.h"]
+ t.mustmatch_singleline = ["empty\.hrh"]
+ t.mustnotmatch_singleline = ["Symbian_OS.hrh",
+ "symbian_os.hrh",
+ "feature_settings.hrh"]
+ t.run()
+
+ t.id = "51"
+ t.name = "tools2"
+ t.print_result()
return t
--- a/sbsv2/raptor/test/smoke_suite/zip_export_plus_clean.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/zip_export_plus_clean.py Mon Oct 18 10:23:52 2010 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
@@ -14,7 +14,7 @@
# Description:
#
-from raptor_tests import SmokeTest, AntiTargetSmokeTest, ReplaceEnvs
+from raptor_tests import AntiTargetSmokeTest, ReplaceEnvs
from raptor_meta import MetaReader
from raptor_utilities import sanitise
import re
@@ -23,9 +23,9 @@
premarkerfile = sanitise(ReplaceEnvs("$(SBS_HOME)_test_smoke_suite_test_resources_simple_zip_export_archive.zip$(EPOCROOT)_epoc32_testunzip"))
markerfile = MetaReader.unzippedPathFragment(premarkerfile) + ".unzipped"
- t = SmokeTest()
-
- t.id = "0024a"
+ t = AntiTargetSmokeTest()
+
+ # Check basic export success
t.name = "zip_export"
t.command = "sbs -b smoke_suite/test_resources/simple_zip_export/bld.inf"
t.targets = [
@@ -34,33 +34,35 @@
"$(EPOCROOT)/epoc32/testunzip/archive/archivefile3.txt",
"$(EPOCROOT)/epoc32/testunzip/archive/archivefile4.txt",
"$(EPOCROOT)/epoc32/testunzip/archive/archivefilelinuxbin",
+ "$(EPOCROOT)/epoc32/testunzip/archive/archivefilereadonly.txt",
"$(EPOCROOT)/epoc32/build/" + markerfile
]
t.run()
-
- t.id = "0024aa"
+
+ # Confirm executable permissions are retained on Linux
t.name = "zip_export_execute_permissions"
t.usebash = True
- t.targets = []
+ t.targets = [] # prevent auto clean-up up of target files from previous test
t.command = "ls -l $(EPOCROOT)/epoc32/testunzip/archive/archivefilelinuxbin"
t.mustmatch = ["-[rw-]{2}x[rw-]{2}x[rw-]{2}x"]
t.run("linux")
-
- t = AntiTargetSmokeTest()
- t.id = "0024b"
+
+ # Confirm reallyclean deletes all exports, including those that were read-only
+ # as source (and so should now be removable at their destination)
t.name = "zip_export_reallyclean"
- t.command = "sbs -b smoke_suite/test_resources/simple_zip_export/bld.inf REALLYCLEAN"
+ t.command = "sbs -b smoke_suite/test_resources/simple_zip_export/bld.inf reallyclean"
+ t.mustmatch = []
t.antitargets = [
"$(EPOCROOT)/epoc32/testunzip/archive/archivefile1.txt",
"$(EPOCROOT)/epoc32/testunzip/archive/archivefile2.txt",
"$(EPOCROOT)/epoc32/testunzip/archive/archivefile3.txt",
"$(EPOCROOT)/epoc32/testunzip/archive/archivefile4.txt",
"$(EPOCROOT)/epoc32/testunzip/archive/archivefilelinuxbin",
+ "$(EPOCROOT)/epoc32/testunzip/archive/archivefilereadonly.txt",
"$(EPOCROOT)/epoc32/build/" + markerfile
]
t.run()
- t.id = "24"
t.name = "zip_export_plus_clean"
t.print_result()
return t
--- a/sbsv2/raptor/test/smoke_suite/zip_export_what.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/smoke_suite/zip_export_what.py Mon Oct 18 10:23:52 2010 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
@@ -26,14 +26,14 @@
t = CheckWhatSmokeTest()
t.id = "25"
t.name = "zip_export_what"
- t.command = "sbs --what " + \
- "-b smoke_suite/test_resources/simple_zip_export/bld.inf"
+ t.command = "sbs --what -b smoke_suite/test_resources/simple_zip_export/bld.inf"
t.stdout = [
'$(EPOCROOT)/epoc32/testunzip/archive/archivefile1.txt',
'$(EPOCROOT)/epoc32/testunzip/archive/archivefile2.txt',
'$(EPOCROOT)/epoc32/testunzip/archive/archivefile3.txt',
'$(EPOCROOT)/epoc32/testunzip/archive/archivefile4.txt',
- "$(EPOCROOT)/epoc32/testunzip/archive/archivefilelinuxbin"
+ "$(EPOCROOT)/epoc32/testunzip/archive/archivefilelinuxbin",
+ "$(EPOCROOT)/epoc32/testunzip/archive/archivefilereadonly.txt"
]
t.targets = [
@@ -42,6 +42,7 @@
'$(EPOCROOT)/epoc32/testunzip/archive/archivefile3.txt',
'$(EPOCROOT)/epoc32/testunzip/archive/archivefile4.txt',
"$(EPOCROOT)/epoc32/testunzip/archive/archivefilelinuxbin",
+ "$(EPOCROOT)/epoc32/testunzip/archive/archivefilereadonly.txt",
"$(EPOCROOT)/epoc32/build/" + markerfile
]
t.run()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/unit_suite/data/html_filter/config/logfile_regex.csv Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,65 @@
+priority,regex,description
+CRITICAL,.*Error:.*mingw_make\.exe.*,
+ERROR,.*\: cannot create regular file.*,
+ERROR,.*\): Missing file:.*,
+ERROR,(?:(?:\s*\d+\)\s*)|(?:\s*\*\*\*\s*))ERROR:.*,
+ERROR,.*is not recognized as an internal or external command.*,
+ERROR,MISSING:.*,
+ERROR,.*FLEXlm error:.*,
+ERROR,.*(ABLD|BLDMAKE)\s*ERROR:.*,
+ERROR,.*FATAL ERROR\(S\):.*,
+ERROR,.*fatal error C1001: INTERNAL COMPILER ERROR.*,
+ERROR,.*fatal error U1077.*,
+ERROR,^fatal error.*,
+ERROR,.*warning U4010.*,
+ERROR,make(?:\.exe)?\s*(?:\[\d+\])\s*?\:\s*\*\*\*.*,
+ERROR,make(?:\.exe)(?:\[\d+\])?\:.*\s+not\s+remade.*,
+ERROR,make(?:\.exe)\s*:\s*\*\*\*.*\s*[Nn]o rule.*,
+ERROR,"\""(?:.*)\"" , line (\d+): (Error: +(.\d+.*?):.*)",
+ERROR,error: ((Internal fault):.*)$,
+ERROR,.*Exception: STATUS_ACCESS_VIOLATION.*,
+ERROR,.*target .* given more than once in the same rule.*,
+ERROR,ERROR:.*,
+ERROR,Error:.*,
+ERROR,ERROR\t.*,
+ERROR,^.*\s*elf2e32\s*:\s*Error\s*:\s*,
+ERROR,.*[Nn]o such file or directory\s*.*,
+ERROR,Exception: [A-Z0-9_]+.*,
+ERROR,.*target .* given more than once in the same rule.*,
+ERROR,ERROR EC\d+:.*,
+ERROR,Errors caused tool to abort..*,
+ERROR,ERROR\t.*,
+ERROR,.*Traceback \(most recent call last\).*,
+ERROR,Application encountered an unexpected error\.\s*Stopping\.\s*,
+ERROR,Unable to write dump file .+,
+ERROR,Unable to connect to CM: .*,
+ERROR,.*: Incorrect slash in .*,
+ERROR,.*: Incorrect case for epoc32 tree in .*,
+ERROR,.*: Incorrect case versus exclusion list in .*,
+ERROR,The system cannot find the path specified.*,
+CRITICAL,.*[Ww]arning:?\s+(#111-D|#1166-D|#117-D|#128-D|#1293-D|#1441-D|#170-D|#174-D|#175-D|#185-D|#186-D|#223-D|#231-D|#257-D|#284-D|#368-D|#414-D|#430-D|#47-D|#514-D|#546-D|#68-D|#69-D|#830-D|#940-D|#836-D|A1495E|L6318W|C2874W|C4127|C4355|C4530|C4702|C4786|LNK4049).*,
+WARNING,(\d+\))?\s.*WARNING:.*,
+WARNING,(BLDMAKE |MAKEDEF )?WARNING:.*,
+WARNING,.*\(\d+\) : warning C.*,
+WARNING,.*\d+: warning:.*,
+WARNING,.*Usage Warning:.*,
+WARNING,.*mwld.exe:.*,
+WARNING,Command line warning.*,
+WARNING,.*ERROR: bad relocation:.*,
+WARNING,(\d+) warning.*,
+WARNING,.*EventType:\s+Error\s+Source:\s+SweepNT.*,
+WARNING,WARN\t.*,
+WARNING,.*LINK : warning.*,
+WARNING,.*\s*elf2e32\s*:\s*Warning\s*:\s*,
+WARNING,Warning:.*,
+REMARK,"\"".*\""\, line \d+: Warning: +(.\d+.*?):.*",
+REMARK,.*Command line warning D4025 : .*,
+REMARK,REMARK: .*,
+REMARK,EventType:\s+Error\s+Source:\s+GNU\s+Make.*,
+REMARK,".*:\d+: warning: cannot find matching deallocation function.*",
+REMARK,(:\d+)*: note: .*,
+INFO,INFO:.*,
+WARNING,"line \d+: Warning:'\, r':\s+warning\s+\w+:.*",
+WARNING,"\""(.*)\""\, line (\d+): (Warning: +(?!A1495E)(.\d+.*?):.*)",
+WARNING,Warning\s*:\s*.*,
+ERROR,.*Error\s*:\s*.*,
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/unit_suite/data/html_filter/style/filter_html.css Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,35 @@
+body
+{
+ font-family: monospace;
+}
+
+pre { background: #cccccc; }
+
+table
+{
+ width: 100%;
+ border: 1px solid black;
+}
+
+th.numbers
+{
+ width: 10%;
+}
+
+td
+{
+ text-align: center;
+}
+
+td.name
+{
+ text-align: left;
+}
+td.time { background: #80ff80; }
+td.ok { background: #80ff80; }
+td.error { background: #ff8080; }
+td.critical { background: #ffc080; }
+td.warning { background: #ffff80; }
+td.remark { background: #8080ff; }
+td.missing { background: #c0c0c0; }
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/test/unit_suite/filter_html_unit.py Mon Oct 18 10:23:52 2010 +0100
@@ -0,0 +1,88 @@
+
+# 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 the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+'''
+Test the HTML class in plugins/filter_html.py
+'''
+
+import os
+import shutil
+import sys
+import unittest
+
+test_data = os.path.join(os.getcwd(),"unit_suite","data","html_filter")
+
+# add the plugins directory to the python path
+sys.path.append(os.path.join(os.environ['SBS_HOME'], "python", "plugins"))
+# so that we can import the filter module directly
+import filter_html
+import generic_path
+
+class Mock(object):
+ '''empty object for attaching arbitrary attributes and functions.'''
+ pass
+
+class TestFilterHtml(unittest.TestCase):
+ '''test cases for the HTML log filter.
+
+ This is a minimal set of tests for starters. As people start using this
+ filter and reporting bugs and niggles we can add test cases here to
+ avoid regressions.'''
+
+ def setUp(self):
+ self.mock_params = Mock()
+ self.mock_params.configPath = [generic_path.Path("config")]
+ self.mock_params.home = generic_path.Path(test_data)
+ self.mock_params.logFileName = generic_path.Path("tmp/foo")
+ self.mock_params.timestring = "now"
+
+ # where do we expect the output to be written
+ self.html_dir = str(self.mock_params.logFileName) + "_html"
+
+ def tearDown(self):
+ '''remove all the generated output files and directories.'''
+ if os.path.isdir(self.html_dir):
+ shutil.rmtree(self.html_dir)
+
+ def testPass(self):
+ '''are the setUp and tearDown methods sane.'''
+ pass
+
+ def testConstructor(self):
+ '''simply construct an HTML object.'''
+ html = filter_html.HTML()
+
+ def testMinimalLog(self):
+ '''process a minimal log file.'''
+ html = filter_html.HTML()
+ self.assertTrue( html.open(self.mock_params) )
+ self.assertTrue( html.write('<?xml version="1.0" encoding="ISO-8859-1" ?>\n') )
+ self.assertTrue( html.write('<buildlog sbs_version="2.99.9 [hi]">') )
+ self.assertTrue( html.write('</buildlog>') )
+ self.assertTrue( html.close() )
+
+ self.assertTrue( os.path.isfile(self.html_dir + "/index.html") )
+ self.assertTrue( os.path.isfile(self.html_dir + "/style.css") )
+
+# run all the tests
+
+from raptor_tests import SmokeTest
+
+def run():
+ t = SmokeTest()
+ t.name = "filter_html_unit"
+
+ tests = unittest.makeSuite(TestFilterHtml)
+ result = unittest.TextTestRunner(verbosity=2).run(tests)
+
+ if result.wasSuccessful():
+ t.result = SmokeTest.PASS
+ else:
+ t.result = SmokeTest.FAIL
+
+ return t
--- a/sbsv2/raptor/test/unit_suite/raptor_unit.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/unit_suite/raptor_unit.py Mon Oct 18 10:23:52 2010 +0100
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
@@ -108,7 +108,8 @@
if len(c.specs) > 0:
# something will be built from this component because
# it has at least one spec
- shortname = str(c.bldinf_filename)[len(os.environ['SBS_HOME'])+1:]
+ sbsHome = os.environ['SBS_HOME'].rstrip('\\/')
+ shortname = str(c.bldinf_filename)[len(sbsHome)+1:]
self.assertTrue(shortname in expected_spec_output)
hits += 1
--- a/sbsv2/raptor/test/unit_suite/raptor_xml_unit.py Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/test/unit_suite/raptor_xml_unit.py Mon Oct 18 10:23:52 2010 +0100
@@ -122,9 +122,9 @@
self.assertTrue(systemModel.IsLayerBuildable("Seventh Layer"))
self.assertTrue(len(self.__logger.errors) == 1)
sbsHome = os.environ["SBS_HOME"]
- sysDefPath = sbsHome + "/test/metadata/system/system_definition_multi_layers.xml"
+ sysDefPath = os.path.join(sbsHome, "test/metadata/system/system_definition_multi_layers.xml")
sysDefPath = sysDefPath.replace("\\","/")
- bldInfPath = sbsHome + "/test/smoke_suite/test_resources/does_not_exist/bld.inf"
+ bldInfPath = os.path.join(sbsHome, "test/smoke_suite/test_resources/does_not_exist/bld.inf")
bldInfPath = bldInfPath.replace("\\","/")
self.assertEquals(self.__logger.errors[0],
("System Definition layer \"Seventh Layer\" from system definition file \"%s\" refers to non existent bld.inf file %s" % (sysDefPath, bldInfPath)))
--- a/sbsv2/raptor/util/Makefile Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/util/Makefile Mon Oct 18 10:23:52 2010 +0100
@@ -1,5 +1,5 @@
-# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+# Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved.
# This component and the accompanying materials are made available
# under the terms of the License "Eclipse Public License v1.0"
@@ -38,7 +38,7 @@
ifneq ($(filter $(HOSTPLATFORM),win),win)
# Some tools not built for windows
# Some of these don't support our special clean mode
- TARGETS:=$(TARGETS) bash make python codewarrior bvcpp gccxml dialog
+ TARGETS:=$(TARGETS) bash make python codewarrior bvcpp dialog
# Build pvm and pvmgmake later when they have been corrected
# pvmgmake pvm
endif
Binary file sbsv2/raptor/util/ext/gccxml.tar.gz has changed
--- a/sbsv2/raptor/util/gccxml.mk Mon Sep 20 10:55:43 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-#
-# Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
-# All rights reserved.
-# This component and the accompanying materials are made available
-# under the terms of the License "Eclipse Public License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description:
-# Utility makefile
-#
-
-GCCXML_TAR:=$(SBS_HOME)/util/ext/gccxml.tar.gz
-
-
-define b_gccxml
-
-.PHONY:: gccxml
-
-all:: gccxml
-
-gccxml: $(INSTALLROOT)/bin/gccxml_cc1plus
-
-$(INSTALLROOT)/bin/gccxml_cc1plus: $(GCCXML_TAR)
- cd $(INSTALLROOT) && \
- tar -xzf $(GCCXML_TAR)
-
-endef
-
-$(eval $(b_gccxml))
-
-
-
-
--- a/sbsv2/raptor/util/python.mk Mon Sep 20 10:55:43 2010 +0100
+++ b/sbsv2/raptor/util/python.mk Mon Oct 18 10:23:52 2010 +0100
@@ -36,7 +36,7 @@
tar -xjf $(PYTHON_TAR) && \
( \
cd $(PYTHON_SOURCEDIR) && \
- CFLAGS="-O3 $(GCCTUNE) -s" ./configure --prefix=$(PYINSTALLROOT) --enable-shared --with-threads && \
+ CFLAGS="-O3 $(GCCTUNE) -s" ./configure --prefix=$(PYINSTALLROOT) --enable-shared --with-threads --enable-bzip2 && \
$(MAKE) -j8 && $(MAKE) install \
)